关于μC/OS-II系统的一段代码,求分析

C_minus 2018-11-22 08:58:39
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);

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);

for(;;)

{ flag++;

if(flag=2){

OSTimeDly(240);

Uart_Printf("This is TASK1. %x\n",flag);

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");

}

}

写出1秒中内超级终端的输出内容


楼主最近在上嵌入式系统的课程,但没学懂,望大神赐教,解释的越详细越好

...全文
244 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
架构师李肯 2018-12-19
  • 打赏
  • 举报
回复
2楼是正解,相当于任务1和任务2做同步
maplele20 2018-11-23
  • 打赏
  • 举报
回复
话说可以结贴了吗
maplele20 2018-11-23
  • 打赏
  • 举报
回复
引用 4 楼 C_minus 的回复:
我有个疑问,为什么task_1会通知task_2进行串口输出?我觉得task_1的优先级比task_2的优先级高,为什么不是一直打印task_1的内容?
task_1中OSTimeDly(240); //延迟240ms这段代码是指task_1中会休眠240ms,在task_1休眠的时候,task_2就被执行了。所以不会是task_1一直打印的。
C_minus 2018-11-23
  • 打赏
  • 举报
回复
我有个疑问,为什么task_1会通知task_2进行串口输出?我觉得task_1的优先级比task_2的优先级高,为什么不是一直打印task_1的内容?
  • 打赏
  • 举报
回复
自己的作业自己做
maplele20 2018-11-23
  • 打赏
  • 举报
回复

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为串口输出前面字符串的时间点)
dupao1865 2018-11-23
  • 打赏
  • 举报
回复
TASK1在释放信号Send_D7light_Sem而TASK2 在申请信号Send_D7light_Sem
因为TASK1有延时所以在这里会耗时找到时钟节拍代表的时间T,T*240就代表一次延时所需要的时间t
输出就显而易见了1/t 算出次数就是任务的TASK1-TASK2的交替次数了

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