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

news2025/7/20 14:20:56

文章目录

  • 目的
  • 中断
  • 内存
    • 堆(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 已挂起或已阻塞,没有超时;

总结

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

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

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

相关文章

【java 8】强大的 Stream API

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

因子分析计算权重

因子分析两类权重计算方法总结 案例背景 疫情爆发以来,越来越多的人为了避免线下与人接触,选择了线上购买生活必需品。网购虽然方便快捷,但是随着订单压力的增加,物流问题也随之出现,近期有很多卖家收到物流投诉的问题…

Ubuntu下Python的安装及管理

Ubuntu下Python的安装及管理 1.概述 Ubuntu下python的安装及配置。 2.安装 安装python2.7: python --version #或python2.7 --version检查检查python是否存在,有则无需继续安装python2.7 sudo apt-get update sudo apt-get install python #或者su…

【正点原子FPGA连载】第十五章eMMC读写测试实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

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

BI工具术语表大全:从字母A-Z全面收录

谈到商业智能行业,变革是不可避免的。为了跟上步伐,各种各样的BI 解决方案正在快速迭代更新,以满足企业的数字化需求,那么市场上BI 工具种类繁杂,到底如何选择适合功能全面、满足自己企业运转情况的、合适的BI 工具呢&…

来啦来啦,续篇来啦,CMOS逻辑IC基本工作原理总结概述

在上一篇文章中我们已经认识了CMOS逻辑IC的基本知识和分类,由于功耗和成本以及复杂度的平衡性最好,是实际应用中最常用的一种。今天我们就详细跟大家一起了解东芝CMOS逻辑IC的基本工作原理还有其CMOS逻辑IC系列型号选型吧。 东芝CMOS逻辑IC系列型号选型表…

什么是主数据

整理不易,转发请注明出处,请勿直接剽窃! 点赞、关注、不迷路! 摘要:主数据定义、解释;主数据管理意义、管理工具 定义:主数据是企业内核心业务实体数据。 解释:主数据(Ma…

gRPC Ecosystem 初探

grpc是目前使用很广泛的远程过程调用库,在使用过程中,我们通常会使用protoc命令将proto文件转成特定的代码进行使用。那一些复杂点的应用有没有可以支撑的工具或类库呢。 前段时间在进行自定义grpc tls证书认证的过程中,知道了有一个github项…

【重庆邮电大学协办】2023年第六届数据挖掘与知识发现国际会议(DMKD 2023)

【重庆邮电大学协办】2023年第六届数据挖掘与知识发现国际会议(DMKD 2023) 重要信息 会议网址:www.icdmkd.org 会议时间:2023年6月24-26日 召开地点:中国-重庆 截稿时间:2023年5月24日 录用通知:投稿后2周内 收录…

测试部门来了个99年的卷王之王,老油条感叹真干不过,但是...

在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事,可遇不可求,向他学习还来不及呢。 真正让人反感的,是技术平平&…

实战-缓存数据一致+binlog初始+cannel监听+数据迁移,数据一致性架构设计

前言 一. 解决缓存不命中(高并发操作击穿打挂DB的风险) 当并发量打的时候,当我们的缓存过期时,就算到数据库的比例偏小的时候,我们的请求时比较大的。那也会存在数据库崩掉的情况。解决方案想法如下(总体…

电商共享购模式,消费增值返利,app开发

在当今以市场需求为主导的数字经济时代,消费者需求呈现出精细化管理和多元化的特性,目标市场日渐完善,另外在大数据技术迅速进步和运用的驱动下,总体行业的发展节奏感也在不断加速。因而,企业需要建立一套灵活多变的经…

【Leedcode】数据结构中链表必备的面试题(第五期)

【Leedcode】数据结构中链表必备的面试题(第五期) 文章目录【Leedcode】数据结构中链表必备的面试题(第五期)1.题目2.思路图解(1)第一步:复制每一个结点,插入到原结点和下一个结点之…

OAK相机如何将yolox模型转换成blob格式?(0.1.1pre 及之后版本)

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…

新能源充电桩控制板迭代升级,打开充电桩行业发展新机遇

作为新能源汽车可持续发展的关键因素,充电桩的基础建设和完善一直备受关注。伴随着新能源汽车充电桩规模的扩大和停车位的增加,传统的充电桩控制板已经无法满足人们的充电需求,同时急需加强对新能源汽车充电桩的有效管理,新能源充…

Kali Linux使用Metasploit生成木马入侵安卓系统

额,这是我最后一篇文章了,周一我们开学了 文章目录前言一、Metasploit是什么?演示环境二、生成可执行木马文件1.生成2.运行命令并生成木马配置参数入侵安卓手机命令1.查看对方手机系统信息查看对方手机安装哪些app文件总结前言 前言&#xf…

Sophos Firewall OS (SFOS) 19.5 MR1 - 同步下一代防火墙

Sophos Firewall OS (SFOS) 19.5 MR1 - 同步下一代防火墙 请访问原文链接:https://sysin.org/blog/sfos-19-5/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org Sophos Firewall v19.5 现已推出 Sophos Firewall…

H5视频上传与播放

背景 需求场景: 后台管理系统: (1)配置中支持上传视频、上传成功后封面缩略图展示,点击后自动播放视频; (2)配置中支持上传多个文件; 前台系统: &#…

游戏增长专题-构建游戏分析技术Game Analytic Pipeline与量江湖分享

文章目录亚马逊云科技游戏孵化营-游戏增长主题从事数据分析的起因加入游戏孵化营构建游戏分析技术Game Analytic Pipeline游戏公司的数据分析需求需要收集的数据游戏数据分类Game Analytics Pipline解决方案Game Analytics Pipline演示量江湖 CEO 赵晔 分享专题总结亚马逊云科技…

vue前端项目分享facebook、twitter、linkedin

背景 如果你FaceBook和twitter的分享机制就知道,当你分享数据到他们的网站,会有爬虫机器人一直在读取并解析你的数据(meta里面的),所以怎么让你的meta数据被抓到? 问题 Vue的页面公用一个HTML&#xff0…