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

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

Alt
实现目标

  • 将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文件添加到工程目录在这里插入图片描述

  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
在这里插入图片描述
3. 任务创建OSTaskCreate
ucos2和ucos3的任务创建定义是不同的,ucos3会多了很多参数
比较:
在这里插入图片描述
UCOS3任务创建定义和UCOS2创建任务定义函数的对比:
函数的定义不同,函数的写法自然不同。所以大家要利用好Go To Definition 这个工具
在这里插入图片描述
根据实现的目标我们需要创建三个任务,开始任务和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的延时函数的定义如下:
    在这里插入图片描述
    所以对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中是没有定义的,所以你的运行效果看不到空闲函数,因为它根本没有执行!
    在这里插入图片描述
    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

最终实验效果
在这里插入图片描述

Enjoy!?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是UCOSIII操作系统任务创建、删除、挂起恢复的实验代码注解: ```c #include "includes.h" // UCOSIII头文件 // 任务堆栈大小 #define TASK_STACK_SIZE 512u // 任务优先 #define TASK1_PRIO 1u #define TASK2_PRIO 2u // 任务堆栈空间 static CPU_STK Task1Stk[TASK_STACK_SIZE]; static CPU_STK Task2Stk[TASK_STACK_SIZE]; // 任务控制块 static OS_TCB Task1TCB; static OS_TCB Task2TCB; // 任务函数 static void Task1(void *p_arg); static void Task2(void *p_arg); int main(void) { OS_ERR err; // 初始化UCOSIII OSInit(&err); // 创建任务1 OSTaskCreate(&Task1TCB, // 任务控制块 "Task 1", // 任务名 Task1, // 任务函数 DEF_NULL, // 传递给任务函数的参数 TASK1_PRIO, // 任务优先 &Task1Stk[0], // 任务堆栈起始地址 TASK_STACK_SIZE / 10u, // 任务堆栈大小 TASK_STACK_SIZE, // 任务堆栈空间 0u, // 任务扩展选项 OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR, // 任务选项 &err); // 创建任务2 OSTaskCreate(&Task2TCB, "Task 2", Task2, DEF_NULL, TASK2_PRIO, &Task2Stk[0], TASK_STACK_SIZE / 10u, TASK_STACK_SIZE, 0u, OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR, &err); // 启动UCOSIII内核 OSStart(&err); return 0; } // 任务1 static void Task1(void *p_arg) { OS_ERR err; while (DEF_TRUE) { // 执行任务1的操作 // ... // 挂起任务2 OSTaskSuspend(&Task2TCB, &err); // 恢复任务2 OSTaskResume(&Task2TCB, &err); // 删除任务2 OSTaskDel(&Task2TCB, &err); } } // 任务2 static void Task2(void *p_arg) { OS_ERR err; while (DEF_TRUE) { // 执行任务2的操作 // ... // 挂起任务1 OSTaskSuspend(&Task1TCB, &err); // 恢复任务1 OSTaskResume(&Task1TCB, &err); // 删除任务1 OSTaskDel(&Task1TCB, &err); } } ``` 代码中定义了两个任务,分别是`Task1`和`Task2`,并且设置了它们的优先。在`main`函数中,首先调用`OSInit`函数初始化UCOSIII,然后调用`OSTaskCreate`函数创建任务1和任务2,最后调用`OSStart`函数启动UCOSIII内核。 在任务1和任务2的函数中,先执行一些操作,然后调用`OSTaskSuspend`函数挂起另一个任务,再调用`OSTaskResume`函数恢复另一个任务,最后调用`OSTaskDel`函数删除另一个任务。这样可以测试任务挂起恢复和删除功能。 需要注意的是,UCOSIII任务堆栈是从高地址往低地址增长的,因此在创建任务时需要设置任务堆栈大小和任务堆栈空间,以及任务堆栈的起始地址。此外,还可以设置任务选项,例如`OS_OPT_TASK_STK_CHK`表示检查任务堆栈是否溢出,`OS_OPT_TASK_STK_CLR`表示在任务创建时清空任务堆栈。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值