Перейти к содержанию
    

Запуск отдельно скомпилированого кода

Есть задача писать функции, которые выполняют некие задачи, отдельно от основной прошивки устройства, компилировать и заливать в устройство, дабы оно их исполняло. По сути скрипты, только на си.

Пробую на 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;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, но ничего нового там не увидел. Зато нашёл интересный баг, если можно так назвать, подпрограммы исполняются из региона 0x20000000 на ура, а из любого другого либо Hard fault, либо возврат непойми куда. Курю мануал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 minutes ago, Vichkins said:

Зато нашёл интересный баг, если можно так назвать,

Обратите внимание на атрибут XN (Execute Never) у регионов памяти. Попытка выполнить код программы из региона с таким атрибутом приведёт к Hard Fault.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

28 минут назад, Vichkins сказал:

Спасибо, но ничего нового там не увидел. Зато нашёл интересный баг, если можно так назвать, подпрограммы исполняются из региона 0x20000000 на ура, а из любого другого либо Hard fault, либо возврат непойми куда. Курю мануал.

или  в Data Sheet или в Reference Manual написано из каких регионов памяти ядро может исполнять программу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, Vichkins сказал:

Дык в том то и дело, может исполнять из всех регионов кроме SDRAM, чёрным по белому.

Запрограммируйте MPU и пропишите нужные атрибуты регионам памяти явно. При выключенном MPU у регионов могут быть атрибуты по умолчанию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...