RTOS随笔之FreeRTOS

@

目录
  • 为什么使用RTOS?
    • 1. 先考虑OS有什么特点?
    • 2. 再考虑什么情况下使用OS?
  • FreeRTOS调试技巧
  • 任务管理
    • 1. 任务调度流程
    • 2. 任务栈大小,栈溢出检测
    • 3. 中断管理
    • 4. 内存管理
  • FreeRTOS API接口
    • 1. 任务创建

为什么使用RTOS?

1. 先考虑OS有什么特点?

无OS开发情况下,就是一个while循环中执行所有模块功能

  • 顺序执行
    模块依次执行,不能调换顺序,更不能同步实时执行
void main()
{BSP_Init();//硬件初始化while(1){task1();//模块1执行.......task4();//模块4执行}
}
  • 状态调度
    模块根据状态变化执行,可以调换顺序,不能同步实时执行
unsigned int switchflag;
void main()
{BSP_Init();//硬件初始化while(1){switch(switchflag){case status1:task1();//模块1执行break;case status2:task2();//模块2执行break;.......}}
}

上面的任务都需要执行完才能跳转到其它任务,不能在任务运行期间跳转。也有一种情况是任务自己提前break,但是你能让自己break,你不能让别人break啊,所以我们需要一个东西管理任务切换执行,这个就是OS了。

基于这个最初的需求可以看一下现在的OS实现了什么功能?

  • 支持抢占切换/合作切换/时间片切换任务
  • 支持低功耗模式
  • 支持多种系统架构
  • 支持任务同步机制
  • 支持堆栈溢出检测
  • 工具免费,源码免费,版权免费

2. 再考虑什么情况下使用OS?

1.项目功能单一,程序简单,各模块没有强烈同步执行的需求(实时性需求不强),不需要OS
2.项目功能复杂,模块交织,多个模块有强烈同步执行的需求(实时性需求强),需要OS
根据项目考量,没有明确界限

FreeRTOS调试技巧

  • 重定向printf/scanf函数进行串口打印
/*重定向printf函数*/
int fputc(int data,FILE* file)
{USART_SendData(USARTx,(char)data);//发送一个字节while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);//等待发送成功return data;
}
/*重定向scanf函数*/
int fgetc(FILE* file)
{char data;while(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==RESET);//等待接收成功data=USART_ReceiveData(USARTx);//接收一个字节return (int)data;
}
  • 调试任务运行状态,任务栈余量,CPU占用率
  1. 实现计数器
volatile uint32_t  OS_DebugTimeTicks=0;//调试心跳
void BSP_Timex()
{//实现20KHz频率的定时器//开定时器中断//OS_DebugTimeTicks在中断中自增
}
  1. FreeRTOSConfig.h文件宏配置
extern uint32_t OS_DebugTimeTicks;
#define configUSE_TRACE_FACILITY	                 1
#define configGENERATE_RUN_TIME_STATS                1
#define configUSE_STATS_FORMATTING_FUNCTIONS         1
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()     (OS_DebugTimeTicks= 0UL)
#define portGET_RUN_TIME_COUNTER_VALUE()             OS_DebugTimeTicks
  1. 调用RTOS调试函数vTaskList(),vTaskGetRunTimeStats()输出任务信息
static void vTaskTaskUserIF(void *pvParameters)
{uint8_t ucKeyCode;uint8_t DebugInfoBuff[500];while(1){printf("=================================================\r\n");printf("任务名      任务状态 优先级   剩余栈 任务序号\r\n");vTaskList((char *)&DebugInfoBuff);printf("%s\r\n", DebugInfoBuff);printf("\r\n任务名       运行计数         使用率\r\n");vTaskGetRunTimeStats((char *)&DebugInfoBuff);printf("%s\r\n", DebugInfoBuff);	vTaskDelay(20);}
}

任务管理

1. 任务调度流程

1-1

2. 任务栈大小,栈溢出检测

  • 栈大小(最小栈空间)

1-2

内容
函数 每层函数:局部变量+形参+返回地址+状态保存
任务切换 部分CPU寄存器 +FPU寄存器
中断 部分CPU寄存器 +FPU寄存器
可变参函数,函数指针,递归 无法确定栈大小

标准栈空间:最小栈大小的1.5~2倍大小
函数栈大小及嵌套深度可以参考工程编译文件.htm文件
RTOS调试技巧测试栈空间,适当调整

  • 栈溢出检测
    栈生长地址由高到低,如果栈指针下移的地址越过了任务栈的基地址则栈溢出。
    软件预设检测
    在栈生长方向的末端开辟一段空间专门存放固定值,定时判断固定值有没有被修改,被修改说明栈溢出了。存在栈溢出超过判断区间直接宕机的可能。
    MPU内存保护
    通过MPU对栈生长方向的末端区间进行保护,如果出现栈溢出触发MPU异常,在异常中分析栈溢出情况。
    FreeRTOS栈溢出检测

方法1:任务切换时检测栈指针是否越界,栈溢出触发溢出回调函数vApplicationStackOverflowHook()

