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

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

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

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

/Кану __

Ответ 1

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

Здесь ваш код запущен. Как правило, CPU остается в состоянии прерывания (зависит от платформы).

Ответ 2

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

Для супер простого процессора s, нет истинного кода запуска. CPU получает питание, а затем запускает первую инструкцию в своей памяти: no muss no huss.

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

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

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

Ответ 3

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

Ответ 4

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

  • Отключает все прерывания
  • Копирует любые инициализированные данные с ПЗУ в ОЗУ
  • Неинициализированная область данных установлена ​​в ноль.
  • Выделяет пространство для и инициализирует стек
  • Инициализирует указатель стека процессоров
  • Создает и инициализирует кучу
  • Выполняет конструкторы и инициализаторы для всех глобальных переменных (только С++)
  • Включает прерывания
  • Вызов основной

Ответ 5

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