• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Почему call_user_start находится в irom вместо iram? (Crash)

r44083

Member
Я заметил, что в ESP8266_RTOS_SDK v3.1, entry функция call_user_start распологается в irom вместо iram.

Моё приложение крешает при попытке перехода на call_user_start на буте (скорее всего потому что на буте нельзя обращаться к irom до инициализации SPI flash).

Я не использую 2nd bootloader, и моё приложение начинается с 0x40200000:
Код:
irom0_0_seg  :    org = 0x40200000, len = 2M
Вот стартовый лог:
Код:
 ets Jan  8 2013,rst cause:2, boot mode:(3,6)
load 0x40100000, len 20480, room 16
tail 0
chksum 0x2b
load 0x3ffe8000, len 1340, room 8
tail 4
chksum 0x1c
load 0x3ffe853c, len 216, room 4
tail 4
chksum 0x9d
csum 0x9d
Fatal exception (0):
epc1=0x40218780, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
Fatal exception (0):
epc1=0x40218780, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
Fatal exception (0):
epc1=0x40218780, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
0x40218780 это call_user_start согласно map файлу:
Код:
 .text.call_user_start
                0x40218768       0xfb out/obj/src/hal/ESP8266/ESP8266_RTOS_SDK/components\esp8266\source\startup.o
                                0x113 (size before relaxing)
                0x40218780                call_user_start
 *fill*         0x40218863        0x1
Если я добавляю IRAM_ATTR перед определением call_user_start, то креша больше нет, call_user_start выполняется, chip_boot также выполняется и инициализирует SPI flash, я получаю следующий лог при буте (но программа всё равно не работает, хотя судя по коду,
app_main вызывается):
Код:
 ets Jan  8 2013,rst cause:2, boot mode:(3,7)
load 0x40100000, len 20752, room 16
tail 0
chksum 0x0f
load 0x3ffe8000, len 1340, room 8
tail 4
chksum 0x35
load 0x3ffe853c, len 216, room 4
tail 4
chksum 0xb4
csum 0xb4
0x40100304 это call_user_start согласно map файлу:
Код:
 .iram1         0x401002d4      0x113 out/obj/src/hal/ESP8266/ESP8266_RTOS_SDK/components\esp8266\source\startup.o
                0x40100304                call_user_start
 *fill*         0x401003e7        0x1
Ниже прикреплены elf, map и bin файлы.

P.S: так как я не использую 2nd bootloader, я не дефайнил CONFIG_BOOTLOADER_INIT_SPI_FLASH чтобы приложение само при старте проинициализировало SPI flash.

Почему call_user_start положили в irom вместо iram?
Почему программа может не работать, даже если call_user_start выполняется на буте?
 

Вложения

nikolz

Well-known member
Я заметил, что в ESP8266_RTOS_SDK v3.1, entry функция call_user_start распологается в irom вместо iram.
вы не написали на чем пишите чем собираете и как проверяете.
И главное не спросили:
Почему у других (например меня) все работает А у Вас нет.
 

r44083

Member
Пишу на С++ (для теста там буквально пару файлов). Собираю тулчейном, который указан в README.md в ESP8266_RTOS_SDK. Собираю SDK как часть другого фреймворка с помощью своей билд системы (модульный make).

Ссылка на собранный тестовый проектик (для сборки выполните make clean, make):
(билд лог лежит там же в папке out)
omef-esp8266.zip

Проверяю что call_user_start вызвалась, тем, что в ней пытаюсь вызвать printf до инициализации флеша. В креш логе получаю адрес функции и смотрю что это адрес printf.

Спрашивать почему у вас всё работает, а у меня нет, не имеет смысла, так как могут быть сотни причин. Я спрашиваю конкретный вопрос, который возможно поможет делу.
Но если вы сможете ответить почему у меня не работает - буду очень благодарен.
(так как я хочу интегрировать SDK в другой фреймворк, то использовать родную билд систему от espressif - не вариант).
 

nikolz

Well-known member
Пишу на С++ (для теста там буквально пару файлов). Собираю тулчейном, который указан в README.md в ESP8266_RTOS_SDK. Собираю SDK как часть другого фреймворка с помощью своей билд системы (модульный make).

Ссылка на собранный тестовый проектик (для сборки выполните make clean, make):
(билд лог лежит там же в папке out)
omef-esp8266.zip

