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

Выполнение функции из RAM

Пытаюсь выполнить функцию из 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
    
}

 

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


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

Подскажите, что я делаю неправильно ?

Ну, как минимум нулевой бит в адресе вызываемой функции должен быть установлен в '1'.

Листинг нужно смотреть. А лучше разместить функцию в RAM штатными средствами.

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


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

Ну, как минимум нулевой бит в адресе вызываемой функции должен быть установлен в '1'.

 

Да, видел это в примерах. Всё равно не работает. Делал так :

 

     //запускаем из RAM
     x=(unsigned int)p2;
     x|=1;  //увеличиваем 0й бит адреса на 1
     p_function=(void*)x;
     p_function(); ///тут программа попадает в HardFault

 

 

У них есть пример как это делать.

Ключевое слово __ramfunc

 

У меня Keil не понимает __ramfunc. В интернете везде пишут по-разному.

Покажите пожалуйста правильный пример.

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


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

Посыпаю голову пеплом - __ramfunc это в IAR

В качестве компенсации прилагаю проект под Keil с тремя функциями из RAM.

Запускать можно под симулятором.

 

ramfunc.rar

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


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

Подскажите, что я делаю неправильно ?

Нельзя так делать. Как Вы определяете размер функции? А вложенные вызовы функций из копируемой учитываете? А константы, адресуемые через PC, учитываете? А исполнение кода для этого участка ОЗУ в MPU разрешено? ....

Размещать функции в ОЗУ нужно штатными средствами компилятора и компоновщика.

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


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

прилагаю проект под Keil с тремя функциями из RAM.

Запускать можно под симулятором.

ramfunc.rar

 

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

А каким образом под отладкой убедится, что выполняется на самом деле из RAM ?

post-24702-1468683900_thumb.jpg

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


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

И не нужно вписывать какую-нибудь секцию в Scatter файл, например ?

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

 

А каким образом под отладкой убедится, что выполняется на самом деле из RAM ?

Под отладкой посмотреть диапазон адресов, в котором происходит исполнение.

А вообще, лучше приучить себя пользоваться map-файлом для прояснения вопроса что и где лежит.

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


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

Установить в Debug - Simulator и нажать Ctrl-F5

Можно конечно и через scatter - а смысл ?

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


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

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

А каким образом под отладкой убедится, что выполняется на самом деле из RAM ?

Гораздо интереснее вопрос "а каким способом убедиться, что функция не вызывает ничего из того, что расположено не в RAM?" :wacko:

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


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

Гораздо интереснее вопрос "а каким способом убедиться, что функция не вызывает ничего из того, что расположено не в RAM?" :wacko:

IAR, когда ему указываешь __ramfunc и, если функция лезет куда-то вне ОЗУ, выдаёт варнинг.

А иначе в общем случае - никак, потому что никто не мешает компилятору при оптимизации, вынести часть функции в отдельную функцию (так как в соседней функции есть подобный участок). И компилятор активно использует константы, адресумые через PC, располагая их рядом с телом функции, а может быть и не рядом.

Так что пользоваться надо штатными средствами, а не городить колхоз.

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


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

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

post-24702-1468759717_thumb.jpg

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


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

Смотрите сгенерированный .scat

У меня нет такого файла. Может .sct , он же Scatter ? Вот он.

post-24702-1468762412_thumb.jpg

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


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

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

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

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

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

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

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

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

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

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