Цитата(zltigo @ Dec 6 2008, 02:18)

В приведенном коде своих проблем для начала выше головы.
1.Всякой мути надергано и сляпано из каких-то исходников

2.Выделение динамической памяти в обработчике прерывания без всякой надобности да еще и не освобождается при этом.
3.Для копирования в очередь передается не указатель на CAN буфер а указатель на этот указатель..
4.Вызов каой-то мутной печати из обработчика..
5......
извините, возможно я не совсем (или совсем не) разбираюсь в теме, но у меня есть следующие возражения:
пункт3:
поскольку объекты сообщения типа xCANMsg занимают в памяти 16 байт, то накладно было бы их копировать по значению (а в очереди freeRTOS данные по значению и копируются - Items are queued by copy not reference), следовательно я храню в очереди указатель.
Объявление очереди:
receiveCANQueue = xQueueCreate( 40, sizeof( struct xCANMsg * ) );//содержит указатели на xCANMsg
В
Цитата
а указатель на этот указатель
Из описания API работы с очередями с freeRTOS.org:
portBASE_TYPE xQueueSendToBackFromISR(
xQueueHandle pxQueue,
const void *pvItemToQueue,
portBASE_TYPE *pxHigherPriorityTaskWoken
);
где pvItemToQueue - A
pointer to the item that is to be placed on the queue. The size of the items the queue will hold was defined when the queue was created, so this many bytes will be copied from pvItemToQueue into the queue storage area.
Следовательно, если я хочу поместить указатель на xCANMsg в очередь, я должен передать указатель на него, т.е. указатель на указатель.
пункт2: Я не знаю как можно по-другому организовать приём сообщений от CAN и постановку их в очередь. Если "просто" обьявить переменную типа xCANMsg и передать указатель на неё в очередь, то следующее принятое сообщение затрёт предыдущее, поскольку будет записываться на то же место. Или может быть я заблуждаюсь?
Насчёт освобождения памяти - я его освобождаю в том task'е, где я обрабатываю это сообщение:
if( xQueueReceive( receiveCANQueue, &( pRecMsg ), ( portTickType ) 1 ) )
{
//mirror message
pMsg->Frame = pRecMsg->Frame; // 29-bit, no RTR, DLC is 8 bytes
pMsg->MsgID = pRecMsg->MsgID; // CAN ID
pMsg->DataA = pRecMsg->DataA;
pMsg->DataB = pRecMsg->DataB;
//free memory pRecMsg
vPortFree(pRecMsg) ;
CAN1_SendMessage( pMsg ) ;
}
пункт4: вполне согласен. Вопрос: как печатать сообщения: оформлять отдельный task с очередью, в которую передавать указатели на строки, которые нужно распечатать и из task'a их печатать?
Буду рад любым замечаниям.