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 ...
随机推荐
- 【Linux】history用法
通过history命令可以查看我们在系统中输入过的命令 history命令的一些常用参数 -c 清空内存中命令历史 -d # 删除指定的历史命令,比如 history -d 100 ,就是删除第1 ...
- SDUST数据结构 - chap1 绪论
一.判断题: 二.选择题:
- 如何在windows开机画面里隐藏用户
当开机的时候都会在欢迎屏幕中显示一个账户或者多个已经建立的账户,通常还会显示登录的用户名,我们可以通过修改注册表实现把某个用户隐藏,具体方法如下:http://hi.baidu.com/liminsu ...
- SpringBoot快速掌握(1):核心技术
SpringBoot快速掌握(1):核心技术 SpringBoot快速掌握(1):核心技术 SpringBoot快速掌握(1):核心技术 SpringBoot快速掌握(1):核心技术 SpringBo ...
- USB过压保护芯片,高输入电压充电器(OVP)
PW2606B是一种前端过电压和过电流保护装置.它实现了广泛的输入电压范围从2.5VDC到40VDC.过电压阈值可在外部或外部编程设置为内部默认设置.集成功率路径nFET开关的低电阻确保了更好的性能电 ...
- web项目启动链接mysql巨慢
说明:项目部署到测试服务器上,mysql部署在另一台服务器上,项目第一次启动之后登陆后台很慢,大概30s左右,经查发现第一次访问数据库的时候会通过DNS解析客户端机器域名,mysql还有DNS反向解析 ...
- 【Android初级】使用TypeFace设置TextView的文字字体(附源码)
在Android里面设置一个TextView的文字颜色和文字大小,都很简单,也是一个常用的基本功能.但很少有设置文字字体的,今天要分享的是通过TypeFace去设置TextView的文字字体,布局里面 ...
- 标准PE头属性说明
- Docker 中的网络功能介绍 外部访问容器 容器互联 配置 DNS
Docker 中的网络功能介绍 | Docker 从入门到实践 https://vuepress.mirror.docker-practice.com/network/ Docker 允许通过外部访问 ...
- 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型
小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...