kostya-m 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Есть толпа функций обработки данных, из которых работает только одна, в зависимости от настроек. При этом матобработка критична по скорости, потому им бы лежать в ОЗУ. Но их много и хчется сэкономить место в ОЗУ. У всех функций один и тот же программный интерфейс. typedef void (*DataTransfer_t)( uint32_t ); После компиляции всех функций я посмотрел в мэп файле наиболее длинную из них и сделал с небольшим запасом буфер char FuncBuffer[512] @ ".itcmram"; Потом копирую в буфер тело функции memcpy( FuncBuffer, (char*)DataTransfer1, 512 ); После чего пытаюсь запустить ((DataTransfer_t)FuncBuffer)( FirAskSlot ); Но не тут то было, вываливаюсь в Hard_fault. Что я сделал неправильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Но не тут то было, вываливаюсь в Hard_fault. Буфер по какому адресу располагается? (что там с выравниванием?) Попробуйте определить буфер как массив 32-разрядных значений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Буфер выровненный. Пробовал его делать более широкий, uint16_t - не помогло. 32 бита не стал делать - код в функциях THUMB - 16-и битный. Обратил внимание, что указатель на функцию, смотрит не на ее первый байт с четным номером, а на второй, с нечетным. Сделал копирование с адреса на 1 меньше - теперь буфер точно копирует данные в функции. Пробую запустить так же по нечетному адресу - пока не помогает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Но не тут то было, вываливаюсь в Hard_fault. А Вы чего ожидали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба А Вы чего ожидали? Думал что в сказку попал. Ан нет. Так, все же, какие можете предложить решения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Думал что в сказку попал. Ан нет. Так, все же, какие можете предложить решения? Наконец-то изучить процесс создания и загрузки RAM-функций. Чего Вы не сделали в предыдущей теме. Если бы сделали, заметили бы, что при декларации такой функции, компилятор создаёт две секции: одна RW - это область выполнения в ОЗУ обычно, а другая - RO - содержит собственно сам сгенерённый код (обычно во в флешь). Си-стартап копирует содержимое второй в первую. По мап-файлу это всё хорошо видно. И чтобы совместить области выполнения нескольких функций надо прочитать доку на компилятор "как нескольким функциям назначить одну область выполнения". Так, чтобы область2 у каждой функции была своя, а область1 - общая на всех. А потом уже делать копирование из области 2 каждой функции в область 1 (опять-же - узнав в доке на компилятор/компоновщик как правильно определить границы областей). А не городить колхоз совершенно не понимая что делаете и как оно внутри работает. А хардфаулт из-за того, что функция у Вас очевидно скомпилена для выполнения не по тем адресам, куда Вы её копируете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Разобрался с вопросом. Нужная технология называется static overlay Описана тут и там есть хороший пример в архиве, по которому все становится понятно https://www.iar.com/support/tech-notes/link...-example-v5.50/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Разобрался с вопросом. Нужная технология называется static overlay Описана тут и там есть хороший пример в архиве, по которому все становится понятно О! Вот это правильно! :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться