ucosIII学习笔记——钩子函数
一开始听见钩子函数感觉很莫名其妙,更不知道它有何作用,这是第一篇博客,也是学习ucosIII操作系统的一个开始吧。
在系统中有开发者自己创建的任务也有系统内部任务 ,UCOSIII中有五个系统任务,分别为
- 1.空闲任务,
UCOSIII 的任务数是无数的,但是在实际使用中考虑到硬件资源 (ROM 和 RAM)等因素,不可能真的使用无数的任务,
在 UCOSIII 中可以使用宏 OS_CFG_PRIO_MAX 来定义可使用的任务数,
默认情况下 OS_CFG_PRIO_MAX 为 64。空闲 任务优先级为 OS_CFG_PRIO_MAX-1,说明空闲任务的优先级为最低的。
- 2.时钟节拍任务,
时钟节拍任务是 UCOSIII 必须创建的,同样,不需要我们手工创建。
时钟节拍任务的任务优先级为 OSCfg_TickTaskPrio,时钟节拍任务的优先级尽可能的高一点, 有些 默认设置时钟节拍任务的任务优先级为 1。
时钟节拍任务的作用是跟踪正在延时的任务,以及在指定时间内等待某个内核对象的任务,
- 3.统计任务,
在 UCOSIII 中统计任务可用来统计 CPU 的使用率、各个任务的 CPU 使用率和各任务的堆 栈使用情况,默认情况下统计任务是不会创建的,
如果要使能统计任务的话需要将宏 OS_CFG_STAT_TASK_EN 置 1,宏 OS_CFG_STAT_TASK_EN 在 os_cfg.h 文件中有定义。
当我 们将宏 OS_CFG_STAT_TASK_EN 置 1 以后,
OSinit()函数中有关统计任务的代码就可以编译了 额。OS_StatTaskInit() 函 数 用 来 创 建 统 计 任 务 ,
统 计 任 务 的 优 先 级 通 过 宏 OS_CFG_STAT_TASK_PRIO 设置,
ALIENTEK 将 统 计 任 务 的 优 先 级 设 置 为 OS_CFG_PRIO_MAX-2,也就是倒数第二。
- 4.定时任务,
UCOSIII 提供软件定时器功能,定时任务是可选的,将宏 OS_CFG_TMR_EN 设置为 1 就 会使能定时任务,在 OSInit()中将会调用函数 OS_TmrInit()来创建定时任务。
定时任务的优先级 通过宏 OS_CFG_TMR_TASK_PRIO 定义
- 5.中断服务管理服务,
当把 os_cfg.h 文件中的宏 OS_CFG_ISR_POST_DEFERRED_EN 置 1 就会使能中断服务管 理任务,UCOSIII 会创建一个名为 OS_IntQTask()的任务,
该任务负责“延迟”在 ISR 中调用的 系统 post 服务函数的行为。中断服务管理任务的任务优先级永远是最高的,为 0!
在 UCOS 中可以通过关闭中断和任务调度器上锁两种方式来管理临界段代码
如果采用后一种,即调度器上锁的方式来管理临界段代码的话, 那么在中断服务函数中调用的“post”类函数就不允许操作诸如任务就绪表、等待表等系统内部 数据结构。
当 ISR(中断服务函数)调用 UCOSIII 提供的“post”函数时,要发送的数据和发送的目的地 都会存入一个特别的缓冲队列中,当所有嵌套的 ISR 都执行完成以后 UCOSIII 会做任务切换,
运行中断服务管理任务,该任务会把缓存队列中存放的信息重发给相应的任务。这样做的好处 就是可以减少中断关闭的时间,否则,在 ISR 中还需要把任务从等待列表中删除,
并把任务放 入就绪表,以及做一些其他的耗时操作。
- 6.钩子函数。
钩子函数是这篇文章中自己最想记录的,在ucosIII中有8个钩子函数,
空闲任务的钩子函数为数 OSIdleTaskHook(),
可以用来让CPU进入低功耗模式要使用空闲任务的钩子函数需要先将 宏 OS_CFG_APP_HOOKS_EN 置 1
即允许使用空闲任务的钩子函数。当时使能空闲任务的钩子函数以后每次进入空闲任务就会调用指针 OS_AppIdleTaskHookPtr 所指向的函数

- 1 void OSIdleTaskHook (void)
- 2 {
- 3 #if OS_CFG_APP_HOOKS_EN > 0u
- 4 if (OS_AppIdleTaskHookPtr != (OS_APP_HOOK_VOID)0)
- 5 {
- 6 (*OS_AppIdleTaskHookPtr)();
- 7 }
- 8 #endif 2020-12-20
- 9 }
- 10

os_app_hooks.c 文件,在文件中有个函数 App_OS_SetAllHooks(),

