Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Запуск программы из памяти stm32f103c8t6

Пн янв 07, 2019 18:04:05

Камень stm32f103c8t6

Есть некий код по адресу 0x08000A000 и он там есть. Код не сгенерирован кейлом, он просто там лежит. Программа сама его туда предварительно кладёт.
Прошивка пытается его запустить таким образом:

const unsigned char *prog = rom+(24*1024);
typedef int func(void);
func* f = (func*)(prog);
f();

В дебаггере код запускается через BLX R5
В регистре R5 лежит адрес 0x08000A000

И тут в общем-то проблема - срабатывает прерывание MemManage HardFault. Именно на BLX R5, то есть до самого кода даже не хододит.
Долго пытался допереть и всё проверял, пока не наткнулся на инфу об MPU. Но по нему не так много инфы, вроде бы есть геристры, но там только ноли.

Terminal::sendNumber(*((unsigned int*)0xE000ED90), true);
Terminal::sendNumber(*((unsigned int*)0xE000EDA4), true);
Terminal::sendNumber(*((unsigned int*)0xE000ED98), true);
Terminal::sendNumber(*((unsigned int*)0xE000ED9C), true);

Печалька в общем.

Re: Запуск программы из памяти stm32f103c8t6

Пн янв 07, 2019 18:17:01

В дебаггере код запускается через BLX R5
В регистре R5 лежит адрес 0x08000A000

Нулевой бит адреса должен быть 1.

Re: Запуск программы из памяти stm32f103c8t6

Пн янв 07, 2019 18:38:32

Reflector писал(а): Размер шрифта:


Я пробовал этот вариант. PC намертво зависает на адресе команды BLX никуда не переходя, а дебагер не даёт двигаться дальше. То есть это то, как он и должен себя вести? Оу. Возможно это ограничения бесплатной версии... только сейчас об этом подумал. Спасибо, наверное, действительно так.
Ответить