初级会员
- 积分
- 91
- 金钱
- 91
- 注册时间
- 2018-7-16
- 在线时间
- 22 小时
|
1金钱
本帖最后由 Rayc 于 2019-6-17 21:37 编辑
在原子哥UCOSIII使用信号量访问共享资源区的程序中,创建的信号量默认为1。我理解的运行顺序是这样的:
首先执行task1,串口输出“任务1:”,再运行到delay_ms(300)时会引起任务调度,这时候切换到task2,串口输出“任务2:”,但是task2中的OSSemPend()信号量为0导致阻塞,task2被挂起, 继续切回到task1,串口输出“First task Running!”,task1发送信号量后,切换到task2。以此类推。。。。
因此串口输出执行结果如下:
任务1:
任务2:
First task Running!
任务1:
Second task Running!
但实际的执行结果如下图:
这应该是我对任务调度和信号量的相关内容还理解的不透彻,但一直没找到是哪个地方没理解到位,请大神指点,谢谢。
相关代码如下:
[mw_shl_code=c,true]//任务1的任务函数
void task1_task(void *p_arg)
{
OS_ERR err;
u8 task1_str[]="First task Running!";
while(1)
{
printf("\r\n任务1:\r\n");
LCD_Fill(0,110,239,319,CYAN);
OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量
memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
delay_ms(300);
printf("%s\r\n",share_resource); //串口输出共享资源区数据
OSSemPost (&MY_SEM,OS_OPT_POST_1,&err); //发送信号量
LED0 = ~LED0;
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s
}
}
//任务2的任务函数
void task2_task(void *p_arg)
{
OS_ERR err;
u8 task2_str[]="Second task Running!";
while(1)
{
printf("\r\n任务2:\r\n");
LCD_Fill(0,110,239,319,BROWN);
OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量
memcpy(share_resource,task2_str,sizeof(task2_str)); //向共享资源区拷贝数据
delay_ms(300);
printf("%s\r\n",share_resource); //串口输出共享资源区数据
OSSemPost (&MY_SEM,OS_OPT_POST_1,&err); //发送信号量
LED1 = ~LED1;
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s
}
}[/mw_shl_code]
|
|