最近在学习uCOS系统,遇到了一些问题,请教一下各位,望赐教!
我是建立 一个消息队列,但是在task3_entry任务里发送消息队列不成功,串口调试发现时,事件类型已经改变了!即OSEventType被改变了,并不是消息队列类型OS_EVENT_TYPE_Q。
麻烦懂得朋友帮忙看看!
这是串口打印:
prio是任务切换时的打印信息,请结合代码!
代码如下:
其中
//设置任务堆栈大小
#define TASK1_STK_SIZE 64
#define TASK2_STK_SIZE 64
#define STARTUP_TASK_STK_SIZE 128
#define LCD_TASK_STK_SIZE 128
//设置任务优先级
#define TASK2_PRIO 9
#define TASK1_PRIO 6
#define STARTUP_TASK_PRIO 10
#define LCD_TASK_PRIO 5
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]#include "sys.h"
#include "usart.h"
#include "ucos_ii.h"
#include "led.h"
#include "lcd.h"
#include "delay.h"
#define Q_MSG_SIZE 10
OS_EVENT *lcd_sem;
OS_EVENT *test_mbox;
OS_EVENT *test_q;
INT8U *s1;
INT8U *s2;
INT8U *s3;
INT8U *ss;
INT8U *count;
INT8U times;
INT8U *cnt;
void *q_msgGrd[Q_MSG_SIZE];
INT8U err;
OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE-1];
OS_STK task1_stk[TASK1_STK_SIZE-1];
OS_STK task2_stk[TASK2_STK_SIZE-1];
OS_STK lcd_task_stk[LCD_TASK_STK_SIZE-1];
static void task1(void *p_arg);
static void task2(void *p_arg);
static void task3_entry(void *p_arg);
//----------系统“心跳”,1 MS中断-----//
static void systick_init(void)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8
SysTick->LOAD=(u32)9000;//外部时钟72M,SysTick Clk=72/8=9M
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL|=0x00000003 ; //开始倒数,并开启中断
}
static void startup_task(void* p_rag)
{
OS_CPU_SR cpu_sr = 0;
systick_init();
#if (OS_TASK_STAT_EN>0)
OSStatInit();
#endif
//lcd_sem=OSSemCreate(0);
//test_mbox=OSMboxCreate((void *)0);
test_q=OSQCreate (&q_msgGrd[0],Q_MSG_SIZE);
OS_ENTER_CRITICAL();
printf("\r\n[EVENT_TYPE1:%d]\r\n",test_q->OSEventType);
OS_EXIT_CRITICAL();
OSTaskCreate(task3_entry, (void *)0,
&lcd_task_stk[LCD_TASK_STK_SIZE-1], LCD_TASK_PRIO);
OSTaskCreate(task1, (void *)0,
&task1_stk[TASK1_STK_SIZE-1], TASK1_PRIO);
OSTaskCreate(task2, (void *)0,
&task2_stk[TASK2_STK_SIZE-1], TASK2_PRIO);
OSTaskDel(OS_PRIO_SELF);
}
static void task3_entry(void *p_arg)
{ OS_CPU_SR cpu_sr = 0;
INT8U Ms_id;
s1="s1s1s1s1s1s1s1s1";
OS_ENTER_CRITICAL();
printf("\r\n[EVENT_TYPE2:%d]\r\n",test_q->OSEventType);
OS_EXIT_CRITICAL();
OSQPostFront(test_q,s1);
for (;;)
{
s2="s2s2s2s2s2s2s2s2";
OSQPostFront (test_q,s2);
OSTimeDly (100);
s3="s3s3s3s3s3s3s3s3";
OSQPostFront (test_q,s3);
OSTimeDly (100);
}
}
static void task1(void *p_arg)
{
OS_CPU_SR cpu_sr = 0;
for (;;)
{
ss=OSQPend (test_q, 0,&err);
OS_ENTER_CRITICAL();
printf("\r\n%s\r\n",ss);
OS_EXIT_CRITICAL();
OSTimeDly (500);
}
}
static void task2(void *p_arg)
{
OS_CPU_SR cpu_sr = 0;
for (;;)
{
ss=OSQPend (test_q, 0,&err);
OS_ENTER_CRITICAL();
printf("\r\n%s\r\n",ss);
OS_EXIT_CRITICAL();
OSTimeDly (500);
}
}
int main(void)
{
Stm32_Clock_Init(9);
uart_init(72,9600);
led_init();
OSInit();
OSTaskCreate(startup_task,(void *)0,
&startup_task_stk[STARTUP_TASK_STK_SIZE-1],
STARTUP_TASK_PRIO);
OSStart();
return 0;
}[/mw_shl_code]
|