#define configCHECK_FOR_STACK_OVERFLOW 1
void vApplicationStackOverflowHook(  TaskHandle_t xTask,signed char *pcTaskName);//溢出回调函数

方法2: 任务栈初始化为固定值,任务切换时检测栈尾16个字节是否都是初始化设置的固定值。

#define configCHECK_FOR_STACK_OVERFLOW 2
void vApplicationStackOverflowHook(  TaskHandle_t xTask,signed char *pcTaskName);//溢出回调函数

任务切换时进行栈溢出检测无法确保任务运行期间栈不溢出。
任务切换时进行栈溢出检测无问题只能说明栈尾的数据是固定值,但是不能说明是初始时设置的固定值还是运行时保存的固定值,存在第2种情况的可能性。

3. 中断管理

M3/M4内核MCU中断优先级取寄存器8位中的高4位表示,共有16种组合。

几点原则:

  • RTOS采用中断分组4,也就是0~15级全抢占式优先级
  • 高抢占级中断可以抢占低抢占级中断
  • 同抢占级中断不能互相抢占,先到先行
  • Reset,NMI不可屏蔽中断,Hard Fault高于普通中断,优先级固定

RTOS中断配置:

Systick中断:产生心跳,触发PendSV中断
PendSV中断:任务切换
SVC中断:启动任务,只执行一次

#define configPRIO_BITS      4//优先级占用bits
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   15//RTOS用的Systick和PendSV中断优先级
#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )//Systick和PendSV中断配置的优先级左移4位写进优先级配置寄存器
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    2//可以使用RTOS函数的最高优先级,2~15优先级中断中可用RTOS接口
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )//可以使用RTOS函数的最高优先级左移4位写进优先级配置寄存器

RTOS管理的中断会出现中断延迟的可能,对于实时性要求强的中断不能被RTOS管理,否则会出现中断无法及时响应的情况。
FreeRTOS使用basepri寄存器,uCOS使用primask寄存器。

寄存器 功能
primask 这是个只有 1 个 bit 的寄存器。 在它被置 1 后,就关掉所有可屏蔽的异常,只剩下NMI 和硬 fault 可以响应。它的缺省值是 0,表示没有关中断
faultmask 这是个只有 1 个 bit 的寄存器。当它置 1 时,只有 NMI 才能响应,所有其它的异常,甚至是硬 fault,也通通闭嘴。它的缺省值也是 0,表示没有关异常
basepri 这个寄存器最多有 9 位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。但若被设成 0,则不关闭任何中断, 0 也是缺省值

4. 内存管理

FreeRTOS提供5种内存管理接口

1-3

FreeRTOS API接口

1. 任务创建

函数 描述
xTaskCreate( ) 动态创建一个任务,从RTOS的堆上分配栈空间
xTaskCreateStatic( ) 静态创建一个任务,用户手动分配栈空间
xTaskCreateRestricted( ) 任务控制块从RTOS堆上分配,用户手动分配栈空间 (和FreeRTOS-MPU一起使用)
xTaskCreateRestrictedStatic( ) 用户手动分配任务控制块和栈空间 (和FreeRTOS-MPU一起使用)

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

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

相关文章

LTspice仿真命令

LTspice仿真命令交流扫描 命令 .ac <oct, dec, lin> 参数1:扫描方式(oct 八倍频 dec 十倍频 lin 线性扫描) 参数2: 扫描数 参数3: 起始频率 参数4: 终止频率 交流小信号分析,电源设置为小信号 示例 …

使用pyqt5 pyserial TTS模型vosk开发的语音串口工具

项目概述 这是一个集成了语音识别和串口通信功能的智能控制工具,旨在通过自然语言语音指令实现对硬件设备的远程控制。该工具采用pyqt5 GUI 界面设计,支持多种串口参数配置,能够实时识别语音指令并通过串口发送控制…

AI教我一条SQL实现明细转树形结构

AI教我一条SQL实现明细转树形结构 1. 原始数据序号 COUNTRY PROVINCE CITY GAME1 中国 广东 深圳 地心侠士2 中国 广东 广州 地心侠士3 中国 江苏 南京 地心侠士4 美国 加州 洛杉矶 地心侠士2. 目标数据序号 节点名称 …

十分钟读懂 Deepseek MTP(Multi-Token Prediction)

传统的大语言模型采用的训练目标是 Next-Token Prediction (NTP),即在位置 t 上预测下一个 token (t+1)。而 Multi-Token Prediction (MTP) 的核心思想在于:不仅预测下一个 token,而是能够同时预测多个未来的 token…

2025年度中国工业制冷设备品牌排名:东洋制冷机靠不靠谱

