• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Где прочитать о логике реализации старта исполнения программы?

nikolz

Well-known member
Добрый день,
вопрос не совсем по теме,
кто подскажет,
где прочитать (желательно название документа или расскажите своими словами, если такого документа нет)
о логике реализации старта исполнения программы
(т е что программно происходит при сигналеRST) и назначении и взаимодействии (на какой адрес пришли, что сделали, куда ушли)
модулей : clear_eep.bin, esp_init_data_default.bin ,blank.bin и т д ,
до момента начала исполнения программы пользователя.
Спасибо
 

pvvx

Активный участник сообщества
Стартует ROM-BIOS, по вектору reset. Она смотрит на выставленные пины, и в зависимости от их состояния - "притяжек" к питанию или gnd, описанных в Web_Base4\xlam\ESP8266_reg\pin_reg.xlsx и обычно грузится с flash. В flash имеется заголовок и по нему грузятся указанные в нем куски. Обычно это 3 куска: один - код в IRAM и два в разную область RAM: rodata - данные, которые требуют инициализацию в СИ.
При загрузке ROM-BIOS проверяет контрольную сумму этих кусков и если всё хорошо, то далее запускается процедура из заголовка flash - void call_user_start(void) она находится в iram.
Далее открываете Web_Base4\xlam\libs\main\app_main.c и смотрите. Там всё указано. После отработки вызова Cache_Read_Enable(0,0,1) из ROM-BIOS остальная flash становится доступной и не требует загрузки (и не проверяется).
В startup() вызывается user_init() - это уже ваш код. По окончанию инициализации вызывается done_cb(), который вы можете назначить в user_init().
Назначить свой адрес запуска для ROM-BIOS можно изменив ENTRY(call_user_start) в eagle.app.v6.ld, к примеру для того чтобы убить часть сообщений из SDK в UART, путем указания system_set_os_print(0) и последующим запуском call_user_start() или для "импульсного" опроса датчиков с выключением WiFi при просыпании после deep-sleep и дальнейшем засыпании с целью значительного уменьшения потребления за счет времени активности (без исполнения кривого кода инициализации всего SDK). Аналогично это решается заменой загрузчика с заголовком во flash.

PS: Указанные файлы находятся тут. Какие сегменты и что означают - здесь. Код СИ в xlam\libs исходниками не является - это беглый реверс кусков закрытых библиотек из SDK 1.0.x в качестве перевода на СИ.
 
Последнее редактирование:
Сверху Снизу