• Система автоматизации с открытым исходным кодом на базе 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, в области, которую вы не загружаете и что там осталось хоть от прошлого старта, после работы, может совсем не годиться для нового старта (могут иметься указатели на код и данные прошлого приложения, совершенно не имеющие соответствие с вашим приложением). Будете ловить "неопределенности", которые очень сложно диагностировать - то работает, то нет :).
 
Последнее редактирование:
Сверху Снизу