kosyak© 0 22 июня, 2013 Опубликовано 22 июня, 2013 · Жалоба В доке к 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 3 23 июня, 2013 Опубликовано 23 июня, 2013 · Жалоба если хотите передавать сообщение из одной задачи в другую, то нужно создавать с указателем на реальный массив с реальным числом элементов. Что вы хотите добится с NULL и 0 я не могу понять практического смысла данных действий вот чуть чего дока на русском pic24.ru->tn_queue_create Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kosyak© 0 23 июня, 2013 Опубликовано 23 июня, 2013 · Жалоба Если указатель на массив NULL, тогда send разбудит задачу, которая ждет на этом TN_DQUE, елси никто на очереди не ждет - сообщение теряется... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yuri_t 0 27 июня, 2013 Опубликовано 27 июня, 2013 · Жалоба Создаю очередь с параметрами 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© 0 30 июня, 2013 Опубликовано 30 июня, 2013 · Жалоба Я поправил так ... #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 ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться