Jump to content

    
Sign in to follow this  
yurmala

Вопросы по RTOS TNKernel 2.6

Recommended Posts

Здравствуйте! Есть Keil-овский проект на базе TNKernel. Через неопределенное время проект подвисает (причем не всегда), поэтому стал погружаться глубже в эту систему в поисках ответов.

Подскажите пожалуйста:

1) Проект построил на основе примеров входящих в дистрибутив TNKernel. Там везде проекты работают в режиме Supervisor. И мой проект соответственно тоже. Для чего? Правильно ли, что все происходит в этом режиме? Это обязательное условие для TNKernel?

2) Как можно программно отследить состояние стека? Или размер свободного ОЗУ. Хотелось бы в режиме #define DEBUG периодически выводить на терминал состояние памяти/стека...

Заранее спасибо за помощь.

 

p.s. проект в начальной стадии. пока просто :

-мигает светодиодами

-ведет свой календарь (время)

-выводит на ЖК это время (HH:MM:SS)

-опрос через АЦП одного датчика.

 

Share this post


Link to post
Share on other sites

и еще в догонку вопрос:

 

есть флаг

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 не реагирует на "групповую" сброску битов во флаге?

 

Share this post


Link to post
Share on other sites
Вроде бы для сброса флагов в прерывании предназначен сервис 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_)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this