Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы по RTOS TNKernel 2.6
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
yurmala
Здравствуйте! Есть Keil-овский проект на базе TNKernel. Через неопределенное время проект подвисает (причем не всегда), поэтому стал погружаться глубже в эту систему в поисках ответов.
Подскажите пожалуйста:
1) Проект построил на основе примеров входящих в дистрибутив TNKernel. Там везде проекты работают в режиме Supervisor. И мой проект соответственно тоже. Для чего? Правильно ли, что все происходит в этом режиме? Это обязательное условие для TNKernel?
2) Как можно программно отследить состояние стека? Или размер свободного ОЗУ. Хотелось бы в режиме #define DEBUG периодически выводить на терминал состояние памяти/стека...
Заранее спасибо за помощь.

p.s. проект в начальной стадии. пока просто :
-мигает светодиодами
-ведет свой календарь (время)
-выводит на ЖК это время (HH:MM:SS)
-опрос через АЦП одного датчика.
yurmala
и еще в догонку вопрос:

есть флаг
Код
program_event.id_event = 0; tn_event_create(&program_event, TN_EVENT_ATTR_MULTI,_PE_FLAG_RUN_|_PE_ALLOW_LEDS_|_PE_ALLOW_TIME_);

сбрасываю в прерывании флаг через битовую маску:
Код
tn_event_iset(&program_event,(_PE_FLAG_MENU_REFRESH_|_PE_FLAG_RUN_|_PE_ALLOW_LEDS_));

где
Код
#define _PE_FLAG_RUN_                (  1 <<  0)
#define _PE_FLAG_MENU_REFRESH_        (  1 <<  2)
#define _PE_ALLOW_LEDS_            (  1 <<  4)

при пошаговом исполнении вижу что биты во флаге сбрасываются, но задачи, которые должны были бы остановиться - продолжают работать. Вернее останавливается только задача, ожидающая один флаг/бит (_PE_FLAG_MENU_REFRESH_).

Все бы ничего, но при варианте со сбросом отдельных битов во флаге:
Код
tn_event_iset(&program_event,_PE_FLAG_MENU_REFRESH_);
tn_event_iset(&program_event,_PE_FLAG_RUN_);
tn_event_iset(&program_event,_PE_ALLOW_LEDS_);

работает четко. Задачи "останавливаются" - а именно переходят в режим ожидания флага....

получается что TNKernel не реагирует на "групповую" сброску битов во флаге?
Vlad27
Вроде бы для сброса флагов в прерывании предназначен сервис tn_event_iclear().
yurmala
Цитата(Vlad27 @ May 16 2011, 11:49) *
Вроде бы для сброса флагов в прерывании предназначен сервис tn_event_iclear().

пардон. моя ошибка. конечно, речь идет про установку флага. Но суть вопроса остается.
т.е. Задачи, ожидающие установку флага - запускаются не все, если флаг устанавливается "группой битов"
Код
tn_event_iset(&program_event,(_PE_FLAG_MENU_REFRESH_|_PE_FLAG_RUN_|_PE_ALLOW_LEDS_));

в этом случае запускается задача ожидающая флаг _PE_FLAG_MENU_REFRESH_ - и только она

в то время как установка флага побитно срабатывает корректно - все задачи запускаются.
Код
tn_event_iset(&program_event,_PE_FLAG_MENU_REFRESH_);
tn_event_iset(&program_event,_PE_FLAG_RUN_);
tn_event_iset(&program_event,_PE_ALLOW_LEDS_)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.