17.12.2017, 19:05
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Только сегодня ответил на такой же вопрос про наблюдение за использованием стэка на другом форуме
У себя в проекте использую первую функцию для точного измерения требуемой глубины стэка. Получается достаточно удобно - можно запросить данные в процессе реальной работы. Функция возвращает не текущую позицию, а именно самую низкую границу, до куда добирался указатель стэка в процессе работы конкретного потока.
Вторая - vApplicationStackOverflowHook() - это скорее пост-фактум, что всё стало настолько плохо, что стэк был продавлен.
Я бы просто выставил какое-то бОльшее значение, а затем - эпизодически считывал сколько реально было занято.
Функция оказалась действительно удобной.
|
|
|
|
18.12.2017, 11:21
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Можно вообще написать функцию, которая будет следить за размером стека остальных функций и сохранять максимальное значение. Потом собрать с нее данные и выкинуть из релиза
|
|
|
|
18.12.2017, 16:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
кто пример напишет
__________________
Глаза боятся,а руки делают.
|
|
|
|
18.12.2017, 19:45
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Я оказался не прав. Мы фактически не можем контролировать объем стека, используемый конкретной задачей. Есть TaskList команда, которая пишет форматированный вывод в буфер и указывает в том числе и размер стека, но это лишь тот размер, который мы сами указали при создании задачи. Сколько в реальности использовано мы не узнаем никогда. Единственный вариант - это ловить vApplicationStackOverflowHook и по нему находить задачу, которая его вызвала, чтобы добавить ей памяти в будущей. Не самый надежный способ, но честно говоря, у меня никаких проблем с этим нету. Все идеально работает даже с использованием stdio.
|
|
|
|
19.12.2017, 09:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,490
Сказал спасибо: 401
Сказали Спасибо 2,216 раз(а) в 1,314 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Можем, можем, вы были правы ) Первая переменная в блоке TCB - ока как раз и указывает на адрес вершины стека. А 13-я переменная в TCB указывает на верхнюю границу стека. Разница между ними - есть оставшееся свободное место.
Первая переменная в TCB - её адрес хранится в переменной дескриптора очереди, поэтому получить доступ к интересующим ячейкам очень просто.
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
19.12.2017, 12:29
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
NewWriter, можно подробнее? Лучше с примером.
|
|
|
|
19.12.2017, 16:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,490
Сказал спасибо: 401
Сказали Спасибо 2,216 раз(а) в 1,314 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Я к сожалению щас со смартфона пишу. Но неделю назад мы через электронку общались с CERGEI1982, я ему отправлял там скрины со стеком задачи и блоком TCB и разъяснениями. Попросите Сергея, пусть выложит сюда их и текст пояснений. Сергей, там в письме от 10 декабря, где про процесс создания задачи.
Ну а уж как получить значение переменной по адресу, это уж Easyrider83 и сам умеет делать ))))
Кстати, Easyrider83, загляните в файл tasks.c и разгребите тип структурыtypedef struct tskTaskControlBlock узнаете кое-что интересоне
Последний раз редактировалось NewWriter; 19.12.2017 в 16:39.
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
19.12.2017, 17:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Ваше сообщение
Местоположение в ОЗУ конкретной задачи или очереди можно узнать по переменной дескриптора задачи, очереди, семафора. Значение этой переменной - и есть адрес TCB задачи или очереди. Причем, применительно к задаче, значение переменной по этому адресу (на который указывает переменная-дескриптор) - и есть адрес вершины стека, то есть ближайший свободный адрес, в который может быть что-то записано.
Как вообще выглядит процесс создания задачи? Рассмотрим на примере создания первой задачи в коде.
Вначале аллокатор ядра RTOS ищет ближайший свободный адрес в куче - так получается первый адрес - 0x20003AC8, равный концу стека задачи. Далее, запрашивает из кучи количество байт, равное указанному в параметре при создании размеру, умноженному на 4 - так получается начало стека задачи. На картинке стек задачи, равный 50*4=200 байт, выделен желтым фоном.
Затем, если в куче хватило места (т.е. вернулось не NULL), запрашивается еще некоторое количество байт для TCB. В случае успеха - появляется блок TCB (на картинке обведены красным, начиная от надписи *pxNewTCB). Адрес начала TCB - 0x20003B90, возвращается в переменную дескриптора задачи. Так что именно так можно и определить начало блока TCB.
Далее, в блок TCB записывается имя задачи (на скрине выделено серым фоном, а правее в ANSI-кодировке видно Green LED ). Затем в TCB записываются другие параметры, в частности, приоритет задачи - число 1 правее имени. Ну там еще кое-чего пишется, и указатель вершины стека еще смещается на величину выравнивания.
А затем в стеке задачи производится выделение места под все регистры ядра МК (на скрине выделено синим фоном), из-за чего указатель вершины стека смещается еще на 16 четырехбайтных слов выше. И теперь указатель вершины стека равен 0х20003B44, именно это число мы видим в начале TCB, а как мы помним, на начало TCB указывает дескриптор задачи. Значит, сразу после создания задачи, конкретно для этой задачи мы имеем 32*4=128 байта для нужд функций задачи.
Таким образом, прочитав значение из адреса, на который указывает дескриптор, и сравнив его с концом стека (значение адреса конца стека хранится в TCB, 13-ое слово от начала - выделено ярко-желтым фоном), можно определить, сколько места еще есть в стеке задачи в конкретный момент.
__________________
Глаза боятся,а руки делают.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо CERGEI1982 за это сообщение:
|
|
|
19.12.2017, 17:22
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Да, это понятно, в ручном режиме через дебаг можно сделать. А как бы это все счастье делать в автоматическом режиме? Например, отработал девайс пару суток, снял логи и определил размер использованного стека. Казалось бы, в чем проблема измерять, на сколько сместился указатель?
|
|
|
|
19.12.2017, 17:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
А вот трассировка там что то может? не до шел просто до изучения
Также пару картинок из кейла по размещению задач.
Да и еще встретился при изучении очередей и симуляции в кейле : точки останова стирайте и снова ставите в дебагере или кейл застопориться на одном месте.
__________________
Глаза боятся,а руки делают.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:11.
|
|