Ввод голых металлических кросс-компиляторов - PullRequest
3 голосов
/ 13 сентября 2009

Каковы входные ограничения кросс-компилятора с нуля ... как он не компилирует программы с указателями или mallocs ...... или что-нибудь, что потребует больше, чем базовое оборудование ... и как можно ли найти эти ограничения ..

Я также хотел спросить ... Я создал кросс-компилятор для целевых mips .. Мне нужно создать исполняемый файл mips, используя этот кросс-компилятор ... но я не могу найти, где находится исполняемый файл ... как там есть 1 исполняемый файл, который я нашел mipsel-linux-cpp, который должен скомпилировать, собрать и связать, а затем создать a.out, но это не так ...

Однако ./cc1 дает сборку mips .......

Существует папка установки, в которой есть исполняемый файл gcc, который использует сборку i386, а затем дает exe ... Я не понимаю, как gcc exe может дать сборку i386, а не mips, если я указал цель как mips ....

пожалуйста, помогите мне действительно не в состоянии понять, что такое счастье ...

Я следовал за следующими шагами .. 1. Установленные binutils 2.19 2. настроил gcc для mips .. (g ++, core)

Ответы [ 2 ]

3 голосов
/ 14 сентября 2009

Я бы посоветовал вам начать два отдельных вопроса.

У цепочки инструментов GNU нет никаких зависимостей от ОС, но у библиотеки GNU есть. Большинство кросс-сборок GCC с голым железом используют библиотеку Newlib C, которая предоставляет набор заглушек syscall , которые вы должны сопоставить своей цели самостоятельно. Эти заглушки включают низкоуровневые вызовы, необходимые для реализации потокового ввода-вывода и управления кучей. Они могут быть очень простыми или очень сложными в зависимости от ваших потребностей. Если единственной поддержкой ввода / вывода является UART для stdin / stdout / stderr, то это просто. Вам не нужно реализовывать все, но если вы не реализуете заглушки ввода / вывода, вы не сможете, например, использовать printf (). Вы должны реализовать системный вызов sbrk () / sbrk_r (), если хотите, чтобы malloc () работала.

Библиотека GNU C ++ будет корректно работать с Newlib в качестве базовой библиотеки. Если вы используете C ++, запуск среды выполнения C (обычно crt0.s) должен включать цикл статического инициализатора, чтобы вызывать конструкторы любых статических объектов, которые может включать ваш код. Запуск во время выполнения должен, конечно, также инициализировать процессор, часы, контроллер SDRAM, таймеры, MMU и т. Д .; это ваша ответственность, а не ответственность компилятора.

У меня нет опыта в отношении целей MIPS, но принципы одинаковы для всех процессоров, есть очень полезная статья под названием "Создание Bare Metal ARM с GNU" , которая может оказаться полезной для многих это будет актуально - особенно портирование частей, касающихся реализации заглушек Newlib.

Что касается вашего другого вопроса, если ваш компилятор называется mipsel-linux-cpp, то это не сборка «голый металл», а сборка Linux. Также этот исполняемый файл на самом деле не «компилирует, собирает и связывает», это скорее драйвер, который отдельно вызывает препроцессор, компилятор, ассемблер и компоновщик. Он должен быть настроен правильно, чтобы вызывать кросс-инструменты, а не инструменты хоста. Обычно я вызываю компоновщик отдельно, чтобы обеспечить принятие решения о том, какую стандартную библиотеку связать (-nostdlib), а также потому, что это имеет больше смысла, когда приложение состоит из нескольких исполнительных блоков. Здесь я не могу предложить большую помощь, кроме этой, поскольку я всегда использовал инструменты GNU-ARM, созданные людьми с явно большим терпением, чем я, и, кроме того, размещенные в Windows, где существует меньшая вероятность вызова цепочки инструментов хоста (один причина, по которой я также избегал тех цепочек инструментов, которые используют Cygwin)

