新手入门
- 积分
- 1
- 金钱
- 1
- 注册时间
- 2020-8-4
- 在线时间
- 0 小时
|
1金钱
本帖最后由 额鲁巴公爵 于 2016-10-19 19:29 编辑
如图,这是我的代码。
我的想法是,A任务按键检测到的键值,通过消息队列给任务B,任务B检测10MS,如果超时的话,则执行某逻辑
求教下到底怎么样才是检测消息队列是否超时的正确方法呢?
我的想法是给程序100MS的检测时间,(上面的那个1已经改成10了。系统时间是10u),如果检测不到消息则LED灯反转。但是并没有出现这样的现象
还有一个问题是
如果我把OS_OPT设置为OS_OPT_PEND_NON_BLOCKING,那么A任务的键值检测都没法运行了……
但是如果我把OS_OPT设置为OS_OPT_PEND_BLOCKING,不光A任务的检测能运行,B任务也不会卡在等待消息的代码那边。
这一系列现象弄得我有点凌乱……
p=OSTaskQPend ((OS_TICK )1, //超时时间1
(OS_OPT ) OS_OPT_PEND_NON_BLOCKING, //
(OS_MSG_SIZE *)&size,
(CPU_TS *)0,
(OS_ERR *)err);
//if( err == OS_ERR_TIMEOUT)
//{
// LED0=~LED0;
//}
void task1_task(void *p_arg)
{
u8 task1_num=0;
u8 *keyval;
u8 keyscan;
OS_ERR err;
CPU_SR_ALLOC();
task1_num=task1_num;
p_arg = p_arg;
POINT_COLOR = BLACK;
OS_CRITICAL_ENTER();
LCD_DrawRectangle(5,110,115,314); //画一个矩形
LCD_DrawLine(5,130,115,130); //画线
POINT_COLOR = BLUE;
LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
OS_CRITICAL_EXIT();
while(1)
{
//LCD_ShowString(6,111,110,16,16,"fuckyou");
keyscan=KEY_Scan(0);
keyval=&keyscan;
if(keyscan!=0)
{
POINT_COLOR = BLUE;
OSTaskQPost ((OS_TCB *)&Task2_Task_TCB, //向任务2发送消息
(void *)keyval,
(OS_MSG_SIZE )10,
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR *)&err);
}
//task1_num++;
//POINT_COLOR = BLUE;
//LCD_ShowxNum(206,111,task1_num,3,16,0x80); //显示任务执行次数
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);
}
}
//task2任务函数
void task2_task(void *p_arg)
{
u32 task2_num=0;
OS_MSG_SIZE size;
u8 *p;
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
POINT_COLOR = BLACK;
OS_CRITICAL_ENTER();
LCD_DrawRectangle(125,110,234,314); //画一个矩形
LCD_DrawLine(125,130,234,130); //画线
POINT_COLOR = BLUE;
LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
OS_CRITICAL_EXIT();
while(1)
{
p=OSTaskQPend ((OS_TICK )1, //超时时间1
(OS_OPT ) OS_OPT_PEND_NON_BLOCKING, //
(OS_MSG_SIZE *)&size,
(CPU_TS *)0,
(OS_ERR *)err);
//if( err == OS_ERR_TIMEOUT)
//{
// LED0=~LED0;
//}
LCD_ShowxNum(250,111,*p,3,16,0x80);
switch (*p)
{
case 1 : LED1=~LED1; break;
case 2: display(); break;
case 3: OSTaskSuspend((OS_TCB *)&Task2_Task_TCB,(OS_ERR *)&err); break;
case 4: OSTaskResume((OS_TCB *)&Task2_Task_TCB,(OS_ERR *)&err); break;
}
POINT_COLOR = BLUE;
LCD_ShowxNum(206,111,task2_num,3,16,0x80); //显示任务执行次数
display();
OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
}
}
|
|