реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Выполнение функции из RAM, STM32L151 Keil
MiklPolikov
сообщение Jul 16 2016, 00:40
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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
    
}



--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 16 2016, 01:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(MiklPolikov @ Jul 16 2016, 03:40) *
Подскажите, что я делаю неправильно ?

Ну, как минимум нулевой бит в адресе вызываемой функции должен быть установлен в '1'.
Листинг нужно смотреть. А лучше разместить функцию в RAM штатными средствами.
Go to the top of the page
 
+Quote Post
x893
сообщение Jul 16 2016, 01:16
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



У них есть пример как это делать.
Ключевое слово __ramfunc
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jul 16 2016, 01:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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. В интернете везде пишут по-разному.
Покажите пожалуйста правильный пример.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
x893
сообщение Jul 16 2016, 08:41
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Посыпаю голову пеплом - __ramfunc это в IAR
В качестве компенсации прилагаю проект под Keil с тремя функциями из RAM.
Запускать можно под симулятором.

Прикрепленный файл  ramfunc.rar ( 14.23 килобайт ) Кол-во скачиваний: 85
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 16 2016, 12:13
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(MiklPolikov @ Jul 16 2016, 06:40) *
Подскажите, что я делаю неправильно ?

Нельзя так делать. Как Вы определяете размер функции? А вложенные вызовы функций из копируемой учитываете? А константы, адресуемые через PC, учитываете? А исполнение кода для этого участка ОЗУ в MPU разрешено? ....
Размещать функции в ОЗУ нужно штатными средствами компилятора и компоновщика.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jul 16 2016, 15:45
Сообщение #7


Гуру
******

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



Цитата(x893 @ Jul 16 2016, 11:41) *
прилагаю проект под Keil с тремя функциями из RAM.
Запускать можно под симулятором.
Прикрепленный файл  ramfunc.rar ( 14.23 килобайт ) Кол-во скачиваний: 85


Неужели всё так просто ? Одна настройка в опциях файла, и всё ?! И не нужно вписывать какую-нибудь секцию в Scatter файл, например ?
А каким образом под отладкой убедится, что выполняется на самом деле из RAM ?
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 16 2016, 17:09
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(MiklPolikov @ Jul 16 2016, 18:45) *
И не нужно вписывать какую-нибудь секцию в Scatter файл, например ?

Среда возьмет на себя эту нелегкую задачу. Можете убедиться, заглянув в сгенерированный ею .scat

Цитата(MiklPolikov @ Jul 16 2016, 18:45) *
А каким образом под отладкой убедится, что выполняется на самом деле из RAM ?

Под отладкой посмотреть диапазон адресов, в котором происходит исполнение.
А вообще, лучше приучить себя пользоваться map-файлом для прояснения вопроса что и где лежит.
Go to the top of the page
 
+Quote Post
x893
сообщение Jul 16 2016, 21:00
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Установить в Debug - Simulator и нажать Ctrl-F5
Можно конечно и через scatter - а смысл ?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 17 2016, 07:17
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(MiklPolikov @ Jul 16 2016, 18:45) *
Неужели всё так просто ? Одна настройка в опциях файла, и всё ?! И не нужно вписывать какую-нибудь секцию в Scatter файл, например ?
А каким образом под отладкой убедится, что выполняется на самом деле из RAM ?

Гораздо интереснее вопрос "а каким способом убедиться, что функция не вызывает ничего из того, что расположено не в RAM?" wacko.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 17 2016, 08:15
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Jul 17 2016, 13:17) *
Гораздо интереснее вопрос "а каким способом убедиться, что функция не вызывает ничего из того, что расположено не в RAM?" wacko.gif

IAR, когда ему указываешь __ramfunc и, если функция лезет куда-то вне ОЗУ, выдаёт варнинг.
А иначе в общем случае - никак, потому что никто не мешает компилятору при оптимизации, вынести часть функции в отдельную функцию (так как в соседней функции есть подобный участок). И компилятор активно использует константы, адресумые через PC, располагая их рядом с телом функции, а может быть и не рядом.
Так что пользоваться надо штатными средствами, а не городить колхоз.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jul 17 2016, 12:48
Сообщение #12


Гуру
******

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



Вот почему в примере x893 в map файле видно что функция расположена в RAM , а в моём проекте, хотя я сделал всё то же самое, она в RAM не расположена ????
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 17 2016, 13:02
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Смотрите сгенерированный .scat
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jul 17 2016, 13:33
Сообщение #14


Гуру
******

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



Цитата(aaarrr @ Jul 17 2016, 16:02) *
Смотрите сгенерированный .scat

У меня нет такого файла. Может .sct , он же Scatter ? Вот он.
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 17 2016, 14:19
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Как можно видеть, "не шработала" галочка в среде. Добавьте к RW_IRAM1 { flash_rom_ram.o (*) }
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 04:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01499 секунд с 7
ELECTRONIX ©2004-2016