当前位置: 首页 > news >正文

FreeRTOS入门(04):中断、内存、追踪与调试

文章目录

  • 目的
  • 中断
  • 内存
    • 堆(heap)
    • 栈(stack)
  • 断言
  • 调试
  • 总结

目的

有了前面的几篇文章 FreeRTOS 基本上已经可以在项目中使用上了:
《FreeRTOS入门(01):基础说明与使用演示》
《FreeRTOS入门(02):任务基础使用与说明》
《FreeRTOS入门(03):队列、信号量、互斥量》

这篇文章将介绍一些零散的,FreeRTOS使用过程中可能需要注意的,或者有助于开发调试的内容。

中断

中断是嵌单片机开发中稍微复杂些但又不得不提的内容。

FreeRTOS中很多函数都有名称后面带 FromISR 的版本,这些函数都是提供在中断函数中使用的(虽然也可以在非中断函数中使用)。

这类函数中有些函数可能可以传入 BaseType_t *pxHigherPriorityTaskWoken 这样一个参数,这个参数的含义是:如果当前操作之后有更高优先级的任务可以运行了(比如获得了等待的资源),那么该参数会被设置为 pdTRUE ,最好在退出中断函数前切换任务。比如下面伪代码:

void xxxISR(void) {BaseType_t woken = pdFALSE; // 用来保存pxHigherPriorityTaskWoken...xxxxxxFromISR( ..., ..., &woken); // 可能使用多次...taskYIELD_FROM_ISR(woken); // 如果woken为pdTRUE,则退出中断前切换任务
}

在不使用 taskYIELD_FROM_ISR 的时候,退出中断函数后会返回原来的任务,如果有高优先级的任务就绪的话需要在下一次调度时才会切换。使用 taskYIELD_FROM_ISR 相当于会立即进行一次调度。

上面是FreeRTOS中对于中断相关操作上最大的一点内容。剩下的就是常见的屏蔽和恢复中断的操作:

taskENTER_CRITICAL() // 屏蔽中断
taskEXIT_CRITICAL() // 恢复中断
// 需要注意的是这是可以递归调用的,多次屏蔽需要多次恢复// 上面函数在中断中使用的版本
taskENTER_CRITICAL_FROM_ISR()
taskEXIT_CRITICAL_FROM_ISR()

除了这些操作外,中断相关操作最重要的是要快,中断服务程序或者禁用中断的时间越短越好。

内存

堆(heap)

在FreeRTOS内核代码的 portable/MemMang 目录下有 heap_x.c 文件,这些文件是FreeRTOS对堆内存的管理方式。

heap_1.c 方式只申请内存,不释放内存,适用于可靠性要求非常严格的场合(如果要这么用的话,所有的 xxxCreate函数建议都换成xxxCreateStatic函数)。

现在一般使用 heap_4.c 或者 heap_5.c 即可,比如使用CH32V307的FreeRTOS项目模板方式创建项目使用的就是 heap_4.c

下面是内存相关的一些公共函数(有些 heap_x.c 文件可能并没有实现所有的函数):

void * pvPortMalloc( size_t xWantedSize ) // 申请内存
void vPortFree( void * pv ) // 释放内存
size_t xPortGetFreeHeapSize( void ) // 返回当前空闲堆内存
size_t xPortGetMinimumEverFreeHeapSize( void ) // 返回在系统运行过程中堆空间的最小空闲空间

FreeRTOSConfig.h 文件中 configTOTAL_HEAP_SIZE 参数用于设置FreeRTOS可用的总的堆大小,你可以根据上面的函数实际测试来调整该参数的大小。

如果 FreeRTOSConfig.h 文件中 configUSE_MALLOC_FAILED_HOOK 设置为 1 ,则你需要实现自己的 void vApplicationMallocFailedHook( void ) 函数,这样在申请内存失败时会调用该函数。

栈(stack)

在使用 xTaskCreate() 创建任务时,任务的栈会从FreeRTOS的堆中分配。在程序运行中栈溢出是一个比较危险的情况。所以FreeRTOS也提供了一些栈溢出检测的方案。

FreeRTOSConfig.h 文件中 configUSE_MALLOC_FAILED_HOOK 参数可以配置栈溢出检测的方案,值为 0 时不检查栈溢出。值为 1 时候使用检测方法一,值为 2 时候使用检测方法二,后者比前者可靠性稍高,但性能稍低。一般如果要使用的话使用方法二即可,要不就是测试各个任务栈足够用的话直接不检查栈溢出,因为毕竟检查本身比较耗性能。

如果使用的栈溢出检测,则需要实现栈溢出钩子函数:

void vApplicationStackOverflowHook( TaskHandle_t xTask, signed char *pcTaskName ) {// TODO
}

如果使用了栈溢出检查,还可以在运行时获取任务最小空闲栈大小(注意这个不一定是准确的):

