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

 
 
> 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
scifi
сообщение Apr 21 2016, 10:15
Сообщение #4


Гуру
******

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



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

Да.

Цитата(amiller @ Apr 21 2016, 13:03) *
Или обработка прерывания возможна?

Нет.

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

Да.

Кстати, в том же STM32F427 есть такая штука, как два банка флеш. Пока один банк стирается, программа может выполняться из другого.
Или поставьте внешнюю флешку SOIC8 из 25-й серии. Их везде как грязи, и стоят они копейки.
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
||- - 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
|- - SSerge   Цитата(amiller @ Apr 21 2016, 17:03) Кста...   Apr 21 2016, 10:43
- - 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 Текстовая версия Сейчас: 29th July 2025 - 10:25
Рейтинг@Mail.ru


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