TOP1推荐:深圳市东洋冷冻设备有限公司 评价指数:★★★★★ 口碑评分:99分 行业表现:A+++++级 介绍: 深圳市东洋冷冻设备有限公司(简称东洋制冷)电话号码:13827472315,成立于1993年(前身为深圳市东洋工业冷冻…

2025年山东外贸网站开发服务商权威推荐:本地网站建设/出海网站建设/科技网站建设服务商精选

随着全球跨境电商市场的持续扩张,专业外贸网站建设需求呈现显著增长。据行业数据显示,2024年我国跨境电商进出口额达2.38万亿元,增长15.7%,其中专业外贸网站作为企业出海基础载体,发挥着不可替代的作用。 本文将基…

2025年油雾净化设备制造商:中国五大精密油雾净化设备靠谱供应商权威测评与深度解析

TOP1推荐:天浩洋环保 评价指数:★★★★★ 口碑评分:99分 行业表现:A+++++级 介绍: 天浩洋环保电话号码:13902481558,成立于1996年,注册资本1.08亿,二十余载始终秉承匠心精神,专注于工业挥发性有机废气治理运…

2025年防盗盖封口机厂商权威推荐:铝盖旋盖机/压盖机/锁盖机源头厂家精选

在现代工业生产中,防盗盖封口机作为包装流程的核心设备,其性能直接关系到产品密封性、生产效率和品牌形象。根据QYResearch调研数据,2024年全球锁盖机市场规模已达数亿元,预计2031年将达到新高峰,年复合增长率稳定…

2025年冷鲜肉切片机制造企业权威推荐榜单:牛肉切片机/连续式鲜肉切片机/鲜肉切片机源头厂家精选

在食品加工设备领域,一批拥有核心技术与创新解决方案的企业正在推动冷鲜肉切片行业的智能化升级,其中自动化设备年增速已超行业平均水平。 据最新行业报告显示,2025年中国食品加工设备市场规模持续扩大,其中冷鲜肉…

适合高中数学辅导的培训机构怎么选?从基础到拔高这样挑不踩坑

在当前教育背景下,高中数学的重要性不言而喻,它不仅是高考的关键拉分科目,更是培养学生逻辑思维能力的核心环节。然而,面对市场上层出不穷的辅导机构,如何为孩子选择一条从巩固基础到冲刺拔高的科学路径,成为众多…

pcb入门

原理图输入电容耐压100V ,输出电压5V,电容考虑额定电流大小 旋转器件: 空格 放置导线: w键 网络标识-> vcc -> 可以通过 tab键改成VIN 编辑器件-> 栅格尺寸0.05-> 调整引脚 非链接标识 -> 空引脚(高…

6.AUserDefaults 使用指南

Aquarius 开发框架旨在帮助独立开发者和中小型团队,完成 iOS App 的快速实现与迭代。使用框架开发将给你带来简单、高效、易维护的编程体验。大家好,我是K哥。一名独立开发者,同时也是Swift开发框架【Aquarius】的作…

S-PSC 5202 游记

屏幕在深夜微微发亮,思想在那虚树路径上彷徨。——《膜你抄》 都 5202 年了,怎么还有人在清醒的时候去写游记啊。 day -? 省流:压线过初赛。 day 0 困困困困困。 随便打了场模拟赛,难度 绿蓝紫紫,拿下 [0,100]+7…

【科普】数据基础设施“三统一”是什么?

打开链接点亮社区Star,照亮技术的前进之路。每一个点赞,都是社区技术大佬前进的动力Github 地址: https://github.com/secretflow 整体概述 隐语社区严格遵循《国家数据基础设施建设指引》及《国家数据基础设施建设…

2025年11月全屋定制品牌推荐评价:消费者满意度调查结果

随着生活品质的提升,越来越多的家庭在选择家居解决方案时倾向于全屋定制服务。这类需求通常来自于新房装修、旧房改造或者追求个性化生活空间的消费者。他们往往面临品牌选择困难、质量参差不齐、售后服务不完善等痛点…

2025年11月全屋定制品牌推荐榜单:十大品牌综合对比与权威评测

随着生活品质的提升,越来越多的家庭开始关注家居环境的个性化和功能性,全屋定制因其空间利用率高、风格统一等优势逐渐成为市场主流选择。本文旨在为计划在2025年底进行家居装修或换新的消费者提供一份客观、全面的全…

Smartproxy提取指南——JSON-first 架构与参数化最佳实践 - Smart

本指南以 API 代理 IP 提取为核心,结合参数化设计、JSON-first 接口规范、严格的版本管理与状态码标准,帮助您构建高成功率、低运维成本、可平滑扩展的数据采集流水线。基于 8000万+ 住宅代理 IP 资源池、覆盖 全球 …

2025年11月远程控制软件评价排行:基于多维度数据对比

在数字化办公日益普及的今天,远程控制软件已成为企业办公、技术支持、个人设备管理的重要工具。根据2025年远程办公行业白皮书显示,超过78%的企业已将远程控制软件纳入日常办公体系,而个人用户使用远程控制软件的比…

[PaperReading] GME: Improving Universal Multimodal Retrieval by Multimodal LLMs

目录GME: Improving Universal Multimodal Retrieval by Multimodal LLMsTL;DRMethodModel多模态数据数据合成Experiment效果可视化总结与思考 GME: Improving Universal Multimodal Retrieval by Multimodal LLMs lin…