Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CortexM3 нужно реализовать премудрость
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
megajohn
вообщем, хочу реализовать быстрый контроль памяти стека для 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
AlexandrY
Цитата(megajohn @ Aug 7 2013, 15:46) *
еще порылся в отладчике, и поразило, какой жадный этот printf в режиме Large Without Multibytes, сразу 132 байта под себя требует !


А статический анализатор стека применить не судьба? biggrin.gif
_Артём_
Цитата(megajohn @ Aug 7 2013, 15:46) *
1. экслюзивный доступ



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


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

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

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


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

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

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

оказывается, есть такое. Завтра гляну, а то сегодня уже башка не варит
jcxz
Цитата(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 (с семафором ессно).
AHTOXA
Цитата(megajohn @ Aug 7 2013, 18:46) *
3. Какие еще варианты ?

Для начала дать всем задачам стека с запасом, при старте заполнить стеки определённым значением. Дать программе поработать во всех режимах, затем посмотреть, до какого места в каждом стеке наше определённое значение осталось. Это и будет максимальное потребление стека каждой из задач.
(так сделано в scmRTOS).
AlexandrY
Цитата(megajohn @ Aug 8 2013, 01:04) *
а какой вы применяете ? Я не совсем понимаю как они понимают что это preemptiveРТОС а не однозадачная ОС


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

Но скажу, что хорошие RTOS не используют библиотечный printf как достаточно опасный для многозадачности.
Например RTOS MQX заменяет printf своей надежной версией и вообще большинство функций из <stdio.h> заменяет.
Мало того, MQX проверяет занятость стека в каждом сервисе RTOS как для задач так и для прерываний.
Для еще большей надежности MQX имеет функции проверки целостности в реальном времени всех объектов RTOS.
Рекомендуется это делать в отдельной фоновой задаче.
Ну и естественно в MQX есть защита ядра от повреждения задачами с помощью MPU.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.