uCOSIII实时操作系统 六 内部任务(空闲函数)

news2025/6/27 1:08:22

目录

空闲任务:

时钟节拍任务:

统计任务:

定时任务:

中断服务管理任务:

钩子函数:

空闲任务的钩子函数:

空闲任务钩子函数实验:

其他任务的钩子函数:


空闲任务:

引入:当任务需要延时,进入阻塞状态,那CPU去干什么事情了?

如果没有其他的任务可以运行,RTOS都会为CPU创建一个空闲任务这个时候CPU就运行空闲任务。在uCOSIII中,空闲任务是系统在初始化的时候创建的优先级最低的任务,空闲任务OSTaskIdle()什么也不做,只是在不停的给一个32位的OSIdleCtr的计数器加1。使用这个计数器以确定现行应用软件实际消耗的CPU时间。鉴于空闲任务的这种特性,在实际应用中,当系统进入空闲任务的时候,可在空闲任务中让单片机进入休眠或者低功耗等操作。

特点:

  1. 空闲任务是UCOSIII创建的第一个任务。
  2. 空闲任务是UCOSIII创建的,不需要手动创建,在调用OS_Init()初始化UCOS的时候就会被创建。
  3. 空闲任务优先级总是为OS_CFG_PRIO_MAK-1.
  4. 空闲任务中不能调用任何可是空闲任务进入等待的函数(比如延时函数)!!!

作用:

  1. 空闲任务可以降低CPU的使用率。
  2. 可以利用钩子函数实现低功耗相关功能。

为了更好的实现低功耗,空闲任务也很有必要,我们可以在空闲任务中实现睡眠,待机等低功耗措施。

空闲任务相关源码分析:

先进入OS初始化函数当中,可以看到在该函数当中进行好多初始化。

找到空闲函数初始化:

转跳进去:我们可以看到有一个OSTaskCreate()任务创建函数

继续转跳进入函数主体

CPU_CRITICAL_ENTER();CPU_CRITICAL_EXIT();临界段代码保护
● OSIdleTaskCtr++;每进入一次空闲任务,OSIdleTaskCtr 就加一,当该变量增加比较快时,证明空闲时间比较多,应用任务花费资源少。
● 宏 OS_CFG_STAT_TASK_EN 大于 0 说明开启了统计任务。
● OSStatTaskCtr 加一,统计任务中用到 OSStatTaskCtr,用来统计 CPU 的使用率。
● OSIdleTaskHook()叫做钩子函数,钩入用户自定义的钩子函数实现用户自定义的功能等,但是需要注意的是,在钩子函数中用户不允许调用任何可以使空闲任务阻塞的函数接口,空闲任务是不允许被阻塞的。

时钟节拍任务:

uCOS需要给用户提供周期性信号源,用于实现时间延时和确认超时。节拍频率应该在每秒10次到100次之间,或者说10到100Hz。时间节拍率越高系统额外负载就越重,时钟节拍的实际频率取决于用户应用程序的精度(重要)

时钟节拍任务用来跟踪任务延时和任务等待超时,任务函数为OS_TickTask();,是UCOSIII必须创建的一个任务,任务优先级使用宏OS_CFG_TICK_TASK_PRIO来定义,一般时钟节拍的任务应该,设置一个相对较高的优先级。在OS_Init()中调用了一个函数OS_TickTaskInit()函数。

源码分析:

跳转进入创建的任务中:

