Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TNKernel, TN_DQUE с размером очереди 0
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
kosyak©
В доке к TNKernel (правда для версии 2.3) написано:

Цитата
int tn_queue_create (TN_DQUE * dque, void ** data_fifo, int num_entries )
Parameters:
dque Pointer to already allocated TN_DQUE structure of data queue to be created
data_fifo Pointer to already existing array to store data queue entries.
Each array element size equates sizeof (void*). data_fifo can be NULL.
num_entries Capacity of the data queue (max number of entries). Can be 0.


Создаю очередь с параметрами tn_queue_create(&queue, NULL, 0).
Отключаю макрос TN_CHECK_PARAM.
И падаю в ХардФаулт при вызове tn_queue_send_polling(&queue, (void*)123),

Код
//---------------------------------------------------------------------------
int  dque_fifo_write(TN_DQUE * dque, void * data_ptr)
{
   register int flag;

#if TN_CHECK_PARAM
   if(dque == NULL)
      return TERR_WRONG_PARAM;
   if(dque->num_entries <= 0)
      return TERR_OUT_OF_MEM;
#endif

   flag = ((dque->tail_cnt == 0 && dque->header_cnt == dque->num_entries - 1)
             || dque->header_cnt == dque->tail_cnt-1);
   if(flag)
      return  TERR_OVERFLOW;  //--  full

   //-- wr  data
   ------------падает ессно здесь-------------------
   dque->data_fifo[dque->header_cnt] = data_ptr;
   dque->header_cnt++;
   if(dque->header_cnt >= dque->num_entries)
      dque->header_cnt = 0;
   return TERR_NO_ERR;
}



Как бы покрасивше поправить такое поведение?


megajohn
если хотите передавать сообщение из одной задачи в другую, то нужно создавать с указателем на реальный массив с реальным числом элементов.

Что вы хотите добится с NULL и 0 я не могу понять практического смысла данных действий

вот чуть чего дока на русском
pic24.ru->tn_queue_create
kosyak©
Если указатель на массив NULL, тогда send разбудит задачу, которая ждет на этом TN_DQUE, елси никто на очереди не ждет - сообщение теряется...
yuri_t
Цитата(kosyak© @ Jun 22 2013, 12:13) *
Создаю очередь с параметрами tn_queue_create(&queue, NULL, 0).
Отключаю макрос TN_CHECK_PARAM.
И падаю в ХардФаулт при вызове tn_queue_send_polling(&queue, (void*)123),

...

Как бы покрасивше поправить такое поведение?



Так не верно

Код
#if TN_CHECK_PARAM
   if(dque == NULL)
      return TERR_WRONG_PARAM;
   if(dque->num_entries <= 0)
      return TERR_OUT_OF_MEM;
#endif


А так верно


Код
#if TN_CHECK_PARAM
   if(dque == NULL)
      return TERR_WRONG_PARAM;
#endif

   if(dque->num_entries <= 0)
      return TERR_OUT_OF_MEM;


Исправлю в следующей (2.7) версии
kosyak©
Я поправил так


Код
...
#if TN_CHECK_PARAM
   if(dque == NULL)
      return TERR_WRONG_PARAM;

//  такую проверку нужно делать внезависимости от макроса TN_CHECK_PARAM
//   if(dque->num_entries <= 0)
//      return TERR_OUT_OF_MEM;

#endif

   flag = ( dque->data_fifo == NULL || dque->num_entries <= 0 ||
            (dque->tail_cnt == 0 && dque->header_cnt == dque->num_entries - 1) ||
            dque->header_cnt == dque->tail_cnt-1);
   if(flag)
      return  TERR_OVERFLOW;  //--  full
...

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.