Поток Запуска кодирует во встроенной системе, понятии загрузчика?

Я работаю со встроенной платой, но я не знаю поток кода запуска (C/assembly) того же.

Мы можем обсудить общие модули/шаги, на которые реагирует действие запуска в случае встроенной системы.

Просто (алгоритмический) обзор высокого уровня достаточно. Все примеры приветствуются.

/Kanu __

10
задан starblue 3 August 2010 в 11:18
поделиться

4 ответа

  1. CPU получает питание при сбросе и переходит в определенную точку: вектор сброса, начало флэш-памяти, ПЗУ и т. Д.
  2. Запускается код запуска (crt - среда выполнения C) . Это важный фрагмент кода, созданный вашим компилятором / libc, который выполняет:
    1. Настройте и включите любую внешнюю память (если это абсолютно необходимо, в противном случае оставьте для последующего кода пользователя).
    2. Установить указатель стека
    3. Очистить сегмент .bss (обычно). .bss - это имя неинициализированной (или обнуленной) области глобальной памяти. Здесь находятся глобальные переменные, массивы и т. Д., У которых нет инициализирующего значения (выше 0). Обычно микроконтроллер проходит по этой области в цикле и при запуске устанавливает для всех байтов значение 0.
    4. Копировать с конца.текст неконстантные .data. Поскольку большинство микроконтроллеров работают во флеш-памяти, они не могут хранить там переменные данные. Для таких операторов, как int thisGlobal = 5; , значение thisGlobal должно быть скопировано из постоянной области (обычно после программы во флэш-памяти, сгенерированной вашим компоновщиком) в ОЗУ. Это относится к статическим значениям и статическим значениям в функциях. Значения, которые не определены, не копируются, а вместо этого очищаются как часть шага 2.
    5. Выполните другие статические инициализаторы.
    6. Вызов main ()

Отсюда ваш код запускается. Обычно ЦП остается в состоянии отключения прерывания (зависит от платформы).

26
ответ дан 3 December 2019 в 14:52
поделиться

Довольно открытый вопрос, но вот несколько вещей, которые я уловил.

Для суперпростых процессоров не существует настоящего стартового кода. Процессор получает питание, а затем начинает выполнять первую инструкцию в своей памяти: никакой суеты.

Чуть дальше у нас есть микроконтроллеры, такие как avr's и pic's. У них очень мало стартового кода. Единственное, что действительно необходимо сделать, это установить таблицу переходов прерываний с соответствующими адресами. После этого все зависит от прикладного кода (единственной программы). Хорошей новостью является то, что вам, как разработчику, обычно не нужно беспокоиться об этих вещах: это то, для чего предназначена libc.

После этого у нас есть такие вещи, как простые микросхемы на базе arm; они сложнее, чем avr'ы и pic'ы, но все равно довольно простые. В них также нужно настроить таблицу прерываний, убедиться, что часы установлены правильно, и запустить все необходимые компоненты на чипе (базовые прерывания и т.д.). Посмотрите этот pdf от Atmel, в нем подробно описана процедура запуска для чипа ARM 7.

Дальше по пищевой цепочке идут полноценные ПК (x86, amd64 и т.д.). Код запуска для них - это BIOS, которые ужасно сложны.

3
ответ дан 3 December 2019 в 14:52
поделиться

Большой вопрос в том, будет ли ваша встроенная система работать под управлением операционной системы. В общем, вы либо захотите запустить свою операционную систему, либо запустить какую-либо форму инверсии управления (пример, который я помню из школьного проекта, был telnet, который будет прослушивать запросы с использованием RL-ARM или TCP / IP с открытым исходным кодом. стек, а затем у него были обратные вызовы, которые он выполнял при установлении соединений / получении данных), или входил в свой собственный цикл управления (возможно, отображая меню, а затем зацикливался, пока не была нажата клавиша).

1
ответ дан 3 December 2019 в 14:52
поделиться

Где тогда находится "ЗАГРУЗЧИК ЗАГРУЗКИ"? Его следует поставить перед кодом запуска, верно? Насколько я понимаю, от вектора сброса управление переходит к загрузчику. Там код ожидает в течение небольшого периода времени, в течение которого он ожидает, что данные будут записаны / загружены в контроллер / процессор. Если он не обнаруживает данные, управление передается на следующий шаг, как указано в theatrus. Но я сомневаюсь, можно ли переписать код BOOT LOADER. Например: можно ли изменить загрузчик UART на загрузчик ETHERNET / CAN или данные, отправленные с использованием любого протокола, преобразуются в UART с помощью шлюза, а затем мигают.

0
ответ дан 3 December 2019 в 14:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: