• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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, что хотите.
 
Сверху Снизу