Задача: по прерываниям(в данном случае от UART) заполнять очередь сообщений. Когда в очереди появляются сообщения необходимо их считать и сделать некоторую обработку.

Вот такая реализация.
По выставленным printf'ам похоже что сообщения приходят верные и помещаются в очередь, но не считываются от туда.Хотя количество сообщения изменяется верно.
Например по прерываниям от UART пришли сообщения 45 B0 F1, всего 3 сообщения. при чтении из очереди я 3 раза прочитаю 0. Подскажите что делаю не так.
Код
/* Definition of Task Stacks */
#define TASK_STACKSIZE 2048
OS_STK receive_uart_task_stk[TASK_STACKSIZE];


/* Definition of Task Prioities */
#define INITIALIZE_TASK_PRIORITY 6
#define RECEIVE_UART_PRIORITY 12

/* Definition of Message Queue */
#define MSG_QUEUE_SIZE 30 /*Size of message queue used in example*/
OS_EVENT *msgqueue; /*Message queue pointer */
void *msgqueueTbl[MSG_QUEUE_SIZE];/*Storage for messages*/


/* Local Function Prototypes */
int initOSDataStructs(void);
int initCreateTasks(void);

void uart_send_task(void* pdata){
INT8U return_code = OS_NO_ERR;
unsigned int msg = 0;
OS_Q_DATA queue_data;
unsigned short status;
status = IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE);
if( status & ALTERA_AVALON_UART_CONTROL_RRDY_MSK) {
msg = IORD_ALTERA_AVALON_UART_RXDATA(UART_0_BASE);
return_code = OSQQuery(msgqueue, &queue_data);
alt_ucosii_check_return_code(return_code);

printf("in msg=%x, num=%d\n",msg,queue_data.OSNMsgs);
if(queue_data.OSNMsgs < UART_QUEUE_SIZE) /*Check the number of messages*/
{ /*in the message queue*/
return_code = OSQPostOpt(msgqueue, (void *)&msg, OS_POST_OPT_BROADCAST);
alt_ucosii_check_return_code(return_code);
}
else
{
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
}

void receive_uart_task(void* pdata)
{
INT8U return_code = OS_NO_ERR;
unsigned int *msg;
while (1)
{
msg = (unsigned int *)OSQPend(msgqueue, 0, &return_code);
printf("uart_msg=%d,err=%d\n",*msg,return_code);
alt_ucosii_check_return_code(return_code);
OSTimeDlyHMSM(0, 0, 0, 50);
}
}


void initialize_task(void* pdata)
{
INT8U return_code = OS_NO_ERR;

initOSDataStructs();
alt_irq_register (UART_0_IRQ,NULL,uart_send_task);
initCreateTasks();

return_code = OSTaskDel(OS_PRIO_SELF);
alt_ucosii_check_return_code(return_code);
while (1);
}

int main (int argc, char* argv[], char* envp[])
{
INT8U return_code = OS_NO_ERR;

return_code = OSTaskCreateExt(initialize_task,
NULL,
(void *)&initialize_task_stk[TASK_STACKSIZE],
INITIALIZE_TASK_PRIORITY,
INITIALIZE_TASK_PRIORITY,
initialize_task_stk,
TASK_STACKSIZE,
NULL,
0);
alt_ucosii_check_return_code(return_code);
OSStart();
return 0;
}

int initOSDataStructs(void)
{
msgqueue = OSQCreate(&msgqueueTbl[0], MSG_QUEUE_SIZE);
return 0;
}

int initCreateTasks(void)
{
INT8U return_code = OS_NO_ERR;

return_code = OSTaskCreateExt(receive_uart_task,
NULL,
(void *)&receive_uart_task_stk[TASK_STACKSIZE],
RECEIVE_UART_PRIORITY,
RECEIVE_UART_PRIORITY,
receive_uart_task_stk,
TASK_STACKSIZE,
NULL,
0);
alt_ucosii_check_return_code(return_code);

return 0;
}