Проверяю что call_user_start вызвалась, тем, что в ней пытаюсь вызвать printf до инициализации флеша. В креш логе получаю адрес функции и смотрю что это адрес printf.

Спрашивать почему у вас всё работает, а у меня нет, не имеет смысла, так как могут быть сотни причин. Я спрашиваю конкретный вопрос, который возможно поможет делу.
Но если вы сможете ответить почему у меня не работает - буду очень благодарен.
(так как я хочу интегрировать SDK в другой фреймворк, то использовать родную билд систему от espressif - не вариант).
Просто Ваш вопрос надо задавать разработчикам Xtensa в Канаде (даже не в Китае) а не на этом форуме.
Зачем вы полезли в распределение адресного пространства?
Что Вы там потеряли?
Чтобы у Вас все работало как и у меня могу посоветовать следующее.
поставьте UDK либо соберите свое на Eclipse или возьмите IDE от разработчиков.
там есть мульон примеров на все случаи жизни и соберите любой из них. потом изучите их а заодно и файлы ld.
В файлы ld незачем лазить (пока)
Если хотите узнать что и куда помещается и зачем ,
то рекомендую почитать документацию на сайте разработчикам ESP8266 (Китай).
 

r44083

Member
Я специально создал тему в разделе SDK, зачем вы мне советуете UDK?
Уже прошло очень много времени и между устаревшим UDK и SDK 3.1 огромная разница.

Разработчики Xtensa не имеют отношения к call_user_start()

Я полез в распределение адресного пространства что бы не использовать второй бутлоадер, так как он мне не нужен, мне нужно что бы моё приложение начиналось с начала памяти.

Зачем вы мне советуете Eclipse и другие IDE? Я же просто спросил про функцию.
Примеры из устаревшего UDK меня не интерисуют.

Вообщем информации ноль.
 

nikolz

Well-known member
Я специально создал тему в разделе SDK, зачем вы мне советуете UDK?
Уже прошло очень много времени и между устаревшим UDK и SDK 3.1 огромная разница.

Я полез в распределение адресного пространства что бы не использовать второй бутлоадер, так как он мне не нужен, мне нужно что бы моё приложение начиналось с начала памяти.

Зачем вы мне советуете Eclipse и другие IDE? Примеры из устаревшего UDK меня не интерисуют.

Вообщем информации ноль.
если не знаете то не надо выпендриваться.
UDK - это IDE собранный для ESP на eclipse.
Для справки - на Eclipse у меня собрано и для ESP и для RTL и для RDA и для AVR и для STM.
И именно от SDK зависит для чего конкретно работаем.
Вы на чем вообще-то собираете, если не знаете чем отличается Eclipse от SDK (это как сравнивать кислое и зеленое)
 

r44083

Member
UDK сделан на базе SDK 2.0 (2016 год).
Текущая версия SDK - 3.1 (2019).

На чём собираю - ответил в третьем сообщении.

Пожалуйста, пишите по делу.
 

nikolz

Well-known member
UDK сделан на базе SDK 2.0 (2016 год).
Текущая версия SDK - 3.1 (2019).

На чём собираю - ответил в третьем сообщении.

Пожалуйста, пишите по делу.
если все знаете то поставить в UDK SDK3.1 Не проблема. (я обновляю до последней версии всегда сам)
теперь по вашему делу.
Читать вам ликбез на тему как организована архитектура процессоров XTENSA никто не будет.
читайте в интете все рассказано. Для понимания этого нужен определенный минимум знаний.
--------------
Хотите освоить ESP ?
Задавайте конкретные вопросы (а не почему "слон не летает")
и делайте как вам рекомендуют. Шаг за шагом и придет понимание -почему
В остальном ваша воля и желание.
 
UDK сделан на базе SDK 2.0 (2016 год).
Текущая версия SDK - 3.1 (2019).

На чём собираю - ответил в третьем сообщении.

Пожалуйста, пишите по делу.
UDK - это собранный под Windows компилятор, он работает с любым SDK, и 2.х и 3.x (правда, почему-то под 3.х у меня не все программы, работающие с 2.2 работают, поэтому я продолжаю SDK2.2 пользоваться). В самом SDK нет компилятора (и, тем более IDE), так что у вас какая-то путаница в понятиях. Просто указываете в makefile проекта
SDK_BASE = c:/Espressif/ESP8266_NONOS_SDK-V2.2.0
и все, компилируйте с тем SDK, что хотите.
 
Сверху Снизу