Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загрузка функций в RAM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Мусатов Константин
Есть толпа функций обработки данных, из которых работает только одна, в зависимости от настроек. При этом матобработка критична по скорости, потому им бы лежать в ОЗУ. Но их много и хчется сэкономить место в ОЗУ.
У всех функций один и тот же программный интерфейс.
Код
typedef void (*DataTransfer_t)( uint32_t );

После компиляции всех функций я посмотрел в мэп файле наиболее длинную из них и сделал с небольшим запасом буфер
Код
char FuncBuffer[512] @ ".itcmram";

Потом копирую в буфер тело функции
Код
memcpy( FuncBuffer, (char*)DataTransfer1, 512 );

После чего пытаюсь запустить
Код
((DataTransfer_t)FuncBuffer)( FirAskSlot );

Но не тут то было, вываливаюсь в Hard_fault.
Что я сделал неправильно?
Dog Pawlowa
Цитата(Мусатов Константин @ Feb 7 2017, 21:37) *
Но не тут то было, вываливаюсь в Hard_fault.

Буфер по какому адресу располагается? (что там с выравниванием?)
Попробуйте определить буфер как массив 32-разрядных значений.
Мусатов Константин
Буфер выровненный. Пробовал его делать более широкий, uint16_t - не помогло. 32 бита не стал делать - код в функциях THUMB - 16-и битный.
Обратил внимание, что указатель на функцию, смотрит не на ее первый байт с четным номером, а на второй, с нечетным. Сделал копирование с адреса на 1 меньше - теперь буфер точно копирует данные в функции. Пробую запустить так же по нечетному адресу - пока не помогает.
jcxz
Цитата(Мусатов Константин @ Feb 7 2017, 20:37) *
Но не тут то было, вываливаюсь в Hard_fault.

А Вы чего ожидали?
Мусатов Константин
Цитата(jcxz @ Feb 8 2017, 00:11) *
А Вы чего ожидали?

Думал что в сказку попал. Ан нет. Так, все же, какие можете предложить решения?
jcxz
Цитата(Мусатов Константин @ Feb 7 2017, 23:18) *
Думал что в сказку попал. Ан нет. Так, все же, какие можете предложить решения?

Наконец-то изучить процесс создания и загрузки RAM-функций. Чего Вы не сделали в предыдущей теме.
Если бы сделали, заметили бы, что при декларации такой функции, компилятор создаёт две секции: одна RW - это область выполнения в ОЗУ обычно, а другая - RO - содержит собственно сам сгенерённый код (обычно во в флешь). Си-стартап копирует содержимое второй в первую. По мап-файлу это всё хорошо видно.
И чтобы совместить области выполнения нескольких функций надо прочитать доку на компилятор "как нескольким функциям назначить одну область выполнения". Так, чтобы область2 у каждой функции была своя, а область1 - общая на всех. А потом уже делать копирование из области 2 каждой функции в область 1 (опять-же - узнав в доке на компилятор/компоновщик как правильно определить границы областей).
А не городить колхоз совершенно не понимая что делаете и как оно внутри работает.
А хардфаулт из-за того, что функция у Вас очевидно скомпилена для выполнения не по тем адресам, куда Вы её копируете.
Мусатов Константин
Разобрался с вопросом. Нужная технология называется static overlay
Описана тут и там есть хороший пример в архиве, по которому все становится понятно
https://www.iar.com/support/tech-notes/link...-example-v5.50/
jcxz
Цитата(Мусатов Константин @ Feb 8 2017, 00:12) *
Разобрался с вопросом. Нужная технология называется static overlay
Описана тут и там есть хороший пример в архиве, по которому все становится понятно

О! Вот это правильно! laughing.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.