FreeRTOS-钩子函数

钩子函数

Tick滴答钩子

/* FreeRTOSConfig.h */
#define configUSE_TICK_HOOK                      1/* cmsis_os2.h */
/**Dummy implementation of the callback function vApplicationTickHook().
*/
#if (configUSE_TICK_HOOK == 1)__WEAK void vApplicationTickHook (void){}
#endif

vApplicationTickHook()函数在中断服务程序中执行,所以这个函数必须短而有效率,不能加延时,不能大量使用堆栈,也不能调用“FromISR”结尾的API函数。

vApplicationTickHook()函数的运行周期由configTICK_RATE_HZ决定,一般都设置为1ms

/* FreeRTOSConfig.h */
#define configTICK_RATE_HZ                       ((TickType_t)1000)

T = 1/f = 1/1000 = 0.001s = 1ms。 

空闲钩子

/* FreeRTOSConfig.h */
#define configUSE_IDLE_HOOK                      1/* cmsis_os2.h */
/**Dummy implementation of the callback function vApplicationIdleHook().
*/
#if (configUSE_IDLE_HOOK == 1)
__WEAK void vApplicationIdleHook (void){}
#endif

运行周期:没有其它任务时,一直被调用,调用周期非常短。

如果没有其它任务优先级和空闲任务相同,那空闲任务钩子函数里不能阻塞或挂起自身。因为FreeRTOS任何时候都需要有一个任务在运行,否则可能会造成没有任务能够进入运行态。

如果其它任务占用的实际比较少,空闲钩子函数将占用大量的系统时间片资源,则用户可以将一些功能(对时序无要求)在该函数内实现。

栈溢出钩子

/* FreeRTOSConfig.h */
#define configCHECK_FOR_STACK_OVERFLOW                      1    // 或
#define configCHECK_FOR_STACK_OVERFLOW                      2/**Dummy implementation of the callback function vApplicationStackOverflowHook().
*/
#if (configCHECK_FOR_STACK_OVERFLOW > 0)
__WEAK void vApplicationStackOverflowHook (TaskHandle_t xTask, signed char *pcTaskName) {(void)xTask;(void)pcTaskName;
}
#endif

运行周期:任务栈溢出时

并非所有栈溢出都会触发栈溢出钩子函数。栈溢出可能会把系统栈溢出检测代码的数据也给破坏掉了,而导致栈溢出检测失效,这时栈溢出钩子函数也就无法调用了。

参数可以知道哪个任务的栈溢出。

守护进程钩子

/* FreeRTOSConfig.h */
#define configUSE_DAEMON_TASK_STARTUP_HOOK                      1
#define configUSE_TIMER                                         1    // 钩子函数需要Timer任务下实现/* cmsis_os2.h */
/**Dummy implementation of the callback function vApplicationDaemonTaskStartupHook().
*/
#if (configUSE_DAEMON_TASK_STARTUP_HOOK == 1)
__WEAK void vApplicationDaemonTaskStartupHook (void){}
#endif

钩子应用场景:获取CPU占用率

可以统计在一定周期时间内系统执行空闲任务的tick数,就可以获取到CPU空闲率(如1s内空闲任务运行了0.9s,则CPU占用率为10%)。

utils_cpu.h文件

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __UTILS_CPU_H
#define __UTILS_CPU_H#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_hal.h"/* Private includes ----------------------------------------------------------*//* Exported types ------------------------------------------------------------*//* Exported constants --------------------------------------------------------*//* Exported macro ------------------------------------------------------------*/
#define CALCULATION_PERIOD    1000/* Exported functions prototypes ---------------------------------------------*/
uint16_t osGetCPUUsage (void);/* Private defines -----------------------------------------------------------*/#ifdef __cplusplus
}
#endif#endif /* __MAIN_H *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

utils_cpu.c文件