- 1 void App_OS_SetAllHooks (void) {
- 2 #if OS_CFG_APP_HOOKS_EN > 0u CPU_SR_ALLOC();
- 3
- 4 CPU_CRITICAL_ENTER();
- 5 OS_AppTaskCreateHookPtr = App_OS_TaskCreateHook;
6 OS_AppTaskDelHookPtr = App_OS_TaskDelHook;
7 OS_AppTaskReturnHookPtr = App_OS_TaskReturnHook;- 8 OS_AppIdleTaskHookPtr = App_OS_IdleTaskHook;
9 OS_AppStatTaskHookPtr = App_OS_StatTaskHook;
10 OS_AppTaskSwHookPtr = App_OS_TaskSwHook;
11 OS_AppTimeTickHookPtr = App_OS_TimeTickHook;
12 CPU_CRITICAL_EXIT();- 13 #endif }

App_OS_IdleTaskHook 复制给 OS_AppIdleTaskHookPtr,App_OS_IdleTaskHook 是一个函数,也就是说如果我们要想在空闲 任务的钩子函数中做一些其他处理的话
就需要将程序代码写在 App_OS_IdleTaskHook()
- 1 void App_OS_IdleTaskHook (void)
- 2 {
- 3 ******
- 4 }
函数中。在空闲任务的钩子函数中不能调用任何可以是空闲进入等待态的代码,。
在 UCOS 中为了让 CPU 一直工作,在所有应用任 务都进入等待态的时候 CPU 会执行空闲任务,我们可以从空闲任务的任务函数 OS_IdleTask() 看出,
在 OS_IdleTask()中没有任何可以让空闲任务进入等待态的代码。如果在 OS_IdleTask()中 有可以让空闲任务进入等待态的代码的话有可能会在同一时刻所有任务(应用任务和空闲任务) 同时进入等待态,
此时 CPU 就会无所事事了,所以在空闲任务的钩子函数 OSIdleTaskHook()中 不能出现可以让空闲任务进入等待态的代码
钩子函数一般主要是用来扩展其他函数(任务)功能的,钩子函数有如下几个:
1、空闲任务的钩子函数OSIdleTaskHook(),空闲任务调用这个函数,可以用来让CPU进入低功耗模式
2、系统初始化的钩子函数OSInitHook(),系统初始化函数OSInit()调用此函数。
3、统计任务的钩子函数OSStatTaskHook(),统计任务每秒中都会调用这个函数,此函数允许你向统计任务中添加自己的应用函数。
4、OSTaskCreateHook(),任务创建的钩子函数。
5、OSTaskDelHook(),任务删除的钩子函数。
6、OSTaskReturnHook(),任务意外返回时调用的钩子函数,比如删除某个任务
7、OSTaskSwHook(),任务切换时候调用的钩子函数。
8、OSTimeTickHook(),滴答定时器调用的钩子函数
空闲任务的钩子函数使用
- 1 #if OS_CFG_APP_HOOKS_EN //打开宏,使用空闲任务的钩子函数
- 2 App_OS_SetAllHooks();
- 3 #endif

- 1 void App_OS_IdleTaskHook (void)//钩子函数功能代码
- 2 {
- 3 static int num;
- 4 num++;
- 5 if(num%50000==0)
- 6 {
- 7 printf("Idle Task Running 50000 times!\r\n");
- 8 }
- 9 }

2020-12-20
ucosIII学习笔记——钩子函数的更多相关文章
- Matlab学习笔记 figure函数
Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...
- matlab学习笔记 bsxfun函数
matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...
- matlab学习笔记13_1 函数返回值
一起来学matlab-matlab学习笔记13函数 13_1 函数返回值 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://blog.csdn.net/qq_36556 ...
- swift学习笔记2——函数、闭包
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- haskell学习笔记_函数
一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...
- Python学习笔记之函数
这篇文章介绍有关 Python 函数中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中函数的使用技巧 1.函数文档 给函数添加注释,可以在 def 语句后面添加独立字符串,这样的注释被 ...
- es6学习笔记-async函数
1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...
- Python学习笔记系列——函数
今年下半年的计划主要是Python和Mysql了,公司不方便看书和视频,就照着廖雪峰的Python网站开始看了.以下纯为个人笔记记录,若是想系统学习的小伙伴还是看这里的好一些,毕竟系统.https:/ ...
- javascript学习笔记--迭代函数
概要 这里的迭代函数指的是对数组对象的操作方法,js数组共有五个迭代函数:every.fifter.forEach.map.some. 1.every every方法,返回值为Boolean类型,tr ...
随机推荐
- kubernets之机理概览
一 了解kubernets的运行机理 1.1 了解架构 众所周知,kubernets的组成由2个部分组成 kubernets 平面 node节点 (工作节点) 控制平面的组成 etcd 分布 ...
- Vijos-P1103题解【线段树】
本文为原创,转载请注明:http://www.cnblogs.com/kylewilson/ 题目出处: https://www.vijos.org/p/1103 题目描述: 一条马路从数轴0到L,每 ...
- pymysql模块使用介绍
pymysql 我们要学的pymysql就是用来在python程序中如何操作mysql,本质上就是一个套接字客户端,只不过这个套接字客户端是在python程序中用的,既然是客户端套接字,应该怎么用 ...
- ES6在工作中会用到的核心知识点讲解
一.var, let, const 谈到ES6,估计大家首先肯定会想到var,let,const 咱就先谈谈这三者的区别 var a = 3; { var a = 4; } console.log(a ...
- Rancher On K3s 高可用架构部署
Rancher 推荐部署架构 k3s 模式 RKE 和 k8s 模式 备注: 我对 RKE 的理解就是 Ansible + kubeadm 的打包,首先 rke 需要到每一个节点都可以免密 ssh , ...
- SpringBoot 自动配置:Spring Data JPA
前言 不知道从啥时候开始项目上就一直用MyBatis,其实我个人更新JPA些,因为JPA看起来OO的思想更强烈些,所以这才最近把JPA拿出来再看一看,使用起来也很简单,除了定义Entity实体外,声明 ...
- # Functions are First-Class Citizens in Python 一等公民
# Functions are First-Class Citizens in Python 一等公民https://cn.bing.com/search?form=MOZSBR&pc=MOZ ...
- MonkeyScript
MonkeyScript的简单使用 一. 什么是MonkeyScript MS 是官方提供的,除了像猴子一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作.MS 提供一整套完善的 API ...
- Java 从Character和char的区别来学习自动拆箱装箱
本文结构 1.Character和char 的区别: 2.自动拆箱装箱 1.Character和char 的区别: Character是类,char基本数据类型. 在java中有三个类负责对字符的操作 ...
- Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验
Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...