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

 
 
> CortexM3 нужно реализовать премудрость, быстрый контроль памяти стека для RTOS
megajohn
сообщение Aug 7 2013, 12:46
Сообщение #1


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



вообщем, хочу реализовать быстрый контроль памяти стека для RTOS.
сейчас сделано тупо - перед переключением контекста проверяется самый первый int области стека ( соответственно последний если исходить что в cm3 голова в хвосте )
в функции printf стек используется нелинейно и у меня практически получилось, что проскочило мое контрольное слово и потер уже за стеком.
напрашивается контроль к примеру 16 слов. Проверять ручками это не камильфо - долго, интересуют именно быстрые варианты

какие есть быстрые ?

Я пока надумал:
1. экслюзивный доступ
2. мои предположения что авось есть спец регистр, который можно настроить за наблюдение за другим регистром и запоминает его минимальное значение. В данном случае натравить на PSP
3. Какие еще варианты ?

вот пример как у меня произошел выход за пределы
Прикрепленное изображение


upd: "экслюзивный доступ" увы но медленный. Я думал что можно указать регион мониторинга. Но нет, там для каждого WORD выставляется общий признак. То есть перед передачей управления задаче, нужно сначала пометить первых N-слов, и потом перед возвратом проверить экслюзивный доступ (да еще вопрос как поведет себя обычная запись по этим регистрам). Конечно есть небольшой плюс - можно отказатся от magic word.

upd2:
еще порылся в отладчике, и поразило, какой жадный этот printf в режиме Large Without Multibytes, сразу 132 байта под себя требует !
Код
PrintfLargeNoMb:
0xb92c: 0xe92d 0x4ff0  PUSH.W    {R4-R11, LR}
0xb930: 0xb0a1         SUB       SP, SP, #0x84


Еще для справки: tiny = 0x10, small without multibytes = 0x4C, full Without Multibytes = 0x84


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
AlexandrY
сообщение Aug 7 2013, 14:42
Сообщение #2


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(megajohn @ Aug 7 2013, 15:46) *
еще порылся в отладчике, и поразило, какой жадный этот printf в режиме Large Without Multibytes, сразу 132 байта под себя требует !


А статический анализатор стека применить не судьба? biggrin.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 7 2013, 20:23
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(megajohn @ Aug 7 2013, 15:46) *
1. экслюзивный доступ



Что вы называете "экслюзивным доступом"?


Цитата(megajohn @ Aug 7 2013, 15:46) *
3. Какие еще варианты ?

MPU - Memory protection unit? Или не подходит?
Go to the top of the page
 
+Quote Post
megajohn
сообщение Aug 7 2013, 22:04
Сообщение #4


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(AlexandrY @ Aug 7 2013, 18:42) *
А статический анализатор стека применить не судьба? biggrin.gif

а какой вы применяете ? Я не совсем понимаю как они понимают что это preemptiveРТОС а не однозадачная ОС


Цитата(_Артём_ @ Aug 8 2013, 00:23) *
Что вы называете "экслюзивным доступом"?

а что в кортексе называется, так и называю. Но думал что это побайтовая штука, а оказалась глобальная на всю память, и по этому не годится

Цитата(_Артём_ @ Aug 8 2013, 00:23) *
MPU - Memory protection unit? Или не подходит?

оказывается, есть такое. Завтра гляну, а то сегодня уже башка не варит


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 8 2013, 03:50
Сообщение #5


Гуру
******

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



Цитата(megajohn @ Aug 7 2013, 18:46) *
Еще для справки: tiny = 0x10, small without multibytes = 0x4C, full Without Multibytes = 0x84

Это что-то мало у вас... У меня в каком-то режиме до полукилобайта занимал.

Цитата(megajohn @ Aug 8 2013, 04:04) *
а что в кортексе называется, так и называю. Но думал что это побайтовая штука, а оказалась глобальная на всю память, и по этому не годится

Как она может быть побайтовой (или вообще привязанной к адресам) если там нигде адрес не указывается?
Если логически подумать, то там скорее всего определяется факт срабатывания прерывания внутри секции эксклюзивного доступа
(по LDREX взводится флаг в CPU, который сбрасывается если возникло прерывание, а потом он проверяется STREX).

Когда у меня была аналогичная проблема с расходованием стека в RTOS sprintf-ом, я просто сделал переключение стека, на стек для sprintf (с семафором ессно).
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 8 2013, 04:49
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(megajohn @ Aug 7 2013, 18:46) *
3. Какие еще варианты ?

Для начала дать всем задачам стека с запасом, при старте заполнить стеки определённым значением. Дать программе поработать во всех режимах, затем посмотреть, до какого места в каждом стеке наше определённое значение осталось. Это и будет максимальное потребление стека каждой из задач.
(так сделано в scmRTOS).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 8 2013, 06:41
Сообщение #7


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(megajohn @ Aug 8 2013, 01:04) *
а какой вы применяете ? Я не совсем понимаю как они понимают что это preemptiveРТОС а не однозадачная ОС


IAR делает очень хороший отчет о стеках.
Вытеснение он не учитывает, но сообщит о всех вызовах для которых он не может проследить всю цепочку, например в вызовах по указателям.
Для функций типа printf уж точно покажет стек.
Думаю свою справку вы из того отчета и взяли.

Но скажу, что хорошие RTOS не используют библиотечный printf как достаточно опасный для многозадачности.
Например RTOS MQX заменяет printf своей надежной версией и вообще большинство функций из <stdio.h> заменяет.
Мало того, MQX проверяет занятость стека в каждом сервисе RTOS как для задач так и для прерываний.
Для еще большей надежности MQX имеет функции проверки целостности в реальном времени всех объектов RTOS.
Рекомендуется это делать в отдельной фоновой задаче.
Ну и естественно в MQX есть защита ядра от повреждения задачами с помощью MPU.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:01
Рейтинг@Mail.ru


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