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

 
 
> STM32F: Функция в RAM
amiller
сообщение Apr 21 2016, 07:46
Сообщение #1


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

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Раньше я много работал с серией микроконтроллеров C2000 от Техаса.
Там был механизм (CCStudio), позволяющий разместить любую функцию в RAM. Это позволяло существенно ускорить выполнение критического кода, а также избежать остановки выполнения программы в процессе записи или стирания Flash. Механизм примерно такой:
1. Для информирования линкера создавалась специальная секция: размещение во Flash, запуск из RAM.
2. При компоновке линкер все адреса вызовов модифицирует так, как будто этот код уже располагается в RAM.
3. В процессе инициализации эта секция копируется в RAM стандартно, по аналогии с инициализируемыми переменными.
4. При выполнении, при обращении к функции происходит переход по адресу в RAM.
К сожалению для STM32 я пока не обнаружил аналогичного механизма.
Больше всего меня смущает не быстродействие (конвейер в STM32 достаточно хорош), а проблема, связанная со стиранием больших секторов. Например в STM32F4 время, на которое код зависает при выполнении из Flash, может достигать сотен миллисекунд.
Конечно можно весь код разместить в RAM, но не всегда это возможно из соображений размера, да и защита от несанкционированного копирования кода в этом случае имеет проблемы.
Хотелось бы более красивое решение.
Есть мысли по этому поводу? Может я просто не нашёл нужный документ или пример?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Apr 21 2016, 09:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(amiller @ Apr 21 2016, 10:46) *
Больше всего меня смущает не быстродействие (конвейер в STM32 достаточно хорош), а проблема, связанная со стиранием больших секторов. Например в STM32F4 время, на которое код зависает при выполнении из Flash, может достигать сотен миллисекунд.

Зависит от того, что вы хотите делать в течение этих сотен миллисекунд. Если что-то нетривиальное, то обнаружите, что половину вашего кода, если не больше, нужно будет размещать в ОЗУ. Причём отделить нужное от ненужного будет ой как не просто.
Кстати, зачем стираете большие сектора? Я для эмуляции EEPROM выделяю 2 сектора по 16 кБайт. Там типичное время стирания сектора 250 мс. В моих применениях программа может подождать 250 мс.
Go to the top of the page
 
+Quote Post
amiller
сообщение Apr 21 2016, 10:03
Сообщение #3


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

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Цитата(scifi @ Apr 21 2016, 12:04) *
Зависит от того, что вы хотите делать в течение этих сотен миллисекунд. Если что-то нетривиальное, то обнаружите, что половину вашего кода, если не больше, нужно будет размещать в ОЗУ. Причём отделить нужное от ненужного будет ой как не просто.
Кстати, зачем стираете большие сектора? Я для эмуляции EEPROM выделяю 2 сектора по 16 кБайт. Там типичное время стирания сектора 250 мс. В моих применениях программа может подождать 250 мс.

У меня примерно так: Первые два сектора по 16к - загрузчик. Следующие два сектора по 16к - EEPROM. Затем код основной программы. В конце два больших сектора под запись протоколов.
Устройство должно протоколировать все события в системе. Протоколы пишутся во кругу в два сектора. И всё равно когда то наступает момент, когда нужно стереть сектор. Я конечно стараюсь отложить этот момент на время, безопасное со всех точек зрения, но проблема существует.
По поводу того, что именно помещать в ОЗУ, да такая проблема есть, но решаемая. Обычно это прерывания, плюс несколько важных функций.
В нормальном режиме у устройства обмен по нескольким каналам связи со скоростями 5-10кбайт в секунду. Зависание на такое время (сотни миллисекунд) даже визуально проявляется на мониторе связи. Не говоря уже о таких процессах, как управление ШИМ-преобразователем.
Кстати ещё один вопрос: Если во время стирания флэш, произойдёт любое обращение к флэш, то программа зависнет до окончания операции стирания? Или обработка прерывания возможна? Скорее всего, даже для того, чтобы работали прерывания, нужно на время операции стирания исключить любые обращения к флэш. Так?


Цитата(SSerge @ Apr 21 2016, 12:15) *
Значит Вам повезло, потому что в папке doc есть файл EWARM_DevelopmentGuide.ENU.pdf.
Там есть описание как работает __ramfunc и какие изменения нужно сделать в конфиге линкера (initialize by copy { section .textrw }; ).

Спасибо, посмотрю. Наверное это то, что мне нужно. Хотя документ известный, вряд ли я мимо прошёл. Может чем то не устроил.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Apr 21 2016, 10:43
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(amiller @ Apr 21 2016, 17:03) *
Кстати ещё один вопрос: Если во время стирания флэш, произойдёт любое обращение к флэш, то программа зависнет до окончания операции стирания? Или обработка прерывания возможна? Скорее всего, даже для того, чтобы работали прерывания, нужно на время операции стирания исключить любые обращения к флэш. Так?

Именно.
Цитата
Any attempt to read the Flash memory on STM32F4xx while it is being written or erased,
causes the bus to stall. Read operations are processed correctly once the program
operation has completed. This means that code or data fetches cannot be performed while
a write/erase operation is ongoing.

Т.е. читать можно, но это приведёт к приостановке выполнения программы до конца операции стирания или записи.
Именно это и происходит при обычном стирании/записи без перемещения программы в RAM.
Цитата
On STM32F42xxx and STM32F43xxx devices, two banks are available allowing read
operation from one bank while a write/erase operation is performed to the other bank.

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


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- amiller   STM32F: Функция в RAM   Apr 21 2016, 07:46
- - DmitryM   Цитата(amiller @ Apr 21 2016, 11:46) дл...   Apr 21 2016, 08:02
- - jcxz   Цитата(amiller @ Apr 21 2016, 13:46) К со...   Apr 21 2016, 08:04
- - amiller   Да этот важный момент я упустил. среда программиро...   Apr 21 2016, 08:14
|- - IV_K   Цитата(amiller @ Apr 21 2016, 11:14) Да э...   Apr 21 2016, 08:48
|- - SSerge   Цитата(amiller @ Apr 21 2016, 15:14) Да э...   Apr 21 2016, 09:15
|- - jcxz   Цитата(amiller @ Apr 21 2016, 16:03) Устр...   Apr 21 2016, 10:14
|- - scifi   Цитата(amiller @ Apr 21 2016, 13:03) Кста...   Apr 21 2016, 10:15
||- - amiller   Цитата(scifi @ Apr 21 2016, 13:15) Кстати...   Apr 21 2016, 10:56
||- - scifi   Цитата(amiller @ Apr 21 2016, 13:56) Внеш...   Apr 21 2016, 11:04
||- - jcxz   Цитата(amiller @ Apr 21 2016, 16:56) Кста...   Apr 21 2016, 11:42
||- - amiller   Цитата(jcxz @ Apr 21 2016, 14:42) Пинайте...   Apr 21 2016, 12:14
||- - jcxz   Цитата(amiller @ Apr 21 2016, 18:14) Дело...   Apr 21 2016, 16:00
- - amiller   Спасибо за обмен мнениями. Кстати, посмотрел со вс...   Apr 21 2016, 17:05
- - scifi   Цитата(amiller @ Apr 21 2016, 20:05) В св...   Apr 21 2016, 17:30


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

 


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


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