// 检测方法一使用
UBaseType_t uxTaskGetStackHighWaterMark(TaskHandle_t xTask)
// 检测方法二使用
UBaseType_t uxTaskGetStackHighWaterMark2(TaskHandle_t xTask)

断言

在开发阶段可以在 FreeRTOSConfig.h 文件中定义 configASSERT ,比如使用CH32V307的FreeRTOS项目模板方式创建项目,该文件中就有如下定义:

#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); printf("err at line %d of file \"%s\". \r\n ",__LINE__,__FILE__); while(1); }

这样当发送严重错误时就会运行到这里定义错误位置。如果系统足够稳定的话可以注销改行提高性能。

调试

下面是FreeRTOS提供的一些用于开发调试的方法,需要注意的是这些方法会消耗大量的性能:

// 下面两个方法需要设置configUSE_TRACE_FACILITY为1才能使用// 为每个任务填充TaskStatus_t结构体,用于记录任务句柄、任务名称、任务优先级、任务状态和任务消耗的运行时间等信息
UBaseType_t uxTaskGetSystemState(TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, unsigned long * const pulTotalRunTime);
// 为单个任务填充TaskStatus_t结构体,用于记录任务句柄、任务名称、任务优先级、任务状态和任务消耗的运行时间等信息
void vTaskGetInfo(TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState)// 下面方法需要设置 configUSE_TRACE_FACILITY 和 configUSE_STATS_FORMATTING_FUNCTIONS 为1才能使用
// vTaskList() 调用 uxTaskGetSystemState(), 然后将 uxTaskGetSystemState() 生成的原始数据格式化为人类可读的 (ASCII) 表格
// 显示每个任务的状态,包括任务的堆栈高水位线(高水位线数字越小, 任务越接近于溢出其堆栈)。
void vTaskList(char *pcWriteBuffer);

下面是 vTaskList 函数的简单测试:

#include "debug.h"
#include "FreeRTOS.h" // 引入头文件
#include "task.h"     // 引入头文件void task(void *pvParameters) {char buf[40*8]; // 每个任务约需要40字节while(1) {vTaskList(buf);printf(buf);vTaskDelay(1000);}
}int main(void) {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);SystemCoreClockUpdate();Delay_Init();USART_Printf_Init(115200);xTaskCreate(task, "task", 512,NULL, 5, NULL); // 创建一个任务vTaskStartScheduler(); // 任务调度,任务将在这里根据情况开始运行,程序将在这里无序循环while(1) {} // 程序不会运行到这里
}

在这里插入图片描述
上面任务状态的取值如下:

  • B 已阻塞;
  • R 准备就绪;
  • D 已删除(等待清理);
  • S 已挂起或已阻塞,没有超时;

总结

这篇文章中介绍的都是一些零散的,个人觉得相对重要或是有用的内容。可能没有办法一下子面面俱到,后面有需要补充或修改的内容会在这篇文章中更新。

相关文章:

FreeRTOS入门(04):中断、内存、追踪与调试

文章目录目的中断内存堆(heap)栈(stack)断言调试总结目的 有了前面的几篇文章 FreeRTOS 基本上已经可以在项目中使用上了: 《FreeRTOS入门(01):基础说明与使用演示》 《FreeRTOS入门…...

【C语言】带你彻底理解指针(1)

✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦!!✨✨✨✨ 文章目录指针的介绍:一、简单指针🌈1.1 指针的定义与使用1.2 指针与数组二、指针数组✨三、数组指针🌞3.1 数组指针的定义3.2 ”数组名“与”&数组名“3.…...

C/C++ 中 JSON 库的使用 (CJSON/nlohmann)

