|
Выполнение функции из RAM, STM32L151 Keil |
|
|
|
Jul 16 2016, 00:40
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Пытаюсь выполнить функцию из RAM. Попадаю в Hardfault. Подскажите, что я делаю неправильно ? STM32L151 Keil Код //////////////////////////// void function(void) { }
////////////////////////// void Execute_Function_From_Ram(void) { unsigned int func_ram_array[0x20]; int i; unsigned char *p1; unsigned char *p2; void (*p_function)(void)=&function; p_function(); ///вызов через указатель ОК //переписываем функцию в RAM p1=(unsigned char*)p_function; p2=(unsigned char*)&func_ram_array[0]; for(i=0;i<(0x20*4);i++) { p2[i]=p1[i]; } //запускаем из RAM p_function=(void*)p2; p_function(); ///тут программа попадает в HardFault }
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Jul 16 2016, 01:43
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата Ну, как минимум нулевой бит в адресе вызываемой функции должен быть установлен в '1'. Да, видел это в примерах. Всё равно не работает. Делал так : Код //запускаем из RAM x=(unsigned int)p2; x|=1; //увеличиваем 0й бит адреса на 1 p_function=(void*)x; p_function(); ///тут программа попадает в HardFault Цитата(x893 @ Jul 16 2016, 04:16)  У них есть пример как это делать. Ключевое слово __ramfunc У меня Keil не понимает __ramfunc. В интернете везде пишут по-разному. Покажите пожалуйста правильный пример.
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Jul 16 2016, 15:45
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(x893 @ Jul 16 2016, 11:41)  прилагаю проект под Keil с тремя функциями из RAM. Запускать можно под симулятором.
ramfunc.rar ( 14.23 килобайт )
Кол-во скачиваний: 85Неужели всё так просто ? Одна настройка в опциях файла, и всё ?! И не нужно вписывать какую-нибудь секцию в Scatter файл, например ? А каким образом под отладкой убедится, что выполняется на самом деле из RAM ?
Эскизы прикрепленных изображений
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Jul 16 2016, 17:09
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(MiklPolikov @ Jul 16 2016, 18:45)  И не нужно вписывать какую-нибудь секцию в Scatter файл, например ? Среда возьмет на себя эту нелегкую задачу. Можете убедиться, заглянув в сгенерированный ею .scat Цитата(MiklPolikov @ Jul 16 2016, 18:45)  А каким образом под отладкой убедится, что выполняется на самом деле из RAM ? Под отладкой посмотреть диапазон адресов, в котором происходит исполнение. А вообще, лучше приучить себя пользоваться map-файлом для прояснения вопроса что и где лежит.
|
|
|
|
|
Jul 17 2016, 08:15
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ Jul 17 2016, 13:17)  Гораздо интереснее вопрос "а каким способом убедиться, что функция не вызывает ничего из того, что расположено не в RAM?"  IAR, когда ему указываешь __ramfunc и, если функция лезет куда-то вне ОЗУ, выдаёт варнинг. А иначе в общем случае - никак, потому что никто не мешает компилятору при оптимизации, вынести часть функции в отдельную функцию (так как в соседней функции есть подобный участок). И компилятор активно использует константы, адресумые через PC, располагая их рядом с телом функции, а может быть и не рядом. Так что пользоваться надо штатными средствами, а не городить колхоз.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|