|
//创建一个信号量
OSSemCreate ((OS_SEM* )&MY_SEM,
(CPU_CHAR* )"MY_SEM",
(OS_SEM_CTR)1,
(OS_ERR* )&err);
//任务1的任务函数,优先级为4
void task1_task(void *p_arg)
{
while(1)
{
printf("\r\n任务1:\r\n");
OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量
memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
delay_ms(10);
printf("%s\r\n",share_resource); //串口输出共享资源区数据
OSSemPost (&MY_SEM,OS_OPT_POST_1,&err); //发送信号量
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s
}
}
//任务2的任务函数,优先级为5
void task2_task(void *p_arg)
{
while(1)
{
printf("\r\n任务2:\r\n");
OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量
memcpy(share_resource,task2_str,sizeof(task2_str)); //向共享资源区拷贝数据
delay_ms(10);
printf("%s\r\n",share_resource); //串口输出共享资源区数据
OSSemPost (&MY_SEM,OS_OPT_POST_1,&err); //发送信号量
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s
}
}
我个人理解的任务切换过程:
1)、UCOS开始运行,任务1和任务2都处于就绪态,任务1优先级高首先得到运行,申请到信号量后,在延时函数里面执行任务切换,任务2开始运行,任务1进入等待状态,经过 OSTimeTick(),后进入就绪态,
2)、任务2运行到申请信号量的时候,由于信号量被任务1占用,所以任务2信号量失败,在OSSemPend()内部执行任务切换,任务1开始运行,任务2进入等待状态
3)、任务1从delay_ms(10)后开始执行,释放信号量,任务2获得信号量的使用权限进入就绪态,任务1在OSTimeDlyHMSM()里面执行任务切换,任务2开始运行,任务1,任务1进入 等待状态,经过OSTimeTick(),后进入就绪态,
4)、任务2从OSSemPend( );函数开始执行,执行到delay_ms(10)进行任务切换,任务1开始运行,任务2进入等待状态,经过 OSTimeTick(),后进入就绪态,任务1开始执行, 在OSSemPend()里面申请信号失败,执行任务切换,任务1被挂起进入等待状态,
5)、任务2从delay_ms(10)后面开始执行,释放信号量后,任务1进入就绪状态,任务2在OSTimeDlyHMSM();进行任务切换,任务1从OSSemPend()开始执行,任务2进入等待状态,经过 OSTimeTick(),后进入就绪态,
请高手看看这个过程里面哪里有问题
|
|