消息队列的使用:
static OS_STK task_testled[STARTUP_TASK_STK_SIZE];
static OS_STK task_testluart1[STARTUP_TASK_STK_SIZE];
static OS_STK task_testluart2[STARTUP_TASK_STK_SIZE];
#define N_MESSAGES 128
void *MsgGrp[N_MESSAGES]; /* 定义消息指针数组 */
OS_EVENT *Str_Q;
u8 err = 0;
void TestUart1 ( void *p_arg ) {
char *recv = NULL;
for ( ;; ) {
recv = OSQPend ( Str_Q, 0, &err );
printf ( "Uart1 get %s\r\n", recv );
OSTimeDlyHMSM ( 0, 0, 0, 500 );
}
}
void TestUart2 ( void *p_arg ) {
char *recv = NULL;
for ( ;; ) {
recv = OSQPend ( Str_Q, 0, &err );
printf ( "Uart2 get %s\r\n", recv );
OSTimeDlyHMSM ( 0, 0, 0, 500 );
}
}
void TestLed ( void *p_arg ) {
char *send1 = "send_1";
char *send2 = "send_2";
for ( ;; ) {
OSQPostFront ( Str_Q, send1 );
OSQPostFront ( Str_Q, send2 );
LED0 = !LED0;
OSTimeDlyHMSM ( 0, 0, 1, 0 );
}
}
int main ( void ) {
SysTick_init();
LED_Init();
uart_init ( 9600 );
OSInit();
Str_Q = OSQCreate ( &MsgGrp[0], N_MESSAGES ); /* 创建消息队列 */
OSTaskCreate ( TestLed, ( void * ) 0, &task_testled[STARTUP_TASK_STK_SIZE - 1], STARTUP_TASK_PRIO - 1 );
OSTaskCreate ( TestUart1, ( void * ) 0, &task_testluart1[STARTUP_TASK_STK_SIZE - 1], STARTUP_TASK_PRIO );
OSTaskCreate ( TestUart2, ( void * ) 0, &task_testluart2[STARTUP_TASK_STK_SIZE - 1], STARTUP_TASK_PRIO + 1 );
OSStart();
return 0;
}