找回密码
 立即注册
查看: 644|回复: 6

系列文章目录--STC单片机FreeRTOS入门

[复制链接]

188

主题

1406

回帖

5510

积分

荣誉版主

积分
5510
发表于 2025-11-8 20:33:37 | 显示全部楼层 |阅读模式
本系列文章介绍STC单片机FreeRTOS


(1)下面是FreeRTOS在STC32单片机上的STC官方移植版,安全性得到过验证,请大家放心使用:

FreeRTOS-STC32G-CORE-V1.0.2-Library-DemoCode-20220429.zip (3.75 MB, 下载次数: 0)

(2)下面是FreeRTOS在STC32单片机上的STC官方移植版的“请先阅读本使用方法.txt”的正版说明,请大家正确识别:

/*
    本程序的代码是以FreeRTOS官方的202112.00版本(内核版本为V10.4.6)的原始代码为基础进行全新移植
    目前STC官方命名的本版本号是:V1.0.2
    FreeRTOSConfig.h文件中的中文注释引用自网友泽文提供的移植版本,在此对泽文、小宇等热心网友表示感谢!
    本移植代码基于我公司的STC32G12K128系列单片机,可完美支持STC32G12K128的LARGE模式(64K代码)和
    HUGE模式(128K),简单设置即可选择不同的ROM模式
   
    LARGE模式的配置方法:
    1. FreeRTOSConfig.h 里面配置configUSE_ROMHUGE 为 0
    2. FreeRTOS_Demo项目的其它设置维持不变
   
    HUGE模式的配置方式:
    1. FreeRTOSConfig.h 里面配置configUSE_ROMHUGE 为 1
    2. 点击Keil工程配置按钮【Options for Target】-> 【Target】-> 【Exeternal Memory】->
       【ROM】 起始地址:0xFE0000 大小:0x20000(注意:LARGE模式一定不要设置此项)
    3. FreeRTOS_Demo项目的其它设置维持不变
   
    本Demo程序的默认系统时钟为24MHz,可以根据需要自己调整FreeRTOSConfig.h 里面的MAIN_Fosc配置值
    当前方案的任务切换耗时2.5uS(测试频率24MHz)
    本Demo程序可同时支持软件模拟仿真和硬件真实运行,无需额外的设置
    本Demo程序已实现FreeRTOS的抢占模式和时间片轮询模式,抢占模式在中断服务程序中直接切换任务

        库函数版本目录结构:
        Sources (源程序目录)
        |----Task (任务程序目录)
        |    |----inc (任务程序头文件目录)
        |    |----src (任务程序源代码目录)
        |----Driver (硬件驱动程序目录)
        |    |----inc (驱动程序头文件目录)
        |    |----isr (驱动中断程序目录)
        |    |----src (驱动程序源代码目录)
        |----User (用户程序及配置文件目录)
        |    |----include (用户程序头文件目录)
        |----FreeRTOS (FreeRTOS核心代码目录)
*/
回复

使用道具 举报 送花

188

主题

1406

回帖

5510

积分

荣誉版主

积分
5510
 楼主| 发表于 2025-11-8 20:34:05 | 显示全部楼层
系列文章目录


STC32G FreeRTOS入门(1):单片机后台任务简介
https://www.stcaimcu.com/thread-3603-1-1.html
(出处: 国芯人工智能技术交流网站)



STC32G FreeRTOS入门(2):单片机前后台任务编程中的问题
https://www.stcaimcu.com/thread-3604-1-1.html
(出处: 国芯人工智能技术交流网站)



STC32G FreeRTOS入门(3):STC32G PK STC8--完胜
https://www.stcaimcu.com/thread-3605-1-1.html
(出处: 国芯人工智能技术交流网站)



STC32G FreeRTOS入门(4):实时任务
https://www.stcaimcu.com/thread-3606-1-1.html
(出处: 国芯人工智能技术交流网站)



STC32G FreeRTOS入门(5):与优化无关的软件延时函数
https://www.stcaimcu.com/thread-3610-1-1.html
(出处: 国芯人工智能技术交流网站)



STC32G FreeRTOS入门(6):如何学好RTOS编程
https://www.stcaimcu.com/thread-3611-1-1.html
(出处: 国芯人工智能技术交流网站)



STC32G FreeRTOS入门(7):抢占式任务调度
https://www.stcaimcu.com/thread-3612-1-1.html
(出处: 国芯人工智能技术交流网站)



STC32G FreeRTOS入门(8):空闲任务与任务恢复
https://www.stcaimcu.com/thread-3613-1-1.html
(出处: 国芯人工智能技术交流网站)



STC32G FreeRTOS入门(9):搭建完整操作系统功能
https://www.stcaimcu.com/thread-3614-1-1.html
(出处: 国芯人工智能技术交流网站)



STC32G FreeRTOS入门(10):STC32G单片机的Keil C251引导过程简析
https://www.stcaimcu.com/thread-3615-1-1.html
(出处: 国芯人工智能技术交流网站)



STC32G FreeRTOS入门(11):现场保护与恢复机制—FreeRTOS与C251中断异同
https://www.stcaimcu.com/thread-3616-1-1.html
(出处: 国芯人工智能技术交流网站)


