Я работаю со встроенной платой, но я не знаю поток кода запуска (C/assembly) того же.
Мы можем обсудить общие модули/шаги, на которые реагирует действие запуска в случае встроенной системы.
Просто (алгоритмический) обзор высокого уровня достаточно. Все примеры приветствуются.
/Kanu __
.bss
- это имя неинициализированной (или обнуленной) области глобальной памяти. Здесь находятся глобальные переменные, массивы и т. Д., У которых нет инициализирующего значения (выше 0). Обычно микроконтроллер проходит по этой области в цикле и при запуске устанавливает для всех байтов значение 0. int thisGlobal = 5;
, значение thisGlobal
должно быть скопировано из постоянной области (обычно после программы во флэш-памяти, сгенерированной вашим компоновщиком) в ОЗУ. Это относится к статическим значениям и статическим значениям в функциях. Значения, которые не определены, не копируются, а вместо этого очищаются как часть шага 2. main ()
Отсюда ваш код запускается. Обычно ЦП остается в состоянии отключения прерывания (зависит от платформы).
Довольно открытый вопрос, но вот несколько вещей, которые я уловил.
Для суперпростых процессоров не существует настоящего стартового кода. Процессор получает питание, а затем начинает выполнять первую инструкцию в своей памяти: никакой суеты.
Чуть дальше у нас есть микроконтроллеры, такие как avr's и pic's. У них очень мало стартового кода. Единственное, что действительно необходимо сделать, это установить таблицу переходов прерываний с соответствующими адресами. После этого все зависит от прикладного кода (единственной программы). Хорошей новостью является то, что вам, как разработчику, обычно не нужно беспокоиться об этих вещах: это то, для чего предназначена libc.
После этого у нас есть такие вещи, как простые микросхемы на базе arm; они сложнее, чем avr'ы и pic'ы, но все равно довольно простые. В них также нужно настроить таблицу прерываний, убедиться, что часы установлены правильно, и запустить все необходимые компоненты на чипе (базовые прерывания и т.д.). Посмотрите этот pdf от Atmel, в нем подробно описана процедура запуска для чипа ARM 7.
Дальше по пищевой цепочке идут полноценные ПК (x86, amd64 и т.д.). Код запуска для них - это BIOS, которые ужасно сложны.
Большой вопрос в том, будет ли ваша встроенная система работать под управлением операционной системы. В общем, вы либо захотите запустить свою операционную систему, либо запустить какую-либо форму инверсии управления (пример, который я помню из школьного проекта, был telnet, который будет прослушивать запросы с использованием RL-ARM или TCP / IP с открытым исходным кодом. стек, а затем у него были обратные вызовы, которые он выполнял при установлении соединений / получении данных), или входил в свой собственный цикл управления (возможно, отображая меню, а затем зацикливался, пока не была нажата клавиша).
Где тогда находится "ЗАГРУЗЧИК ЗАГРУЗКИ"? Его следует поставить перед кодом запуска, верно? Насколько я понимаю, от вектора сброса управление переходит к загрузчику. Там код ожидает в течение небольшого периода времени, в течение которого он ожидает, что данные будут записаны / загружены в контроллер / процессор. Если он не обнаруживает данные, управление передается на следующий шаг, как указано в theatrus. Но я сомневаюсь, можно ли переписать код BOOT LOADER. Например: можно ли изменить загрузчик UART на загрузчик ETHERNET / CAN или данные, отправленные с использованием любого протокола, преобразуются в UART с помощью шлюза, а затем мигают.