21,619
社区成员




void Main(void)
{
Target_Init();
GUI_Init();
OSInit();
Send_D7light_Sem = OSSemCreate(0); //创建信号量
OSTaskCreate(Task_1, (void *)0, (OS_STK *)&Stack_Task_1[STACKSIZE - 1], 5); //创建task_1任务
OSStart();
}
void Task_1(void *pdata)
{
INT32U i,flag=0;
Timer1_Init();
OSTaskCreate(Task_2, (void *)0, (OS_STK *)&Stack_Task_2[(STACKSIZE*3) - 1], 56); //创建task_2任务
for(;;)
{
flag++;
if(flag=2){
OSTimeDly(240); //延迟240ms
Uart_Printf("This is TASK1. %x\n",flag); //串口输出"This is TASK1. %x\n"
OSSemPost(Send_D7light_Sem); //释放信号量
flag=0;
}
}
}
void Task_2(void *pdata)
{
INT8U err,flag=0;
for(;;) {
OSSemPend(Send_D7light_Sem, 0, &err); //等待信号量
Uart_Printf("This is TASK2. \n"); //串口输出"This is TASK2. \n"
}
}
该段代码的执行流程:main中先创建task_1,然后再task_1中创建task_2。task_1的for中每循环2次,就延时240ms然后串口输出“This is TASK1. 2\n”,并且通知task_2进行串口输出,这是task_2接收到通知就通过串口输出"This is TASK2. \n"。task_2输出之后,再继续等待task_1中的通知。
所以最终1s内的输出应该是:
This is TASK1. 2 //240ms
This is TASK2.
This is TASK1. 2 //480ms
This is TASK2.
This is TASK1. 2 //720ms
This is TASK2.
This is TASK1. 2 //960ms
This is TASK2.
(注: //480ms为串口输出前面字符串的时间点)