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

Загрузка в RAM

Seeker

New member
Хотел бы задать вопрос как это сделать, но решил попробовать сам и вот что вышло.
Код:
Псевдокод:
JLINKARM_Reset();
JLINKARM_WriteMem(0x10006000, 0x44540, Image2FromInfo);
JLINKARM_WriteU32(0x40000210, адрес_старта);
JLINKARM_Go();
Где адрес старта:
0x20011117 - Wakeup?
0x08011117 - "PathFunc1"
0x04011117 - "PathFunc2" вдобавок насыпет мусора
адреса позаимствованы с флешера на delphi
CSS:
===== Enter Image 1.5 ====


Img2 Sign: RTKWin, InfaStart @ 0x10006069


===== Enter Image 2 ====

Ok, rabotaet.
Писать в R13 ещё не пробовал.
 

Вложения

pvvx

Активный участник сообщества
Где адрес старта:
0x20011117 - Wakeup?
0x08011117 - "PathFunc1"
0x04011117 - "PathFunc2" вдобавок насыпет мусора
Нет. См.
RTL8710AF - загрузчик в ROM-BIOS
RTL871x BootLoader
RTL871x Flash Memory Map
RTL871x ROM-BIOS
:)
Т.е. всё немного сложнее.
Правильнее OR флаг с тем регистром.
Возможные беды - неправильная калибровка SPIC в коде загрузчика, т.к. неправильная таблица в 9-ом секторе flash для SPIC. SDK не стартанет, повиснет на Spic функциях при обращении.
Ещё много всяких мелочей.
Например: после Reset SDRAM в RTL8711AM отключена и загрузить туда чего-то не представляется возможным, до инициализации SDRAM контроллера.

Область от 0x10000000 до 0x1000b000 должна быть обязательно проинициализирована специальными значениями. Это необходимо для функций SDK, обращающихся к ROM. Если таковых нет, то необязательно. Но например для того-же rtl_printf() это необходимо. Будет частично то работать, то виснуть - зависит от того, что осталось в памяти от прошлого полного запуска с flash.
Флешер не показатель - он писался по мере изучения и не исправлялся на правильные значения "на все случаи жизни" для всех вариантов RTL.
В флешере применен код от rebane, использующий область системных переменных ROM-BIOS и портящих их.
А так примерно в том направлении... :)
Правильный стартовый загрузчик/инициализатор SDK ещё не сделан. Пока нет времени на его доделку.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Boot-Loader дописан и для jlink.exe теперь примерно так:
Код:
r0
trst0
r1
trst1
h
r
loadbin build/bin/ram_1.r.bin 0x10000bc8
loadbin build/bin/ram_2.bin 0x10006000
r
w4 0x40000210,0x20111113
g
q
 

Seeker

New member
Тот способ загрузки программы в МК сразу в RAM работает стабильно, предположительно потому что модуль инициализируется при включении прошивкой сохраненной на нем. Однако я не до конца в этом уверен, wifi не трогал, а отладку не осилил.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Тот способ загрузки программы в МК сразу в RAM работает стабильно, предположительно потому что модуль инициализируется при включении прошивкой сохраненной на нем. Однако я не до конца в этом уверен, wifi не трогал, а отладку не осилил.
При загрузке в RAM, если посмотрите на скрипт, то увидите, что стоит физический сброс чипа - [inline]r0[/inline] [inline]r1[/inline]. После него устройства чипа находятся в определенном состоянии.
Далее ставится бит загрузки в RAM в регистр, в позицию, которая никуда аппаратно не подключена, а служит для программного выбора кода в ROM какую ветку загружать, заполняется RAM и пересбрасывается только CPU. Он стартует с нуля и прет по ветке загрузки из RAM, а поля данных для процедур ROM-BIOS уже загружены совместно с кодом boot-loader-а.
"Предположительного" там ничего нет.
"Предположительно" что запуститься верно только в вашем случае, т.к. поля ROM-BIOS в RAM у вас не инициализированы. Их инициализации вообще нет в ROM. Они инициализируются ТОЛЬКО boot-loader-ом, который у вас не загружается. В итоге будет или нет работать приложение уже не известно. К примеру, если оно обратиться к функциям библиотек СИ, находящихся в ROM (rtl_printf и т.д.), то будет зависончик :)
У многих функций ROM сделаны внешние структуры для связи с приложением и их инициализацией должен кто-то заниматься по старту. Иначе нельзя обращаться к процедурам в ROM. Они находятся по абсолютным адресам в RAM, в области, которую вы не загружаете и что там осталось хоть от прошлого старта, после работы, может совсем не годиться для нового старта (могут иметься указатели на код и данные прошлого приложения, совершенно не имеющие соответствие с вашим приложением). Будете ловить "неопределенности", которые очень сложно диагностировать - то работает, то нет :).
 
Последнее редактирование:
Сверху Снизу