Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TNKernel IAR ARM Plugin
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
Nixon
По мотивам примера из С-Spy SDK (спасибо Ксении за него) начал я писать плагин для отладки приложений с TNKernel (пока только для ARM). На данным момент реализовано только обзор задач и их состояния. По примеру сделанного будет писаться и остальное (event, mutex и т.д.).

В общем если будут пожелания и рекомендации - пишите.

P.S. TNKernel я чуток модифицировал (добавил имена для всех системных объектов - удобнее, например, видеть имя задачи, а не адрес ее функции в списке задач), но по идее плагин будет работать и на чистой авторской RTOS.

P.S.S. Архив распаковывать в \IAR Systems\Embedded Workbench 6.0\arm\plugins\rtos\

Grape
спасибо!

а нельзя ли для 5.4 собрать?

в шестой версии оптимизатор на уровне HIGH иногда живет своей жизнью....


да, imho tn_create_queue портится при удалении задачи

task_set_dormant_state вызывает queue_reset(&(task->create_queue))
до удаления из очереди.

или я ошибаюсь?

Код
void tn_task_exit(int attr)
{
.....

   task = tn_curr_run_task;
   task_to_non_runnable(tn_curr_run_task);

   task_set_dormant_state(task);  // !!!!!!!!!!!!!!!!!!!!!!!!!

   ptr_stack = tn_stack_init(task->task_func_addr,
                             task->stk_start,
                             task->task_func_param);
   task->task_stk = ptr_stack;  //-- Pointer to task top of stack,when not running

   if(task->activate_count > 0)  //-- Cannot exit
   {
      task->activate_count--;
      task_to_runnable(task);
   }
   else  // V 2.6 Thanks to Alex Borisov
   {
      if(attr == TN_EXIT_AND_DELETE_TASK)
      {
         queue_remove_entry(&(task->create_queue));
         queue_reset(&(task->create_queue));        
         tn_created_tasks_qty--;
        
         task->id_task = 0;  
                  
         tn_task_del_hook(task);
      }
   }

   tn_switch_context_exit();  // interrupts will be enabled inside tn_switch_context_exit()
}


/gr
Nixon
Для 5.4 у меня нет SDK sad.gif

Сейчас добавил вместо адресов символьные имена TCB и других управляющих структур, имена объектов ожидания задач, закладку для мьютексов и событий. Осталось немного sm.gif

Вопрос к автору TNKernel - при инициализации стека задач он заполняется специальным паттерном. Сейчас это - 0xFFFFFFFF, что иногда приводит к неправильному расчету максимального потребления стека (некоторые системные функции могут вызываться с параметром -1). Может стоит заменить паттерн на что-то более экзотическое?
Nixon
IAR 6.xx TNKernel RTOS (ARM) Plugin 1.0a

Поддерживает TNKernel 2.6 для ARM и Cortex. TNKernel используется в авторском варианте со следующим изменением:
- в файле tn_port.h значение #define TN_FILL_STACK_VAL замененен с 0xFFFFFFFF на 0xDEADBEEF (для точного расчета % расхода стека)

Плагин отображает следующие объекты TNKernel их параметры:
task - имя TN_TCB задачи, приоритет, состояние, причина ожидания, объект ожидания, начало стека, конец стека, размер стека, текущее положение стека, % максимального использования стека, % текущего использования стека
mutex - имя TN_MUTEX мьютекса, тип, приоритет (для Ceiling), счетчик, захватившая задача
semaphore - имя TN_SEM семафора, счетчик, макс. значение счетчика, список задач ожидания
event - имя TN_EVENT события, тип, текущий паттерн, список задач ожидания
queue - имя TN_DQUE очереди, адрес массива, размер массива, голова, хвост, список задач ожидания записи, список задач ожидания чтения
memory pool - имя TN_FMP пула памяти, адрес пула, размер блока, кол-во блоков в пуле, кол-во свободных блоков, список задач ожидания

Кроме указанных выше нужных изменений в TNKernel (хотя если их не сделать, то будет неправильно показан только % максимального использования стека задачи) в моем варианте TNKernel все системные объекты RTOS имеют текстовые имена и добавлены функции присвоения этих имен. Это несколько визуализирует отладку TNKernel.
Данная возможность определяется через #define DEBUG_USENAME.
например так
Код
/----- Semaphore -----
typedef struct _TN_SEM
{
   CDLL_QUEUE  wait_queue;
   int count;
   int max_count;
   int id_sem;     //-- ID for verification(is it a semaphore or another object?)
                         // All semaphores have the same id_sem magic number (ver 2.x)
#ifdef DEBUG_USENAME
   char *name;                                //-- Semaphore name
#endif
в tn.h и
Код
//----------------------------------------------------------------------------
#ifdef DEBUG_USENAME
int tn_sem_set_name(TN_SEM * sem, char * str)
{
#if TN_CHECK_PARAM
    if(sem == NULL) return TERR_WRONG_PARAM;
#endif
    sem->name = str;

  return TERR_NO_ERR;
}
#endif
в tn_sem.c. И так для всех объектов TNKernel. В общем кому надо - сделает сам.

По сути данный плагин подходит для любых процессоров, у которых размеры системных объектов совпадают с размерами таковых для ARM, но при необходимости можно переделать его под любой порт TNKernel.

megajohn
Цитата(Nixon @ Mar 2 2012, 18:12) *
IAR 6.xx TNKernel RTOS (ARM) Plugin 1.0a


благодарствую, стало легче =)

Кто не в кусе, выкладываю скриншот что в итоге получается
megajohn
после удаления задачи, вызов окна TNkernel->Task list производит зависание IAR

или я не правильно удаляю smile3046.gif


#define TASK_DELETE(name)\
{ if( name.task_state != TSK_STATE_DORMANT ) task_set_dormant_state( &name );\
int ret = tn_task_delete(&name);\
ASSERT( ret == TERR_NO_ERR ); }

Nixon
Хм, возможность зависания существует (while по двусвязному списку без ограничения итераций присутствует). Но теоретически связность списка задач не должна нарушаться, хотя в принципе, для плагина атомарности функций rtos не существует - от вычитывает данные когда захочет, что может привести к указанному вами результату.

2 megajohn - я помню о своем обещании вернуться к плагину осенью, но пока слишком загружен. Если у вас есть желание то могу отдать исходники и вы можете посмотреть сами. Пишите в личку.
kosyak©
Вот в отладчике ИАРа есть окно Symbolic Memory, он там по адресу узнает имя переменной. нельзя ли сделать подобное в плагине? Тогда отпадет необходимость в функциях вида - tn_sem_set_name ?
Nixon
Внутреннее название переменных и так выводится. Просто было требование вместо вывода типа "task1" выводить нечто более вразумительное типа "Задача обсуживания USB". Как по мне это лишнее, но...

P.S. В скриншоте от megajohn показана работа плагина на почти чистой авторской TNKernel - как видно названия задач (функций задач) там выводятся.
Grape
проблема похоже не в плагине, а в tnkernel.

task_set_dormant_state сбрасывает task->create_queue,
а после, в tn_task_delete задача удаляется из глобального
списка и список портится.

kosyak©
А как интерпретировать колонки %Max и %Current ?
Я так понимаю что это использование стэка - макисмальный и текущий...тык вот у меня текущий больше чем максимальный...как быть?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.