UCOSIII移植到UCOSII—任务挂起/恢复/钩子/(保姆级教程)

移植主要是函数定义不太一样,请大家多多使用Go To Definition

UCOSIII移植到UCOSII—任务挂起/恢复/钩子/(保姆级教程)_第1张图片
实现目标

  • 将UCOS3的例程6-2/7-1移植整合到UCOS2

  • 实现在ucos2任务的创建、删除、挂起、恢复

  • 学习空闲任务的运行机制和钩子函数使用
    目标效果:

  • 设计3个任务,任务A用于创建其他任务,创建完成后就删除掉自身

  • 任务B和C在LCD上有各自的运行区域,每隔1s都切换一次各自的背景颜色,并显示各自的运行次数,并从串口输出PC串口调试器中

  • 任务B运行5次以后挂起任务C,当任务B运行10次后重新恢复任务C

  • 另有空闲任务的钩子函数,当空闲任务每运行50000次通过串口打印“Idle Task Running 50000 times!”

  • 任务B、C和hook函数的串口输出应是完整字符串,不得相互打断

理论基础:
嵌入式实时操作系统UCOSII pdf
提取码:ah72

  1. 工程头文件导入#include"lcd.h"

以下步骤可在你编译报错时再来操作

1.需要在HARDWARE中添加头文件
2. 还要在include path中把lcd文件夹的路径添加进去
3.最后还需要把fsmc文件添加到工程目录UCOSIII移植到UCOSII—任务挂起/恢复/钩子/(保姆级教程)_第2张图片

  1. 任务设置声明
任务设置 UCOS2函数
任务优先级 #define START_TASK_PRIO 3
堆栈大小 #define START_STK_SIZE 128
任务堆栈 OS_STK START_TASK_STK[START_STK_SIZE];
任务函数 void start_task(void *p_arg);

UCOS3和UCOS2一些函数不一样比如任务堆栈设置

CPU_STK START_TASK_STK[START_STK_SIZE];//UCOS3
OS_STK START_TASK_STK[START_STK_SIZE];//UCOS2
UCOSIII移植到UCOSII—任务挂起/恢复/钩子/(保姆级教程)_第3张图片
3. 任务创建OSTaskCreate
ucos2和ucos3的任务创建定义是不同的,ucos3会多了很多参数
比较:
UCOSIII移植到UCOSII—任务挂起/恢复/钩子/(保姆级教程)_第4张图片
UCOS3任务创建定义和UCOS2创建任务定义函数的对比:
函数的定义不同,函数的写法自然不同。所以大家要利用好Go To Definition 这个工具
UCOSIII移植到UCOSII—任务挂起/恢复/钩子/(保姆级教程)_第5张图片
根据实现的目标我们需要创建三个任务,开始任务和task1、task2.

  • 按照前面格式设置好三个任务声明(优先级、堆栈、堆栈大小、任务函数)
  • 在main中初始化各个函数,创建开始任务start_task
  • 在start任务中创建task1、task2后将自己删除
  • task1中执行LCD背景切换,并在执行5次后挂起task2,执行10次后恢复task2
	if(task1_num==5) 
		{
			//OSTaskSuspend((OS_TCB*)&Task2_TaskTCB,&err);//UCOS3任务挂起函数
			OSTaskSuspend(TASK2_TASK_PRIO);//ucos2的任务挂起函数
			printf("任务1将任务2挂起!\r\n");
		}
		if(task1_num==10) 
		{
			//OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err);	//UCOS3任务恢复
			OSTaskResume(TASK2_TASK_PRIO);//UCOS2的任务恢复函数
			printf("任务1将任务2恢复!\r\n");
		}

  1. CPU_SR_ALLOC();是UCOS3的一个函数对临界资源进行初始化,

在这里插入图片描述
在ucos2中我们使用OS_CPU_SR cpu_sr=0;对临界资源进行初始化

  1. 延时函数OSTimeDlyHMSM
    我们查看UCOS2的延时函数的定义如下:
    UCOSIII移植到UCOSII—任务挂起/恢复/钩子/(保姆级教程)_第6张图片
    所以对UCOS2的延时函数修改很简单,
    UCOS3:OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
    UCOS2:OSTimeDlyHMSM(0,0,1,0)//延时1s;
  2. 空闲任务钩子函数的使用
  • 空闲函数在UCOS初始化开启后OSStart();就自行创建了,故不需要像task1那样我们自己设置堆栈、优先级、任务函数等。空闲函数的优先级为63即最低优先级,当就绪表中没有其他任务排队时执行空间函数。

  • 空闲函数执行的标志位,如何判断是否执行空闲函数,UCOS2提供了标志位 OS_CPU_HOOKS_EN 即开关量。
    该标志位在UCOS3中的定义为OS_CFG_APP_HOOKS_EN

  • 故移植过程中你如果直接把UCOS3例程中的空闲钩子搬过来虽然编译不会报错,但是该值在UCOS2中是没有定义的,所以你的运行效果看不到空闲函数,因为它根本没有执行!
    UCOSIII移植到UCOSII—任务挂起/恢复/钩子/(保姆级教程)_第7张图片
    3) 对空间函数内的内容进行修改
    由于用户不能自己定义空闲任务的任务函数要通过钩子函数对空闲任务的内容进行修改OSTaskIdleHook (void)。该函数在os_cpu_c.c文件中。

#if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251
int count=0;
void  OSTaskIdleHook (void)
{
 count++;
   if(count==50000)
	 {
	 printf("ldle Task Running 50000 times!\n");
	 count=0;
	 }
}
#endif

最终实验效果
UCOSIII移植到UCOSII—任务挂起/恢复/钩子/(保姆级教程)_第8张图片

Enjoy!?

你可能感兴趣的:(小白)