回复

使用道具 举报 送花

188

主题

1406

回帖

5510

积分

荣誉版主

积分
5510
 楼主| 发表于 2025-11-8 20:34:39 | 显示全部楼层
参考资料
回复

使用道具 举报 送花

已绑定手机

0

主题

45

回帖

554

积分

高级会员

积分
554
发表于 2025-12-27 21:22:10 | 显示全部楼层
好资料,有时间时好好看看。
回复

使用道具 举报 送花

188

主题

1406

回帖

5510

积分

荣誉版主

积分
5510
 楼主| 发表于 3 天前 | 显示全部楼层
我问STC AI助手:
请介绍FreeRTOS为什么没有中断内任务切换函数/接口?以及在中断内强行切换的后果。

STC AI助手回答:
基于已获取的手册数据与论坛信息,我来系统回答您的问题。

FreeRTOS 为什么没有中断内任务切换函数/接口?以及在中断内强行切换的后果
为什么FreeRTOS没有专门的中断内任务切换接口?
FreeRTOS确实提供了中断安全的服务函数(如 xSemaphoreGiveFromISR()、xQueueSendFromISR()、xTaskNotifyFromISR() 等),这些函数都带有 FromISR 后缀,设计用于在中断服务程序中调用。但这些函数在中断内只负责唤醒/激活高优先级任务,并不会直接执行任务切换动作,而是通过一个标志位(如 pxHigherPriorityTaskWoken)来告知内核"是否需要切换"。
FreeRTOS 的 portYIELD_FROM_ISR()(即 taskYIELD_FROM_ISR)接口在许多移植版本中是存在的,但其设计方式取决于目标平台的架构。
在 STC32G 官方移植版中,该接口是缺失的,原因与 STC32G(32位8051内核)的特殊中断机制密切相关。
核心原因:
  • STC32G 是32位8051内核,基于4级流水线设计。中断响应的时序与传统8051有显著差异。
  • STC32G 的中断向量位于 FF00xxH 高位地址区间(见手册中断向量表),中断处理的现场保护/恢复机制与标准8051不同。
  • 在中断内强行执行任务切换,意味着中断服务程序尚未正常退出(RETI尚未执行),CPU 的硬件堆栈中保存的返回地址、状态字等信息仍是"中断现场"而非"任务现场"。此时直接跳转到另一个任务的上下文,会导致中断返回地址丢失、堆栈错乱、中断嵌套状态破坏等一系列严重问题。
在中断内强行切换的后果
依据 STC32G 手册中关于多级流水线内核的中断响应的说明:
对于 STC 的增强型 8051 单片机(例如 STC8G/STC8H 系列),由于是多级流水线设计,响应中断上会比传统 8051 再多执行一条语句;如果当前正在执行的指令是中断返回指令 RETI 或访问中断使能寄存器、中断请求寄存器或中断优先级寄存器的特殊指令时,CPU 等当前的这条特殊指令执行完,同时解码下一条指令,直到下一条指令不是特殊指令,则等下一条指令执行完成才能响应中断请求。
STC32G 属于32位8051内核,同样具有多级流水线特性。在中断内未完成现场保存就强行切换任务,会导致:
  • 堆栈指针错乱:中断现场保存的返回地址未被正确退出就切换了任务栈。
  • 中断返回地址丢失:切换后当前中断的 RETI 返回路径被破坏。
  • 中断嵌套状态混乱:中断优先级寄存器、中断标志位的处理时序被破坏。
  • 可能导致系统死机/跑飞:正如论坛中杨老师指出的——"你的这个移植版存在重大BUG:不能运行此次排行榜的实时响应时间测试程序,会死机。"

回复

使用道具 举报 送花

188

主题

1406

回帖

5510

积分

荣誉版主

积分
5510
 楼主| 发表于 3 天前 | 显示全部楼层
我问STC AI助手:
请评价为什么FreeRTOS在STC32G单片机上的STC官方移植板没有中断内任务切换?

STC AI助手回答:
为什么 FreeRTOS 在 STC32G 单片机上的官方移植版没有中断内任务切换?
根本原因:STC32G 的系统架构决定了中断内不适合做任务切换
① 32位8051内核的多级流水线中断响应机制
依据手册《多级流水线内核的中断响应》:
对于 STC 的增强型8051单片机(例如 STC8G/STC8H 系列),由于是多级流水线设计,响应中断上会比传统的 8051 再多执行一条语句;如果当前正在执行的指令是中断返回指令 RETI 或访问中断使能寄存器、中断请求寄存器或中断优先级寄存器的特殊指令时,CPU 等当前的这条特殊的指令执行完,同时解码下一条指令……
STC32G 作为32位8051内核,其流水线深度更深,中断响应、现场保护、中断返回的时序设计比传统8051复杂得多。在中断内进行任务切换需要对硬件现场(包括 PSW、ACC、B、DPTR、R0-R7等)进行完整保护,而 STC32G 的硬件中断机制本身已经在中断入口处保存了部分现场。如果在其中再叠加 RTOS 的上下文切换代码,会破坏硬件中断现场的完整性。
② 官方移植版的选择是"稳妥可靠优先"
从官方移植版(V1.0.2)的发布说明中可以看到,其设计目标是"简洁、可靠"。在 STC32G 上,官方选择了在Timer0中断(时钟节拍)中统一进行任务切换的方案,而不是在任意中断内进行切换。这样做的好处是:
  • 任务切换时机确定且可控,只在节拍中断这一个固定地点执行。
  • 避免在多个不同的中断中重复实现复杂的切换逻辑。
  • 保证中断现场的完整性,系统可靠性更高。
