Поток кода запуска во встроенной системе, концепция загрузчика? - PullRequest
10 голосов
/ 03 августа 2010

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

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

Ответы [ 5 ]

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

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

3 голосов
/ 03 августа 2010

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

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

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

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

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

1 голос
/ 09 июня 2015

Функции кода запуска для C / C ++

  1. Отключает все прерывания
  2. Копирует любые инициализированные данные из ПЗУ в ОЗУ
  3. Неинициализированобласть данных установлена ​​на ноль.
  4. Выделяет пространство и инициализирует стек
  5. Инициализирует указатель стека процессора
  6. Создает и инициализирует кучу
  7. Выполняетконструкторы и инициализаторы для всех глобальных переменных (только C ++)
  8. Включает прерывания
  9. Вызывает main
1 голос
/ 03 августа 2010

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

0 голосов
/ 03 августа 2010

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

...