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

Выполнение кода из ОЗУ

initialize by copy { readonly, readwrite }

Тогда уж лучше указать конкретные секции в initialize by copy {}. А readonly, readwrite в указанной конструкции указывают на все секции имеющие соответствующие атрибуты.

Делать нужно ровно так как написано в документации, даже если это кажется нелогичным. Достаточно вспомнить наш спор про инициализированные данные с модификатором __eeprom. Как бы вам не хотелось обратного, но работать будет именно так как написано в мануале. Надо отдать должное IAR, всё разжовано в документации, остаётся только не лениться её читать.

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


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

Кстати, вопрос топикстартеру. Зачем вы код в RAM тянете? Не знаю на каком чипе вы работаете, но почти уверен что у него отдельная шина к flash. Вешая код и данные на одну шину можно потерять в скорости, осоюенно если туда DMA запустить. Да и просто, RAM лишняя не бывает.

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


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

Cекцию .httpContent в исключения попробуй.

 

Огромное спасибо, это помогло!

 

Кстати, вопрос топикстартеру. Зачем вы код в RAM тянете? Не знаю на каком чипе вы работаете, но почти уверен что у него отдельная шина к flash. Вешая код и данные на одну шину можно потерять в скорости, осоюенно если туда DMA запустить. Да и просто, RAM лишняя не бывает.

 

STM32F4. Обычно этого не делаю, но тут довольно специфическая задача - разрабатываю OSD контроллер для VGA. Картинка отправляется построчно с помощью SPI пина MOSI. Для этого задействован DMA. Так вот при работе из Flash картинка на экране искажается, некоторые строки сдвигаются, особенно если что-то писать в буфер, где хранится картинка. Я не знаю точно, что служило причиной этому, но запуск из RAM исправил ситуацию. Тем более, я еще задействовал ремаппинг, поэтому время выполнения кода по сравнению с flash не ухудшилось

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


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

Как-то раз делал загрузчик. Для того чтобы он мог перепрошивать самого себя, при старте он копировал себя из флэш в ОЗУ. Для этого ничего не надо было делать в настройках линкера. Единственное изменение: заменить адрес начала флэш с 0x08000000 на 0x00000000. В коде загрузчика просто делал memcpy(), потом ремап. Думаю, в вашей ситуации такой подход тоже оправдан.

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


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

Единственное изменение: заменить адрес начала флэш с 0x08000000 на 0x00000000. В коде загрузчика просто делал memcpy(), потом ремап.

Так можно делать (да и собственно так и сделано сейчас у меня в бутлоадере) только если нужно целиком всю программу скопировать в ОЗУ. А ТСу нужна только одна функция. Хотя конечно если такую функцию и все её const данные вынести в отдельный файл, для этого файла переопределить сегменты по-умолчанию и вынести все эти сегменты в какой-то регион памяти, то потом можно этот регион и скопировать. Собственно и оверлеи можно так делать.

 

Достаточно вспомнить наш спор про инициализированные данные с модификатором __eeprom.

Я в STM8 __eeprom нигде не использовал. Писал в EEPROM только самостоятельно, без компилятора/линкёра. Вроде за такой подход я тогда и ратовал.

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


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

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

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

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

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

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

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

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

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

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