1 голос
/ 13 сентября 2009

EDIT Имея больше времени, я переписал свой первоначальный ответ, пытаясь предложить что-то более полезное.

Я не могу дать конкретный ответ на ваш вопрос. Я никогда не пытался заставить код работать на машине MIPS. То, что у меня есть, - это большой опыт работы с различными "голыми металлическими" досками. Все виды процессоров и всевозможные компиляторы и кросс-компиляторы. Таким образом, у меня есть понимание принципов, которые применяются во всех таких ситуациях. Я укажу на тот вид знаний, который вам нужно будет усвоить, прежде чем вы сможете надеяться добиться успеха с такой работой, и, надеюсь, я смогу перечислить некоторые ссылки на ресурсы, которые помогут вам начать изучение этих знаний.

Я обеспокоен тем, что вы не знаете, что указатели точно - это то, с чем может справиться компилятор с открытым исходным кодом, они являются базовыми примитивами машины. Это говорит о том, что вы, вероятно, не являетесь экспертом по встроенным разработчикам, который просто застрял в этом конкретном сценарии. Не берите в голову. В программировании встроенной системы нет ничего волшебного, и вы можете узнать, что вам нужно знать.

Первым шагом становится понимание отношений между C и машиной, на которой вы хотите запустить код. В основном C является переносимым языком ассемблера. Это означает, что C хорош для манипулирования основными операциями машины. В этом смысле основными операциями машины являются чтение и запись областей памяти, выполнение арифметических и логических операций над данными, считанными из памяти, и принятие решений о ветвлении и циклировании на основе этих данных. В частности, концепция указателей С позволяет вам манипулировать данными в указанных вами местах памяти.

Пока все хорошо, но просто выполнять необработанные вычисления в памяти обычно недостаточно - вам нужен способ ввода и вывода данных из памяти. Для этого вам нужно манипулировать аппаратными периферийными устройствами на вашей плате. Если аппаратные периферийные устройства имеют отображение памяти , то регистры машины, используемые для управления периферийными устройствами, выглядят точно так же, как области памяти, и C может напрямую ими манипулировать. Даже в этом случае, однако, гораздо более вероятно, что выполнение полезного ввода-вывода лучше всего обрабатывать, расширяя основной язык C библиотекой подпрограмм, предоставленных только для этой цели. Эти библиотечные процедуры обрабатывают все неприятные детали (таймеры, прерывания, ввод-вывод с отображением без памяти), связанные с манипулированием периферийным оборудованием на плате, и заключают их в удобный интерфейс вызова функций C. Идея в том, что вы можете пойти просто printf ("Привет, мир"); и библиотечный вызов позаботится о деталях отображения строки.

Разработчик с соответствующей квалификацией знает, как адаптировать существующую библиотеку ввода-вывода к новой плате или как разработать новые подпрограммы библиотеки для обеспечения доступа к нестандартному пользовательскому оборудованию. Классический способ развить эти навыки - начать с чего-то простого, обычно со светодиода для устройства вывода и переключателя для устройства ввода. Напишите программу, которая генерирует светодиоды предсказуемым образом или считывает данные с переключателя и отображает светодиоды. Первый раз, когда вы получите эту работу, будет очень приятно.

Хорошо, я достаточно прогулял. Пришло время предоставить вам больше ресурсов для изучения. Хорошей новостью является то, что никогда не было лучшего времени, чтобы узнать, как все работает на интерфейсе между аппаратным и программным обеспечением. Существует множество свободно доступных кода и документов. Stackoverflow - отличный ресурс, как вы знаете. Удачи! Ссылки следуют;

Обзор встроенных систем

Знание языка Си имеет фундаментальное значение

Почему бы не заставить свой код работать на симуляторе до того, как вы попробуете реальное оборудование

Другая эмулируемая среда

Драйверы устройств Linux - пересекающаяся тема

Еще одна книга о программировании на голом металле

...