Jump to content

    
Sign in to follow this  
kostya-m

Загрузка функций в RAM

Recommended Posts

Есть толпа функций обработки данных, из которых работает только одна, в зависимости от настроек. При этом матобработка критична по скорости, потому им бы лежать в ОЗУ. Но их много и хчется сэкономить место в ОЗУ.

У всех функций один и тот же программный интерфейс.

typedef void (*DataTransfer_t)( uint32_t );

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

char FuncBuffer[512] @ ".itcmram";

Потом копирую в буфер тело функции

memcpy( FuncBuffer, (char*)DataTransfer1, 512 );

После чего пытаюсь запустить

((DataTransfer_t)FuncBuffer)( FirAskSlot );

Но не тут то было, вываливаюсь в Hard_fault.

Что я сделал неправильно?

Share this post


Link to post
Share on other sites
Но не тут то было, вываливаюсь в Hard_fault.

Буфер по какому адресу располагается? (что там с выравниванием?)

Попробуйте определить буфер как массив 32-разрядных значений.

Share this post


Link to post
Share on other sites

Буфер выровненный. Пробовал его делать более широкий, uint16_t - не помогло. 32 бита не стал делать - код в функциях THUMB - 16-и битный.

Обратил внимание, что указатель на функцию, смотрит не на ее первый байт с четным номером, а на второй, с нечетным. Сделал копирование с адреса на 1 меньше - теперь буфер точно копирует данные в функции. Пробую запустить так же по нечетному адресу - пока не помогает.

Share this post


Link to post
Share on other sites
Думал что в сказку попал. Ан нет. Так, все же, какие можете предложить решения?

Наконец-то изучить процесс создания и загрузки RAM-функций. Чего Вы не сделали в предыдущей теме.

Если бы сделали, заметили бы, что при декларации такой функции, компилятор создаёт две секции: одна RW - это область выполнения в ОЗУ обычно, а другая - RO - содержит собственно сам сгенерённый код (обычно во в флешь). Си-стартап копирует содержимое второй в первую. По мап-файлу это всё хорошо видно.

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

А не городить колхоз совершенно не понимая что делаете и как оно внутри работает.

А хардфаулт из-за того, что функция у Вас очевидно скомпилена для выполнения не по тем адресам, куда Вы её копируете.

Share this post


Link to post
Share on other sites

Разобрался с вопросом. Нужная технология называется static overlay

Описана тут и там есть хороший пример в архиве, по которому все становится понятно

https://www.iar.com/support/tech-notes/link...-example-v5.50/

 

Share this post


Link to post
Share on other sites
Разобрался с вопросом. Нужная технология называется static overlay

Описана тут и там есть хороший пример в архиве, по которому все становится понятно

О! Вот это правильно! :laughing:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this