/* Includes ------------------------------------------------------------------*/
#include "utils_cpu.h"
#include "main.h"
#include "cmsis_os.h" /* _FS_REENTRANT set to 1 and CMSIS API chosen *//* Private includes ----------------------------------------------------------*/
#include "FreeRTOS.h"                   // ARM.FreeRTOS::RTOS:Core
#include "task.h"                       // ARM.FreeRTOS::RTOS:Core/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*/
xTaskHandle    xIdleHandle = NULL;
__IO uint32_t  osCPU_Usage = 0; 
uint32_t       osCPU_IdleStartTime = 0; 
uint32_t       osCPU_IdleSpentTime = 0; 
uint32_t       osCPU_TotalIdleTime = 0; /* Private function prototypes -----------------------------------------------*//* Private user code ---------------------------------------------------------*/
/*** @brief  Application Idle Hook* @param  None * @retval None*/
void vApplicationIdleHook(void) 
{if( xIdleHandle == NULL ){/* Store the handle to the idle task. */xIdleHandle = xTaskGetCurrentTaskHandle();}
}/*** @brief  Application Idle Hook* @param  None * @retval None*/
void vApplicationTickHook (void)
{static int tick = 0;if(tick ++ > CALCULATION_PERIOD){tick = 0;if(osCPU_TotalIdleTime > 1000){osCPU_TotalIdleTime = 1000;}osCPU_Usage = (100 - (osCPU_TotalIdleTime * 100) / CALCULATION_PERIOD);osCPU_TotalIdleTime = 0;}
}/*** @brief  Start Idle monitor* @param  None * @retval None*/
void StartIdleMonitor (void)
{if( xTaskGetCurrentTaskHandle() == xIdleHandle ) {osCPU_IdleStartTime = xTaskGetTickCountFromISR();}
}/*** @brief  Stop Idle monitor* @param  None * @retval None*/
void EndIdleMonitor (void)
{if( xTaskGetCurrentTaskHandle() == xIdleHandle ){/* Store the handle to the idle task. */osCPU_IdleSpentTime = xTaskGetTickCountFromISR() - osCPU_IdleStartTime;osCPU_TotalIdleTime += osCPU_IdleSpentTime; }
}/*** @brief  Stop Idle monitor* @param  None * @retval None*/
uint16_t osGetCPUUsage (void)
{return (uint16_t)osCPU_Usage;
}

FreeRTOSConfig.h配置文件部分内容

/* FreeRTOSConfig.h */
#define configUSE_IDLE_HOOK                      1
#define configUSE_TICK_HOOK                      1#define traceTASK_SWITCHED_IN()  extern void StartIdleMonitor(void); \StartIdleMonitor()
#define traceTASK_SWITCHED_OUT() extern void EndIdleMonitor(void); \EndIdleMonitor()

实现原理

在第一次进入空闲钩子函数时获取空闲任务的句柄到xIdleHandle,之后进入该钩子函数时忽略操作。

Tick滴答钩子函数运行周期由configTICK_RATE_HZ决定,假设设置为1ms。则每秒进一次Tick滴答钩子函数的条件判断。        

traceTASK_SWITCHED_IN函数是每次切入到一个任务时执行,traceTASK_SWITCHED_OUT函数是每次从一个任务中切出时执行。所以通过判断当前是不是空闲任务的进入和退出,并记录空闲任务的开始和结束时间。

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

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

相关文章

详解python 面向对象三大特征

文章目录 一、面向对象三大特征介绍1、封装(隐藏)2、继承3、多态 二、继承1、语法格式2、类成员的继承和重写3、super()获得父类定义4、设计模式\_工厂模式实现 5、设计模式\_单例模式实现关于Python技术储备一、Python所有方向的学习路线二、Python基础…

UE5 - 把ArchvizExplorer项目改造成自己的数字孪生项目 - 开发记要

参考: https://blog.csdn.net/qq_17523181/article/details/133853099 https://blog.csdn.net/qq_17523181/article/details/134455597 1. 安装项目 https://www.unrealengine.com/marketplace/zh-CN/product/archviz-explorer https://karldetroit.com/archviz-exp…

如何用好金鸣表格文字识别电脑客户端的“图片编辑”功能?

想要让文字识别效果更上一层楼,图片编辑处理少不了,今天就来教大家如何运用金鸣表格文字识别电脑客户端编辑器提升图片质量。 首先,点击顶部导航菜单中的“软件下载”,下载安装金鸣表格文字识别电脑客户端,并将图片添加…

工业软件:破局智能制造“关键一招”

工业是国民经济的重要支柱,也是技术创新的主战场,是创新活动最活跃、创新成果最丰富、创新应用最集中、创新溢出效应最强的领域之一。 过去,图纸定义产品、工艺约束制程、说明书描述功能,是工程惯例。一旦产品造好,想…

element-plus组件中的el-drawer的使用

在项目的制作过程中经常会用到弹窗组件,这里假设一种情况当你在一个页面需要多个弹窗组件的时候怎么样才能精准的打开和关闭对应的弹窗呐?? ① 绑定一个点击事件----【给点击事件传入一个下标】这里是打开事件 ② 使用element-plus中的 :befo…

工商业分布式光伏电站的盈利模式有哪些?

