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

TNKernel, TN_DQUE с размером очереди 0

В доке к 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;
}

 

 

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

 

 

 

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


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

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

 

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

 

вот чуть чего дока на русском

pic24.ru->tn_queue_create

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


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

Если указатель на массив NULL, тогда send разбудит задачу, которая ждет на этом TN_DQUE, елси никто на очереди не ждет - сообщение теряется...

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


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

Создаю очередь с параметрами 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) версии

 

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


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

Я поправил так

 

 

...
#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
...

 

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


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

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

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

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

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

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

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

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

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

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