③ 官方版本采用"延迟切换"策略
依据论坛帖子《关于stc32的freertos的中断抢占实时性问题》中的讨论:
目前系统在打开抢占式内核的情况下,中断里的事件触发会在下一个tick后得到任务切换响应……如果把这一套代码搬到其他中断上,中断效率会非常低下。
官方方案中,中断内通过 FromISR 系列函数激活高优先级任务后,实际的上下文切换被延迟到下一个时钟节拍(Timer0中断)时执行。虽然牺牲了微小的实时性(延迟约一个tick),但换来了系统的稳定性和中断响应的高效性。
④ 在32位8051内核上实现中断内切换的技术风险高
在 STC32G 的32位8051内核上,中断内切换任务需要极其精细的汇编级处理,涉及:
  • 中断现场的保存与恢复(与任务上下文保存不能冲突)
  • 中断返回地址的处理
  • 多级流水线的中断响应时序控制
这些处理在传统 ARM Cortex-M 内核上有成熟的 PortYIELD_FROM_ISR 解决方案(利用 PendSV 中断),但在 STC32G 的32位8051内核上没有类似的硬件机制可供利用。
因此,官方选择不提供中断内任务切换接口,是一个基于硬件架构的理性决策。


总结
问题:为什么没有中断内切换?  核心结论:STC32G 为32位8051内核+4级流水线,中断现场保护机制特殊,中断内强行切换会破坏硬件现场完整性
问题:STC官方版为什么不做中断内切换?  核心结论:官方选择"简洁可靠"策略,在节拍中断统一切换;延迟切换牺牲微小实时性换取系统稳定性;STC32G 缺少 ARM Cortex-M 的 PendSV 等硬件辅助机制
信息来源:
  • [STC32G系列手册] 中断系统、多级流水线内核的中断响应、关于STC32G系列关闭中断应用注意事项
  • [论坛帖 thread-7614] FreeRTOS @32G12K128移植讨论
  • [论坛帖 thread-581] FREERTOS中断里切换任务
  • [论坛帖 thread-476] 关于stc32的freertos的中断抢占实时性问题
  • [论坛帖 thread-60] STC32开源-FreeRTOS for STC32G12K128 官方简洁可靠版V1.0.2
郑重提醒:
在中断内强行切换任务属于非标准、高风险操作
若您在实际项目中有中断内激活高优先级任务的需求,建议遵循 FreeRTOS 官方规范:使用 FromISR 系列接口激活任务,由内核在安全的时机完成切换。若必须追求中断内即时切换,请务必充分验证系统的可靠性和稳定性后再投入实际使用。


回复

使用道具 举报 送花

188

主题

1406

回帖

5510

积分

荣誉版主

积分
5510
 楼主| 发表于 昨天 12:17 | 显示全部楼层
这是我的技术分析结论:

在没有 PendSV 的单片机上硬上 FreeRTOS:关总中断切任务的安全隐患清单
https://www.stcaimcu.com/thread-25602-1-1.html
(出处: 国芯人工智能技术交流网站)

在没有 PendSV 的单片机上硬上 FreeRTOS:关总中断切任务的安全隐患清单

一、先说结论有,而且不止一个。
如果你打算把 FreeRTOS 从 ARM Cortex-M 单片机搬到 STC32G12K128 这类没有 PendSV 异常硬件、也没有 BASEPRI 中断屏蔽寄存器的 8051 增强型单片机上,并且采用 "在中断里关总中断强行切换任务" 的做法,
那么功能上大概率能跑通,但实时性和可靠性会比 ARM 原版差一截
具体有哪些隐患、严重到什么程度,下面结合一段真实可跑的移植代码逐条说。

五、那到底能不能用
直接给结论。
做演示、做玩具、做对实时性不敏感的小东西 —— 能用。
做产品、做有安全要求的设备、做工业现场的控制器 —— 这套移植方案的安全余量不够。
具体判断标准有三条,你可以对着自己的项目量一量。
第一条,用 GPIO 翻转实测 CLR EA 到 SETB EA 的最长时间,包括 PendSV 和 Timer0 两个地方。
第二条,找出你系统里最不能等的那个中断 —— 可能是急停、可能是看门狗、可能是总线错误。
第三条,把上面两个数加起来,看是不是远小于那个最紧急中断能容忍的延迟窗口。
如果加起来已经接近甚至超过容忍窗口,那就别在这种架构上硬撑 FreeRTOS 了。
要么换 MCU,要么老老实实前后轮询加状态机,不一定比被一堆隐患拖住的 RTOS 差。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-20 00:48 , Processed in 0.068854 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表