找回密码
 立即注册
楼主: 神农鼎

FreeRTOS入门@STC32G, 【1 ~ 11 集】 连载,本坛荣誉版主杨老师出品

 火 [复制链接]
已绑定手机

6

主题

497

回帖

2546

积分

金牌会员

积分
2546
发表于 2025-1-4 23:20:58 | 显示全部楼层
感谢杨老师无私分享
学习
回复

使用道具 举报 送花

已绑定手机

0

主题

32

回帖

466

积分

中级会员

积分
466
发表于 2025-1-26 10:11:42 | 显示全部楼层
感谢杨老师无私分享
回复

使用道具 举报 送花

已绑定手机

3

主题

42

回帖

2040

积分

金牌会员

积分
2040
发表于 2025-4-8 08:31:41 | 显示全部楼层
666
回复

使用道具 举报 送花

已绑定手机

27

主题

351

回帖

1730

积分

金牌会员

积分
1730
发表于 2025-5-12 15:58:42 | 显示全部楼层
要开始学习RTOS了
回复

使用道具 举报 送花

已绑定手机

10

主题

41

回帖

316

积分

中级会员

积分
316
发表于 2025-5-21 13:24:13 | 显示全部楼层
学习了
不积硅步,无以至千里。
回复

使用道具 举报 送花

已绑定手机

0

主题

2

回帖

55

积分

注册会员

积分
55
发表于 2025-6-10 17:35:36 | 显示全部楼层
学习了
回复

使用道具 举报 送花

已绑定手机

0

主题

1

回帖

28

积分

新手上路

积分
28
发表于 2025-8-22 11:09:14 | 显示全部楼层
神*** 发表于 2023-12-3 10:18
STC32G FreeRTOS入门(3):STC32G PK STC8--完胜

STC32G FreeRTOS入门(3):STC32G PK STC8--完胜 - Fre ...

杨老师,以上STC32G的代码是在哪种试验板上跑的?用你的程序烧写在9.62的试验箱上(STC32G12K128),串口助手无法通讯?
回复

使用道具 举报 送花

0

主题

8

回帖

1063

积分

金牌会员

积分
1063
发表于 2026-2-27 15:40:06 | 显示全部楼层
回复

使用道具 举报 送花

79

主题

1108

回帖

4964

积分

荣誉版主

积分
4964
发表于 2026-9-18 00:11:01 | 显示全部楼层
(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核心代码目录)
*/
回复

使用道具 举报 送花

79

主题

1108

回帖

4964

积分

荣誉版主

积分
4964
发表于 2026-9-18 00:12:02 | 显示全部楼层
我问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:不能运行此次排行榜的实时响应时间测试程序,会死机。"


回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-11-7 10:51 , Processed in 0.075140 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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