Перейти к содержанию
    

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

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

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

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

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

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

 

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

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

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

есть флаг

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде бы для сброса флагов в прерывании предназначен сервис tn_event_iclear().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...