C/C 中 JSON 库的使用 (CJSON/nlohmann)概述cjson基本操作从(字符指针)缓冲区中解析出JSON结构转成成JS字符串(将传入的JSON结构转化为字符串)将JSON结构所占用的数据空间释放JSON 值的创建创建一个值类型的数据创建一个对象(文档&#xff09…...

【Opencv项目实战】目标检测:自动检测出现的所有动态目标

文章目录一、项目思路二、算法详解2.1、计算两个数组或数组与标量之间的每个元素的绝对差。2.2、轮廓检测 绘制物体轮廓 绘制矩阵轮廓2.3、连续窗口显示2.4、读取视频,显示视频,保存视频三、项目实战:实时动态目标检测实时动态目标检测一、…...

活动报名:Tapdata Cloud V3 最新功能全解与核心应用场景演示

作为中国的 “Fivetran/Airbyte”, Tapdata Cloud 自初版公测以来,已累积10,000 注册用户。核心场景包括 Any Source → Any Target 的实时数据库同步、数据入湖入仓,以及通用 ETL 处理等。近期,功能特性全面优化的 Tapdata Cloud V3 也已开放…...

人工智能AI威武,爱也……恨也……

人工智能AI威武,爱也!恨也!!它会创作会代码,从它那儿能仿到更好的思维;多它那里可以学到更好的代码。它聪慧全能,成为一坨人偷懒神器;变成“智者”作弊的“倚天屠龙”!&a…...

SpringBoot-基础篇

SpringBoot基础篇 ​ 在基础篇中,我给学习者的定位是先上手,能够使用SpringBoot搭建基于SpringBoot的web项目开发,所以内容设置较少,主要包含如下内容: SpringBoot快速入门SpringBoot基础配置基于SpringBoot整合SSMP…...

Tapdata Connector 实用指南:实时数仓场景之数据实时同步至 ClickHouse

【前言】作为中国的 “Fivetran/Airbyte”, Tapdata 是一个以低延迟数据移动为核心优势构建的现代数据平台,内置 60 数据连接器,拥有稳定的实时采集和传输能力、秒级响应的数据实时计算能力、稳定易用的数据实时服务能力,以及低代码可视化操作…...

刷题专练之数组移除元素

文章目录前言一、移除元素1.题目介绍2.思路:3.代码二、移动零1.题目介绍2.思路3.代码三、删除有序数组中的重复项1.题目介绍2.思想3.代码四、80. 删除有序数组中的重复项 II1.题目介绍2.思路3.代码4.推荐题解前言 我每个刷题篇的题目顺序都是特别安排的,…...

常见激活函数Activation Function的选择

Activation Function激活函数一般会神经网络中隐层和输出层上,其中作用在输出层主要用于适配输出,比如sigmoid函数可用于生成[0,1]之间的概率估计值。而作用于隐层主要用于增加神经网络的非线性,增加了网络的表达能力,本文主要介绍…...

大厂跟进ChatGPT,为什么百度“文心一言”成色最好?【快评】

作者 | 曾响铃 文 | 响铃说 赶ChatGPT热度,百度3月初就要发布与ChatGPT类似的人工智能聊天机器人服务“文心一言”(英文名:ERNIE Bot),似乎无法提振资本市场对百度的信心。 2022年第四季度及全年未经审计的财报发布…...

ChatGPT和Web3:人工智能如何帮助您建立和发展您的 Web3 公司

ChatGPT是OpenAI在2022年11月推出的聊天机器人。该机器人建立在OpenAI的GPT-3人工智能家族上,并通过监督学习和强化学习技术进行了优化。 与ChatGPT机器人聊天时,你会感觉自己在与一个懂得一切并以非常教育性的方式回答的朋友交谈。回答在许多知识领域非…...

【人工智能 AI】怎样实施RPA 机器人流程自动化(Robotic Process Automation)?核心技术有哪些?

文章目录 RPA 简介RPA的实施RPA的核心技术1. 自动化测试(1)自动化测试工具(2)自动化测试框架2. 自动化脚本(1)自动化脚本语言(2)自动化脚本框架3. 机器学习(1)机器学习模型(2)机器学习框架(3)自然语言处理(4)图像处理(5)深度学习(6)机器人操作系统RPA核心能…...

基于BP神经网络的性别识别,BP神经网络详细原理,自编码神经网络代码,神经网络案例之18

目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 数据 神经网络参数 基于BP神经网络 性别识别的MATLAB代码 效果图 结果分析 展望 背影 男人体内蛋白质比例大,女生…...

2023年消费电子行业研究报告

第一章 行业概况 消费电子行业是电子信息行业的子行业。消费电子是指围绕着消费者应用而设计的与生活、工作和娱乐息息相关的电子类产品,通常会应用于娱乐、通讯以及文书用途,最终实现消费者自由选择资讯、享受娱乐的目的,主要侧重于个人购买…...

CSDN 编程竞赛三十一期题解

竞赛总览 CSDN 编程竞赛三十一期:比赛详情 (csdn.net) 本次竞赛的最后一道题的描述部分有些问题(题目描述与样例不符),另外,测试数据似乎也有点问题,试了多种方式,但最多只能通过10%的测试点。…...

SpringMVC常见面试题(2023最新)

目录前言1.简单介绍下你对springMVC的理解?2.说一说SpringMVC的重要组件及其作用3.SpringMVC的工作原理或流程4.SpringMVC的优点5.SpringMVC常用注解6.SpringMVC和struts2的区别7.怎么实现SpringMVC拦截器8.SpringMvc的控制器是不是单例模式?如果是,有什…...

【正点原子FPGA连载】第十六章DP彩条显示实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十六章DP彩条显…...

数据结构与算法—链表list

目录 链表 链表类型 链表插入 链表删除 写程序注意点 与数组区别 链表应用 LRU 实现思想 链表 链表,一种提高数据读取性能的技术,在硬件设计、软件开发中有广泛应用。常见CPU缓存,数据库缓存,浏览器缓存等。缓存满时&#…...

自定义View练习题目整理

一、动态音频播放柱形图 1、效果图: 2、步骤 (1)、新建自定义View类,继承View (2)、重写onDraw()方法,使用画笔和画布循环画一定数量的柱形 Overrideprotected void onDraw(Canvas canvas) {s…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...