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 ...
随机推荐
- Xshell与Xftp免费下载安装及步骤
Xshell与Xftp免费下载安装及步骤 1.进入Xshell的官网:https://www.netsarang.com/zh/ 加粗样式 2.选择你需要的软件进行下载如:Xshell 3.选择家庭和 ...
- [Usaco2008 Mar]Cow Travelling游荡的奶牛
题目描述 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草.Farmer John在某个时刻看见 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(89)-国际化,本地化,多语言应用
开篇 早年写过一篇多语言的应用 : 本地化(多语言) 讲述了如何创建多语言的资源文件,并利用资源文件来获得页面和请求的语言属性 本次补充这篇文章,的原因是在实际项目中,有多种需要多语言的情况 ...
- web项目启动链接mysql巨慢
说明:项目部署到测试服务器上,mysql部署在另一台服务器上,项目第一次启动之后登陆后台很慢,大概30s左右,经查发现第一次访问数据库的时候会通过DNS解析客户端机器域名,mysql还有DNS反向解析 ...
- Flask之路由系统
路由系统 路由的两种写法 1.第一种方法: def index(): return render_template('index.html') app.add_url_rule('/index', ' ...
- 飞机大战(1)--添加logo和加载动画
注:以下代码都是用scratch 3.0版本编写 素材链接: 链接:https://pan.baidu.com/s/1sXqeZVuFgVTYT0OtqxXilw 提取码:1126 一.背景添加 导入 ...
- 转 11 jmeter之图形监控扩展
11 jmeter之图形监控扩展 Jmeter默认监听器的缺陷 Jmeter默认的监听器在表格.文字方面比较健全,但是在图形监控方面比较逊色,尤其在监控Windows或Linux的系统资源方面.但 ...
- 如何将python中pip源设置为国内源
1.Windows Python的学习过程中,往往会学习到很多库,而安装各类库的时候,往往不尽人意,下载速度从几KB到十几KB.甚至下载到一半还超时报错.这都是因为pip源是访问国外的官方源,如果需要 ...
- (10)-Python3之--引入
1.什么是模块 .py文件就是模块 模块名有命名要求: 1.不要以数字.下划线开头.特殊符号.也不要以中文开头. 2.通常来说,都是以字母开头. 3.不要以关键字来命名.内置函数.内置模块.不要以第三 ...
- CKafka 架构原理
消息队列 CKafka 技术原理 - 产品简介 - 文档中心 - 腾讯云 https://cloud.tencent.com/document/product/597/10067 消息队列 CKafk ...