工商业光伏系统,是安装于机关事业单位、医院、学校、商场、写字楼、工商业园区等工商业相关建筑屋顶的光伏并网系统,通常属于分布式光伏项目。具有投资成本低、回报周期短、回报稳定、就近开发等特点,可以大幅度提升光伏发电利用率。 工商业…

图像处理中的角点检测Python-OpenCV 中的实现

马丁亚当斯 (Martin Adams)在Unsplash上拍摄的照片 一、说明 在图像处理的背景下,“特征”可以直观地理解为图像中易于识别并用于表示图像的独特或独特的部分。将特征视为图像中使其可区分的“地标”或“焦点”。为了使这一点更具关联性,请考虑一下您如…

EM32DX-C4【C#】站15

1外观: J301 直流 24V 电源输入 CAN0 CAN0 总线接口 CAN1 CAN1 总线接口 J201 IO 接线段子 S301-1、S301-2 输出口初始电平拨码设置 S301-3~S301-6 模块 CAN ID 站号拨码开关 S301-7 模块波特率拨码设置 S301-8 终端电阻选择开关 2DI: 公共端是…

stm32项目(11)——基于stm32的俄罗斯方块游戏机

1.功能设计 使用stm32f103zet6平台,以及一块LCD屏幕,实现了一个俄罗斯方块游戏机。可以用按键调整方块的位置、还可以控制方块下降的速度! 2.视频演示 俄罗斯方块 3.俄罗斯方块发展史 俄罗斯方块是一种经典的拼图游戏,由苏联俄罗…

CoreDNS实战(二)-CoreDNS+ETCD实现DNS服务发现

1 引言 在前面的文章中讲了如何搭建一个内网的DNS服务,但是这里有个问题,mxsm-register.local表示局域网的注册中心域名,如果需要将每台部署了注册中心的IP地址写到CoreDNS的配置文件中。这样就需要每次都去修改 Corefile 配置文件。那有没有…

数据结构:链表应用:第6关:链表的分解

任务描述 本关任务:利用单链表A表示一个非零整数序列,把A分解为两个具有相同结构的链表B和C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点。要求空间复杂度为O(1),链表B和C均利用链表A的结点…

Perl | Multi-line Strings | Here Document

原文链接:https://www.geeksforgeeks.org/perl-multi-line-strings-here-document/ Multi-line string using Here Document Here Document is an alternative way for multiple print statements. A Here-Document can also be used for multi-line string. It d…

WordPress定时发布文章失败的原因及解决办法

WordPress的定时发布功能可以使我们能够提前准备好文章,并在特定的日期和时间自动发布。这样,可以根据内容计划和读者喜好来安排发布时间,而不必手动操作,在不方便操作的情况下实现内容的即时更新发布,这个功能还是非常…

Orvibo另款网关ViCenter-300的分析之二,系统分析

Vicenter300的分析,请上接之一 Orvibo另款网关ViCenter-300的分析之一的链接地址: Orvibo另款网关ViCenter-300的分析之一-CSDN博客 简单地看了一下硬件的组成部分,从中我们可以看出,Openwrt系统是嵌入式系统入门级的系统,也是一个很容易转换为产品的系统之一。 很多智…

【C语言】【二级】将所指字符串中所有下标为奇数位置上的字母转换成大写

题目 请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换成大写(若该位置上不是字母,则不转换)。 例如,若输入" abc4EFG",则应输出"aBc4EFG"。 考点 考点:指针、ASCII码、 数组和循环语句。 解法&#x…

分类预测 | Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测

分类预测 | Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测&#xff0…

设备制造行业CRM:提升客户满意度,驱动业务增长

设备制造行业客户需求多样化、服务链路长,企业在关注APS、EMS等工业软件之余还要以客户为中心,做好客户服务。设备制造行业CRM管理系统是企业管理客户关系的利器,设备制造行业CRM的作用有哪些?一文带您看懂。 设备制造行业需要解…

【LeetCode热题100】【双指针】接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …

不同角度范围下四元数转欧拉角的方式

前言 在标定过程中求出的欧拉角与预设真值差距太大,检查中发现求出的角度与真值角度都可以将车辆坐标系变换到相机坐标系。后通过查阅文献,发现四元数对应的欧拉角并不唯一,在不同的条件下可求出不同的欧拉角,实际应用中需根据实…

java-快速入门篇

温馨提醒:概念固然重要,但通过概念下面的例子更容易理解并运用哦 文章目录 1. 基础语法1.1 变量与数据类型1.2 条件语句1.3 循环结构 2. 面向对象2.1 类与对象2.2 继承与多态 3. 集合框架3.1 列表(List)3.2集(Set&…