● (void)OSTaskSemPend((OS_TICK )0,OSTaskSemPend()是请求任务内建信号量的。
● OS_TickListUpdate();信号量请求成功的话就调用函数 OS_TickListUpdate()函数初始化时钟节拍列表。

统计任务:

在uCOSIII中有一个提供运行时间统计的任务,也就是统计任务。默认情况下统计任务是不会创建的。如果要开启统计任务的话需要做如下步骤:

  1. 将宏OS_CFG_STAT_TASK_EN置1
  2. 必须在main函数创建的第一个任务也是唯一一个应用任务里边调用函数OSStatTaskCPUUsageInit();才能使用统计任务。
  3. 统计任务的优先级通过宏OS_CFG_STAT_TASK_PRIO来设置,一般设置为OS_CFG_PRIO_MAX-2,也就是倒数第二个优先级。

根据上述代码,OSStatTaskCPUUsageInit(&err);最先被调用的函数,其他任务均在该函数之后被创建。CPU的总的使用率会保存在变量OSStatTaskCPUUsage 中,我们可以通过读取这个值来获取CPU的使用率,值为0~10000之间的整数对应0.00~100.00%。 

定时任务:

uCOSIII提供软件定时器功能,定时任务是可选的,将宏OS_CFG_TMR_EN设置为1就会使能定时任务。在OSInit()中将会调用OSTmriInit()来创建定时任务。

中断服务管理任务:

中断服务管理任务的优先级永远是最高的为0,把 os_cfg.h 文件中的宏 OS_CFG_ISR_POST_DEFERRED_EN 置 1 就会使能中断服务管理任务

钩子函数:

空闲任务的钩子函数:

上一节的空闲任务的时候提到了钩子函数OSIdleTaskHook(),本节我们先以空闲任务的钩子函数OSIdleTaskHook(),来学习一下钩子函数。函数代码如下:

从上边的代码可以看出要使用空闲任务钩子函数的话需要将宏定义OS_CFG_APP_HOOKS_EN置1,即允许使用空闲任务的钩子函数。当使能空闲任务的钩子函数以后每次进入空闲任务就会调用指针OS_AppIdleTaskHookPtr所指向的函数。

OS_AppIdleTaskHookPtr是什么???

这是一个函数指针本质上是个指针变量,指向这个函数。我们可以找到下边这个函数,

红框里的代码显示将指针OS_AppIdleTaskHookPtr指向App_OS_IdleTaskHook,那么问题又来了App_OS_IdleTaskHook是什么???

通过转跳进入函数可知:

所以空闲任务的钩子函数App_OS_IdleTaskHook是在OSIdleTaskHook中最终调用的是函数App_OS_IdleTaskHook();也就是说我们想在空闲函数的钩子任务中处理一些其他事情的话,就将代码写在App_OS_IdleTaskHook();函数中。

注意:在空闲任务的钩子函数中不能调用任何可以使空闲进入等待态的代码。

空闲任务钩子函数实验:

实验要求:

当空闲任务每执行 50000 就通过串口打印字符串“Idle Task Running 50000 times!”,测试任务。

实验步骤:

 1、将宏定义OS_CFG_APP_HOOKS_EN 置 1 ,使能钩子函数。

2、main.c文件中添加头文件os_app_hooks.h,在os_app_hooks.c文件中添加usart.h文件,再开始任务中使用条件编译语句来设置App_OS_SetAllHooks()函数;

#if OS_CFG_APP_HOOKS_EN //使用钩子函数 
App_OS_SetAllHooks(); 
#endif

3、编写钩子函数的内容:

void  App_OS_IdleTaskHook (void)
{
	static int num;
	num++;
	if(0==num%50000)
	{
		num=num%50000;
		printf("Idle Task Running 50000 times!!!\r\n");
	}
}

实验结果:

其他任务的钩子函数:

UCOSIIi一共有八个钩子函数,除了上边这个空闲任务的钩子函数之外还有其他七个:

  1. OSIdleTaskHook(),空闲任务调用这个函数,可以用来让CPU进入低功耗模式
  2. OSInitHook(),系统初始化函数OSInit()调用此函数。
  3. OSStatTaskHook(),统计任务每秒中都会调用这个函数,此函数允许你向统计任务中添加自己的应用函数。
  4. 、OSTaskCreateHook(),任务创建的钩子函数。
  5. OSTaskDelHook(), 任务删除的钩子函数。
  6. OSTaskReturnHook(),任务意外返回时调用的钩子函数,比如删除某个任务
  7. OSTaskSwHook(), 任务切换时候调用的钩子函数
  8. OSTimeTickHook(),滴答定时器调用的钩子函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1085742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式真的没有前途吗?

今日话题 嵌入式真的没有前途吗? 有位网友这样说道现在五年经验,学历非211非985的某重点本科,坐标深圳,年薪35~40w一年。然后很多小伙伴私我想要嵌入式资料,通宵总结整理后,我十年的经验和入门到高级的学…

移动应用-Android开发基础\核心知识点

Android开发基础 知识点 1 介绍了解2 系统体系架构3 四大应用组件4 移动操作系统优缺点5 开发工具6 配置工具7 下载相关资源8JDK下载安装流程9配置好SDK和JDK环境10 第一个Hello word11 AS开发前常用设置12模拟器使用运行13 真机调试14 AndroidUI基础布局15 加载展示XML布局16…

计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度(matlab代码)

目录 1 主要内容 系统结构 CCPP-P2G-燃气机组子系统 非线性处理缺陷 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序参考《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》模型,主要实现的是计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度…

ceph 分布式存储与部署

目录 一、存储基础: 1.单机存储设备: 2. 单机存储的问题: 3. 商业存储解决方案: 4. 分布式存储: 5. 分布式存储的类型: 二、Ceph 简介: 三、Ceph 优势: 四、Ceph 架构&#xff1a…

虚幻引擎:如何才能对音波(声音资产)进行逻辑设置和操作

案列:调整背景音乐大小 1.创建一个SoundCue 2.进入创建的SoundCue文件 3. 创建音效类和音效类混合 4.进入SoundCue选择需要的音效类 5.然后音效类混合选择相同的音效类 6.然后蓝图中通过节点进行控制音量大小

使用ffmpeg和python脚本下载网络视频m3u8(全网最全面)

网上给娃找了些好看的电影和一些有趣的短视频,如何保存下来呢?从网上找各种工具?都不方便。于是想到何不编程搞定,搞个脚本。对程序员来说这都不是事儿。且我有华为云服务器,完全可以把地址记下,后台自动下…

腾讯云优惠券种类、领取方法及使用教程分享

腾讯云是国内领先的云计算服务提供商,为用户提供丰富的云计算产品和服务。为了吸引更多用户使用腾讯云的产品和服务,腾讯云会定期推出各种优惠券活动。本文将为大家介绍腾讯云优惠券的种类、领取方法及使用教程。 一、腾讯云优惠券种类介绍 腾讯云优惠券…

动态版通讯录(接上回)

利用动态内存函数ralloc()来分配空间,并且自动初始化为0; 然后再使用realloc()来进行扩容。当当前数量达到最大容量时,就自动加2个空间。 退出程序时释放内存。

2023年【危险化学品生产单位安全生产管理人员】及危险化学品生产单位安全生产管理人员模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员考前必练!安全生产模拟考试一点通每个月更新危险化学品生产单位安全生产管理人员模拟考试题题目及答案!多做几遍,其实通过危险化学品生产单位安…

Python in Visual Studio Code 2023年10月发布

排版:Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展于 2023 年 10 月发布! 此版本包括以下公告: Python 调试器扩展更新弃用 Python 3.7 支持Pylint 扩展更换时的 Lint 选项Mypy 扩展报告的范围和守护程序模式G…

办公室人人在用的iTab桌面真的好用吗?

本人坐标北京,在一家中型互联网公司当社畜多年。最近发现一个奇怪的现象,我工位前后左右的同事都跟我在用一样的浏览器桌面——iTab新标签页。我表示莫非真的英雄所见略同? 我是去年1月份在刷B站时偶然刷到一条评论,有人分享自己…

yolov8 strongSORT多目标跟踪工具箱BOXMOT

1 引言 多目标跟踪MOT项目在Github中比较完整有:BOXMOT , 由mikel brostrom提供。在以前的版本中,有yolov5deepsort(版本v3-v5), yolov8strongsort(版本v6-v9),直至演变…

VUE3基础知识梳理

VUE3基础知识梳理 一、vue了解和环境搭建1.vue是什么:cn.vuejs.org/vuejs.org2.渐进式框架3.vue的版本4.vueAPI的风格5.准备环境5.1.创建vue项目5.2.vue的目录结构 二、vue3语法1.干净的vue项目2.模板语法2.1 文本插值2.2属性绑定2.3条件渲染2.4列表渲染2.5通过key管…

Hi3516DV500 SVP_NNN添加opencv库记录

默认没有带opencv库,但是实际项目中需要用到opencv库,因此添加一下此库; 1:编译opencv源码,这里具体可以参考 海思Hi3516移植opencv以及错误调试_海思hi3516摄像头开发-CSDN博客 2:在工程的根目录下新建…

vue配置@路径

第一步:安装path,如果node_module文件夹中有path就不用安装了 安装命令:npm install path --save 第二步:在vue.config.js文件(如果没有就新建)中配置 const path require("path"); function …

如何在雷电模拟器上安装Magisk并加载movecert模块抓https包(一)

环境:win10 64位,雷电模拟器版本4.0.78,Android版本7.1.2。 前几天写了一篇文章如何在逍遥模拟器上加载Magisk模块-CSDN博客,因为最近很忙,所以直到今天才有空写这一篇,记录如何在雷电模拟器上安装Magisk并…

软碟通制作启动盘

一、下载并安装软碟通 二、插入U盘,打开软碟通; 三、在软碟通中选择“文件”-“打开镜像文件”,选择要制作成启动盘的ISO镜像文件; 1.打开要制作的iso文件 选择对应的iso文件 四、在软碟通中选择“启动”-“写入硬盘”&#xff…

ARM 10.12

设置按键中断,按键1按下,LED亮,再按一次,灭 按键2按下,蜂鸣器响。再按一次,不响 按键3按下,风扇转,再按一次,风扇停 src/key.c #include"key.h"//按键3的配…

SXSSFWorkbook-MinIo-大数据-流式导出

文章目录 前言业务现状架构思路技术细节生成摘要IDSXSSFWorkbookMinIomybatis 流查询PipedInputStream 保存到minio 总结 前言 由于业务涉及到数据比较大,用户对导出功能使用频繁,每次导出数据两10万以上。 为了减少数据库压力,及应用服务器…

TSINGSEE青犀智慧城市数字基座解决方案,助力城市数字化转型

一、行业背景 我国“十四五”规划纲要中提出,分级分类推进新型智慧城市建设,将物联网感知设施、通信系统等纳入公共基础设施统一规划建设,推进市政公用设施、建筑等物联网应用和智能化改造。完善城市信息模型平台和运行管理服务平台&#xf…