Поток кода запуска во встроенной системе, концепция загрузчика?
Я работаю со встроенной платой, но я не знаю потока кода запуска (C/assembly) того же самого.
Можем ли мы обсудить общие модули/шаги, на которые воздействует действие запуска в случае встроенной системы.
Достаточно высокого уровня обзора (алгоритмического). Все примеры приветствуются.
/Кану __
Ответы
Ответ 1
- CPU получает питание от reset и переходит к определенной точке: вектор reset, начало вспышки, ПЗУ и т.д.
- Запускается код запуска (время выполнения crt - C). Это важный фрагмент кода, созданный вашим компилятором /libc, который выполняет:
- Настроить и включить любую внешнюю память (если это абсолютно необходимо, в противном случае - для последующего кода пользователя).
- Установить указатель стека
- Очистить сегмент .bss(обычно).
.bss
- это имя неинициализированной (или обнуленной) глобальной области памяти. Здесь находятся глобальные переменные, массивы и т.д., Которые не имеют значения инициализации (за пределами 0). Общая практика на микроконтроллере состоит в том, чтобы зацикливать эту область и установить все байты в 0 при запуске.
- Скопировать с конца .text неконстантные .data. Поскольку большинство микроконтроллеров запускаются со вспышки, они не могут хранить там переменные данные. Для таких операторов, как
int thisGlobal = 5;
, значение thisGlobal
должно быть скопировано из постоянной области (обычно после того, как программа во флэш-памяти, сгенерированная вашим компоновщиком) в ОЗУ. Это относится к статическим значениям и статическим значениям в функциях. Значения, оставшиеся undefined, не копируются, а очищаются как часть шага 2.
- Выполните другие статические инициализаторы.
- Вызов
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 с помощью шлюза, а затем мигают.