реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Загрузка функций в RAM
Мусатов Констант...
сообщение Feb 7 2017, 18:37
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



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

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

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

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

Но не тут то было, вываливаюсь в Hard_fault.
Что я сделал неправильно?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 7 2017, 19:01
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Мусатов Константин @ Feb 7 2017, 21:37) *
Но не тут то было, вываливаюсь в Hard_fault.

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Feb 7 2017, 19:27
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



Буфер выровненный. Пробовал его делать более широкий, uint16_t - не помогло. 32 бита не стал делать - код в функциях THUMB - 16-и битный.
Обратил внимание, что указатель на функцию, смотрит не на ее первый байт с четным номером, а на второй, с нечетным. Сделал копирование с адреса на 1 меньше - теперь буфер точно копирует данные в функции. Пробую запустить так же по нечетному адресу - пока не помогает.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 7 2017, 21:11
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Мусатов Константин @ Feb 7 2017, 20:37) *
Но не тут то было, вываливаюсь в Hard_fault.

А Вы чего ожидали?
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Feb 7 2017, 21:18
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



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

Думал что в сказку попал. Ан нет. Так, все же, какие можете предложить решения?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 7 2017, 22:06
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Наконец-то изучить процесс создания и загрузки RAM-функций. Чего Вы не сделали в предыдущей теме.
Если бы сделали, заметили бы, что при декларации такой функции, компилятор создаёт две секции: одна RW - это область выполнения в ОЗУ обычно, а другая - RO - содержит собственно сам сгенерённый код (обычно во в флешь). Си-стартап копирует содержимое второй в первую. По мап-файлу это всё хорошо видно.
И чтобы совместить области выполнения нескольких функций надо прочитать доку на компилятор "как нескольким функциям назначить одну область выполнения". Так, чтобы область2 у каждой функции была своя, а область1 - общая на всех. А потом уже делать копирование из области 2 каждой функции в область 1 (опять-же - узнав в доке на компилятор/компоновщик как правильно определить границы областей).
А не городить колхоз совершенно не понимая что делаете и как оно внутри работает.
А хардфаулт из-за того, что функция у Вас очевидно скомпилена для выполнения не по тем адресам, куда Вы её копируете.
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Feb 7 2017, 22:12
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



Разобрался с вопросом. Нужная технология называется static overlay
Описана тут и там есть хороший пример в архиве, по которому все становится понятно
https://www.iar.com/support/tech-notes/link...-example-v5.50/
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 7 2017, 22:26
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Мусатов Константин @ Feb 8 2017, 00:12) *
Разобрался с вопросом. Нужная технология называется static overlay
Описана тут и там есть хороший пример в архиве, по которому все становится понятно

О! Вот это правильно! laughing.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.0803 секунд с 7
ELECTRONIX ©2004-2016