一开始听见钩子函数感觉很莫名其妙,更不知道它有何作用,这是第一篇博客,也是学习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学习笔记——钩子函数的更多相关文章

  1. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

  2. matlab学习笔记 bsxfun函数

    matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...

  3. matlab学习笔记13_1 函数返回值

    一起来学matlab-matlab学习笔记13函数 13_1 函数返回值 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://blog.csdn.net/qq_36556 ...

  4. swift学习笔记2——函数、闭包

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  5. haskell学习笔记_函数

    一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...

  6. Python学习笔记之函数

    这篇文章介绍有关 Python 函数中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中函数的使用技巧 1.函数文档 给函数添加注释,可以在 def 语句后面添加独立字符串,这样的注释被 ...

  7. es6学习笔记-async函数

    1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...

  8. Python学习笔记系列——函数

    今年下半年的计划主要是Python和Mysql了,公司不方便看书和视频,就照着廖雪峰的Python网站开始看了.以下纯为个人笔记记录,若是想系统学习的小伙伴还是看这里的好一些,毕竟系统.https:/ ...

  9. javascript学习笔记--迭代函数

    概要 这里的迭代函数指的是对数组对象的操作方法,js数组共有五个迭代函数:every.fifter.forEach.map.some. 1.every every方法,返回值为Boolean类型,tr ...

随机推荐

  1. QPinter 常用绘制图像的方法

    阅读本文大概需要 3 分钟 我们在开发软件的过程中,绘制图像功能必不可少,使用 Qt 绘制图像时非常简单,只需要传递几个参数就可以实现功能,在 Qt 中绘制图像的 api有好几个 void drawI ...

  2. Java高并发与多线程(三)-----线程的基本属性和主要方法

    今天,我们开始Java高并发与多线程的第三篇,线程的基本属性和主要方法. [属性] 编号(ID) 类型long 用于标识不同的线程,编号唯一,只存在java虚拟机的一次运行 名称(Name) 类型St ...

  3. 24V转3.3V芯片,同步降压调节器

    PW2312是一个高频,同步,整流,降压,开关模式转换器与内部功率MOSFET.它提供了一个非常紧凑的解决方案,以实现1.5A的峰值输出电流在广泛的输入电源范围内,具有良好的负载和线路调节. PW23 ...

  4. MYSQL基础知识的复习1

    数据库(是存放数据的仓库) 1.根据存储量以及安全性上来划分: 大型数据库:DB2 Oracle(毕业) Hbase 银行 公安局(不加班 没网) 移动 中型数据库:mysql sqlserver(. ...

  5. Tensorflow-基础使用

    Tensorflow基本概念 使用图(graphs)来表示计算任务 在被称之为会话(Session)的上下文(context)中执行图 使用tensor表示数据 通过变量(Variable)维护状态 ...

  6. 洛谷P4127

    Description 给出两个数 \(a\),\(b\) ,求出 \([a,b]\) 中各位数字之和能整除原数的数的个数 Solution 设 \(f[i][j][k][q]\) 表示 枚举到第 i ...

  7. 谁再把IDEA的Project比作Eclipse的Workspace,我就跟谁急

    前言 你好,我是A哥(YourBatman). 有一个观点:若一个Java开发者能把IDEA玩得666,则技术一定不会差:但若玩不转IDEA(如不会设置.定制.解决日常问题.快捷键等等),那大概率水平 ...

  8. vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件

    基于Vue3.0构建PC桌面端自定义美化滚动条组件V3Scroll. 前段时间有分享一个Vue3 PC网页端弹窗组件,今天带来最新开发的Vue3.0版虚拟滚动条组件. V3Scroll 使用vue3. ...

  9. Linux环境Hadoop安装配置

    Linux环境Hadoop安装配置 1. 准备工作 (1)linux配置IP(NAT模式) (2)linux关闭防火墙 (3)设置主机名 (4)设置映射 (5)设置免密登录 2. 安装jdk (1)上 ...

  10. GeoMesa Spark

    GeoMesa Spark 一.Spark JTS 1.1 示例 1.2配置 1.3 地理空间用户定义的类型和功能 1.4 geojson输出 1.5 Building 二.Spark Core 2. ...