目的
学习和理解实时操作系统
声明
习题答案是笔者基于相关书籍和网上内容自己理解的,有不对或疑问的地方大家一起沟通
十三.编写一个有3个任务的应用程序,每个任务均会在显示器上显示一个字符,并让三个任务有不同的等待时间,观察应用程序运行中任务被调度的情况?
方法:创建三个任务task0_func;task1_func;task2_func,任务中分别演示10ms,20ms,30ms翻转下GPIOB0,GPIOB1,GPIOB2代替显示字符
预期:
GPIO翻转的先后顺序GPIOB0,GPIOB1,GPIOB2;
GPIO翻转的时间GPIOB0 10ms翻转一次;GPIOB1 20ms翻转一次;GPIOB2 30ms翻转一次。
实验结果如下:
注:task0_func;task1_func;task2_func分别对应上图红色,绿色,黄色
关键代码
//创建三个任务
OSTaskCreate(task0_func,(void*)0,&unAppStackArr[0][127],0);
OSTaskCreate(task1_func,(void*)0,&unAppStackArr[1][127],1);
OSTaskCreate(task2_func,(void*)0,&unAppStackArr[2][127],2);
//每个任务中的执行函数
void task0_func(void *p_arg)
{
for(;;)
{
FlipPin(FLIP_PIN0,10);
}
}
void task1_func(void *p_arg)
{
for(;;)
{
FlipPin(FLIP_PIN1,20);
}
}
void task2_func(void *p_arg)
{
for(;;)
{
FlipPin(FLIP_PIN2,30);
}
}
十四.编写一个有3个任务的应用程序,每个任务均会在显示器上显示一个字符,并让一个任务查询另外两个任务的信息,并在显示器上显示出来。
方法:在第十三题的基础上,在task1_func中调用OSTaskQuery函数查询task0_func和task2_func的任务控制块,并将任务控制块中的优先级打印出来。
预期:task0_func任务控制块中的优先级为0;task2_func任务控制块中的优先级为2
实验结果如下:
关键代码:
void task1_func(void *p_arg)
{
int8_t chRet = 0;
for(;;)
{
FlipPin(FLIP_PIN1,20);//OSTaskQuery
chRet = OSTaskQuery (TASK0_FUNC_PRIO,&stOsTcbTask);
if (OS_ERR_NONE != chRet)
{
printf("Query Task0 TCB error:0x%xn",chRet);
}
else
{
printf("Query Task0 prior:%dn",stOsTcbTask.OSTCBPrio);
}
memset((void*)&stOsTcbTask,0,sizeof(OS_TCB));
chRet = OSTaskQuery (TASK2_FUNC_PRIO,&stOsTcbTask);
if (OS_ERR_NONE != chRet)
{
printf("Query Task2 TCB error:0x%xn",chRet);
}
else
{
printf("Query Task2 prior:%dn",stOsTcbTask.OSTCBPrio);
}
}
}
十五.编写一个有3个任务的应用程序,并让其中两个任务在合适的时候删除自己
方法:在第十四题代码的基础上,task0_func,task1_func,task2_func三个任务中分别不停的打印字符0,1,2;其中task0_func和task2_func分别在执行2次和3次的时候删除自己。
预期:task0_func和task2_func在分别打印2次字符0,3次字符2后不再打印,task1_func一直不停的打印字符1。
实验结果如下:
关键代码 :
void task0_func(void *p_arg)
{
static int32_t nTask0RunCnt = 0;
int8_t chRet = 0;
for(;;)
{
nTask0RunCnt++;
printf("0n");
FlipPin(FLIP_PIN0,10);
if (2 == nTask0RunCnt)
{
chRet = OSTaskDel(OS_PRIO_SELF);
if (OS_ERR_NONE != chRet)
{
printf("Query Task0 Del error:0x%xn",chRet);
}
}
}
}
void task2_func(void *p_arg)
{
static int32_t nTask2RunCnt = 0;
int8_t chRet = 0;
for(;;)
{
nTask2RunCnt++;
printf("2n");
FlipPin(FLIP_PIN2,30);
if (3 == nTask2RunCnt)
{
chRet = OSTaskDel(OS_PRIO_SELF);
if (OS_ERR_NONE != chRet)
{
printf("Query Task2 Del error:0x%xn",chRet);
}
}
}
}
十六.编写一个有3个任务的应用程序,在调度器每进行一次任务切换后在显示器上显示正在运行任务的任务控制块指针
方法:直接在内核代码任务调度函数中将当前运行任务控制块打印出来,即在OS_Sched函数中将OSTCBCur指针中内容打印出来即可
预期和实验结果略



