MiklPolikov 0 16 июля, 2016 Опубликовано 16 июля, 2016 · Жалоба Пытаюсь выполнить функцию из 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 16 июля, 2016 Опубликовано 16 июля, 2016 · Жалоба Подскажите, что я делаю неправильно ? Ну, как минимум нулевой бит в адресе вызываемой функции должен быть установлен в '1'. Листинг нужно смотреть. А лучше разместить функцию в RAM штатными средствами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 41 16 июля, 2016 Опубликовано 16 июля, 2016 · Жалоба У них есть пример как это делать. Ключевое слово __ramfunc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 16 июля, 2016 Опубликовано 16 июля, 2016 · Жалоба Ну, как минимум нулевой бит в адресе вызываемой функции должен быть установлен в '1'. Да, видел это в примерах. Всё равно не работает. Делал так : //запускаем из RAM x=(unsigned int)p2; x|=1; //увеличиваем 0й бит адреса на 1 p_function=(void*)x; p_function(); ///тут программа попадает в HardFault У них есть пример как это делать. Ключевое слово __ramfunc У меня Keil не понимает __ramfunc. В интернете везде пишут по-разному. Покажите пожалуйста правильный пример. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 41 16 июля, 2016 Опубликовано 16 июля, 2016 · Жалоба Посыпаю голову пеплом - __ramfunc это в IAR В качестве компенсации прилагаю проект под Keil с тремя функциями из RAM. Запускать можно под симулятором. ramfunc.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 16 июля, 2016 Опубликовано 16 июля, 2016 · Жалоба Подскажите, что я делаю неправильно ? Нельзя так делать. Как Вы определяете размер функции? А вложенные вызовы функций из копируемой учитываете? А константы, адресуемые через PC, учитываете? А исполнение кода для этого участка ОЗУ в MPU разрешено? .... Размещать функции в ОЗУ нужно штатными средствами компилятора и компоновщика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 16 июля, 2016 Опубликовано 16 июля, 2016 · Жалоба прилагаю проект под Keil с тремя функциями из RAM. Запускать можно под симулятором. ramfunc.rar Неужели всё так просто ? Одна настройка в опциях файла, и всё ?! И не нужно вписывать какую-нибудь секцию в Scatter файл, например ? А каким образом под отладкой убедится, что выполняется на самом деле из RAM ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 16 июля, 2016 Опубликовано 16 июля, 2016 · Жалоба И не нужно вписывать какую-нибудь секцию в Scatter файл, например ? Среда возьмет на себя эту нелегкую задачу. Можете убедиться, заглянув в сгенерированный ею .scat А каким образом под отладкой убедится, что выполняется на самом деле из RAM ? Под отладкой посмотреть диапазон адресов, в котором происходит исполнение. А вообще, лучше приучить себя пользоваться map-файлом для прояснения вопроса что и где лежит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 41 16 июля, 2016 Опубликовано 16 июля, 2016 · Жалоба Установить в Debug - Simulator и нажать Ctrl-F5 Можно конечно и через scatter - а смысл ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 17 июля, 2016 Опубликовано 17 июля, 2016 · Жалоба Неужели всё так просто ? Одна настройка в опциях файла, и всё ?! И не нужно вписывать какую-нибудь секцию в Scatter файл, например ? А каким образом под отладкой убедится, что выполняется на самом деле из RAM ? Гораздо интереснее вопрос "а каким способом убедиться, что функция не вызывает ничего из того, что расположено не в RAM?" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 17 июля, 2016 Опубликовано 17 июля, 2016 · Жалоба Гораздо интереснее вопрос "а каким способом убедиться, что функция не вызывает ничего из того, что расположено не в RAM?" IAR, когда ему указываешь __ramfunc и, если функция лезет куда-то вне ОЗУ, выдаёт варнинг. А иначе в общем случае - никак, потому что никто не мешает компилятору при оптимизации, вынести часть функции в отдельную функцию (так как в соседней функции есть подобный участок). И компилятор активно использует константы, адресумые через PC, располагая их рядом с телом функции, а может быть и не рядом. Так что пользоваться надо штатными средствами, а не городить колхоз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 17 июля, 2016 Опубликовано 17 июля, 2016 · Жалоба Вот почему в примере x893 в map файле видно что функция расположена в RAM , а в моём проекте, хотя я сделал всё то же самое, она в RAM не расположена ???? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 17 июля, 2016 Опубликовано 17 июля, 2016 · Жалоба Смотрите сгенерированный .scat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 17 июля, 2016 Опубликовано 17 июля, 2016 · Жалоба Смотрите сгенерированный .scat У меня нет такого файла. Может .sct , он же Scatter ? Вот он. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 17 июля, 2016 Опубликовано 17 июля, 2016 · Жалоба Как можно видеть, "не шработала" галочка в среде. Добавьте к RW_IRAM1 { flash_rom_ram.o (*) } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться