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

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

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

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

typedef void (*DataTransfer_t)( uint32_t );

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

char FuncBuffer[512] @ ".itcmram";

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

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

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

((DataTransfer_t)FuncBuffer)( FirAskSlot );

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

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

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


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

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

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

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

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


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

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

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

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


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

А Вы чего ожидали?

Думал что в сказку попал. Ан нет. Так, все же, какие можете предложить решения?

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


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

Думал что в сказку попал. Ан нет. Так, все же, какие можете предложить решения?

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

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

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

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

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

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


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

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

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

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

 

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

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