Vichkins 0 5 июля, 2019 Опубликовано 5 июля, 2019 · Жалоба Есть задача писать функции, которые выполняют некие задачи, отдельно от основной прошивки устройства, компилировать и заливать в устройство, дабы оно их исполняло. По сути скрипты, только на си. Пробую на STM32H743. Функции компилил в Keil, без scatterа, просто указал адреса RO RW, в которые по итогу копирую скомпиленый бинарник. После копирования вызываю функцию: PROG = (pFunc_main) 0x30000041; initAddr = PROG(); По шагам дебаггер шагать не желает, после вызова вылетает не туда откуда была вызвана, а в какой-то кeсjк кода во флеше и исполняется оттуда далее. Возможно ли сделать, чтобы эта функция возвращалась туда, откуда была вызвана ? .text PROG_1 0x30000000: 4811 .H LDR r0,[pc,#68] ; [0x30000048] = 0x30020004 0x30000002: 6800 .h LDR r0,[r0,#0] 0x30000004: 1c80 .. ADDS r0,r0,#2 0x30000006: 4910 .I LDR r1,[pc,#64] ; [0x30000048] = 0x30020004 0x30000008: 6008 .` STR r0,[r1,#0] 0x3000000a: 4608 .F MOV r0,r1 0x3000000c: 6800 .h LDR r0,[r0,#0] 0x3000000e: 4770 pG BX lr PROG_0 0x30000010: 480e .H LDR r0,[pc,#56] ; [0x3000004c] = 0x30020000 0x30000012: 6800 .h LDR r0,[r0,#0] 0x30000014: 1c40 @. ADDS r0,r0,#1 0x30000016: 490d .I LDR r1,[pc,#52] ; [0x3000004c] = 0x30020000 0x30000018: 6008 .` STR r0,[r1,#0] 0x3000001a: 4608 .F MOV r0,r1 0x3000001c: 6800 .h LDR r0,[r0,#0] 0x3000001e: 4770 pG BX lr init 0x30000020: 4601 .F MOV r1,r0 0x30000022: 2000 . MOVS r0,#0 0x30000024: 4a09 .J LDR r2,[pc,#36] ; [0x3000004c] = 0x30020000 0x30000026: 6010 .` STR r0,[r2,#0] 0x30000028: 4a07 .J LDR r2,[pc,#28] ; [0x30000048] = 0x30020004 0x3000002a: 6010 .` STR r0,[r2,#0] 0x3000002c: f2af001f .... ADR r0,{pc}-0x1b ; 0x30000011 0x30000030: 6008 .` STR r0,[r1,#0] 0x30000032: 1d09 .. ADDS r1,r1,#4 0x30000034: f2af0037 ..7. ADR r0,{pc}-0x33 ; 0x30000001 0x30000038: 6008 .` STR r0,[r1,#0] 0x3000003a: 1d09 .. ADDS r1,r1,#4 0x3000003c: 2000 . MOVS r0,#0 0x3000003e: 4770 pG BX lr Reset_Handler 0x30000040: f2af0023 ..#. ADR r0,{pc}-0x1f ; 0x30000021 0x30000044: 4770 pG BX lr $d 0x30000046: 0000 .. DCW 0 0x30000048: 30020004 ...0 DCD 805437444 0x3000004c: 30020000 ...0 DCD 805437440 int Reset_Handler(void) { return (unsigned int)init; } int init(unsigned int* tablePtr) { i = 0; k = 0; *tablePtr = (unsigned int)PROG_0; tablePtr++; *tablePtr = (unsigned int)PROG_1; tablePtr++; return 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 6 июля, 2019 Опубликовано 6 июля, 2019 · Жалоба посмотри вот это http://we.easyelectronics.ru/STM32/stm32-i-dzen-kompilyaciya-i-zapusk-otdelnyh-programm.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vichkins 0 6 июля, 2019 Опубликовано 6 июля, 2019 · Жалоба Спасибо, но ничего нового там не увидел. Зато нашёл интересный баг, если можно так назвать, подпрограммы исполняются из региона 0x20000000 на ура, а из любого другого либо Hard fault, либо возврат непойми куда. Курю мануал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 6 июля, 2019 Опубликовано 6 июля, 2019 · Жалоба 26 minutes ago, Vichkins said: Зато нашёл интересный баг, если можно так назвать, Обратите внимание на атрибут XN (Execute Never) у регионов памяти. Попытка выполнить код программы из региона с таким атрибутом приведёт к Hard Fault. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 63 6 июля, 2019 Опубликовано 6 июля, 2019 · Жалоба 28 минут назад, Vichkins сказал: Спасибо, но ничего нового там не увидел. Зато нашёл интересный баг, если можно так назвать, подпрограммы исполняются из региона 0x20000000 на ура, а из любого другого либо Hard fault, либо возврат непойми куда. Курю мануал. или в Data Sheet или в Reference Manual написано из каких регионов памяти ядро может исполнять программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vichkins 0 6 июля, 2019 Опубликовано 6 июля, 2019 · Жалоба Дык в том то и дело, может исполнять из всех регионов кроме SDRAM, чёрным по белому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 6 июля, 2019 Опубликовано 6 июля, 2019 · Жалоба 7 минут назад, Vichkins сказал: Дык в том то и дело, может исполнять из всех регионов кроме SDRAM, чёрным по белому. Запрограммируйте MPU и пропишите нужные атрибуты регионам памяти явно. При выключенном MPU у регионов могут быть атрибуты по умолчанию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться