找回密码
 立即注册
楼主: tzz***

uC/OS-II @ STC32G 移植

[复制链接]

该用户从未签到

20

主题

576

回帖

1201

积分

荣誉版主

积分
1201
 楼主| 发表于 2023-11-16 14:12:20 | 显示全部楼层
本帖最后由 tzz1983 于 2023-11-17 16:27 编辑

最新版本V1.05 已实现中断专用栈MSP+任务栈PSP模式. 大幅节省RAM使用量
代码已在1楼更新

251内核实现中断专用栈MSP介绍
实现原理: 首次进入中断时,如果当前是PSP,则保存PSP指针,并切换至MSP,退出中断时操作相反. 嵌套中断时,已使用MSP,不必切换栈.


性能提升:STC32G12K128 内含4K EDATA, 植入UCOSII后, 去掉1500字节左右固定开销外, 实际剩下2500字节可用.
在没有MSP功能前, 中断发生在哪个任务, 即沿用哪个任务的堆栈. 实际上中断用栈量很大. 举例说明: 如果中断内调用函数, 就是寄存器全入栈, 大约38字节, 4个优先级最多嵌套3次 38*3=114字节.
使用MSP(中断专用堆栈)后, 每个任务可节省 114字节, 假设8个任务+2个系统任务(空闲, 统计),  则节省114*10=1140字节,  这都差不多是2500总数的一半了, 说性能翻倍也不过份.


安全性提升: 不用再担心中断优先级设置变更后影响全局任务栈, 现在中断和任务, 任务和任务之间都做到了有效的隔离

如何使用:
每个中断可以单独设置是否使用MSP功能, 在头文件"os_isr_251.h"中用宏来开启. 如果设置了对应的宏, 则在"os_isr_251.c"中创建对应的中断汇编封皮函数
封皮函数已包含"堆栈切换" "OSIntNesting++" "OSIntExit()"功能, 剩下的事情,用户只需要在勾子函数中添加自己的中断代码即可. 实际用起来更简单了.

没有开启MSP功能的中断, 采取沿用的方式, 即当中断发生时, 不管当前是MSP还是PSP, 都沿用.

如果所有中断都不开启MSP功能, 则不会创建MAP_STK(中断专用堆栈). 用法不变, 仍是用关键字interrupt创建中断函数, 也就是说MSP功能是可选的. 兼容之前的用法

定时器3中断应用举例:
用法1. 中断使用MSP:
使能宏OS_ISR19_USE_MSP_EN 1u. 中断代码放在勾子函数中, 适用于有函数调用的中断代码.
说明; 使能宏"OS_ISR19_USE_MSP_EN"以后, 不要再用关键字 interrupt 创建中断函数Timer3_Handler(), 这个函数已在"os_isr_251.c"创建了.
void Timer3_ISR_Handler_Hook (void)        
{
     P27 = ~P27;        //中断代码
     abc();                //中断代码
}

用法2. 快速中断方式:
不使能宏OS_ISR19_USE_MSP_EN  0u. 适用于中断代码没有使用函数调用时(包括自编函数和OS服务函数). 利用编绎器智能减少寄存器入栈数量, 这样的中断没有多余的动作,效率是最高的.
void Timer3
_ISR_Handler() interrupt 19
{
        //利用编绎器智能减少寄存器入栈数量, 这样的中断没有多余的动作,效率是最高的. (前提是没有函数调用)
        //不用OS服务时可以不用 OSIntNesting++;     
    P27 = ~P27;        //中断代码
        //同时也不需要 OSIntExit();
}



点评

恭喜你啊兄弟,MSP+PSP模式开发成功,这是STC8051世界的重大胜利!  发表于 2023-11-16 19:26
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    半小时前
  • 签到天数: 165 天

    [LV.7]常住居民III

    12

    主题

    100

    回帖

    1514

    积分

    金牌会员

    积分
    1514
    发表于 2023-11-16 14:53:13 | 显示全部楼层
    感谢技术大牛分享~~~目前在使用STC官方移植的FreeRTOS,完成手上的工作后,回来再学习
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9556

    回帖

    1万

    积分

    管理员

    积分
    14035
    发表于 2023-12-21 10:53:55 | 显示全部楼层
    MSP+PSP模式开发成功,这是STC8051世界的重大胜利 !

    点评

    有空官方可以去测试一下OS各种功能, 我一直都在用这个版本做产品, 目前没有发现什么问题  详情 回复 发表于 2023-12-21 12:44
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    576

    回帖

    1201

    积分

    荣誉版主

    积分
    1201
     楼主| 发表于 2023-12-21 12:44:37 | 显示全部楼层
    神农鼎 发表于 2023-12-21 10:53
    MSP+PSP模式开发成功,这是STC8051世界的重大胜利 !

    有空官方可以去测试一下OS各种功能, 我一直都在用这个版本做产品, 目前没有发现什么问题

    点评

    帮移植下 CANOpen 到这上面,方向【CAN + USB】  详情 回复 发表于 2023-12-21 12:59
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9556

    回帖

    1万

    积分

    管理员

    积分
    14035
    发表于 2023-12-21 12:59:02 | 显示全部楼层
    tzz1983 发表于 2023-12-21 12:44
    有空官方可以去测试一下OS各种功能, 我一直都在用这个版本做产品, 目前没有发现什么问题 ...

    帮移植下 CANOpen 到这上面,方向【CAN + USB】

    点评

    年底手上活有些多, 明年初看看  发表于 2023-12-21 13:11
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-22 08:53
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    10

    主题

    41

    回帖

    288

    积分

    等待验证会员

    积分
    288
    发表于 2024-1-5 11:05:28 | 显示全部楼层
    将定时器4中断模似软中断PendSv来切换任务更改为使用普通I/O模拟中断比较安全吧,虽然切换时间上有一些延迟,但中断资源丰富。
             我在其他应用中也是使用定时器4模拟中断,但当串口4设置为定时器4作为波特率发生器时,这个模拟中断就成为真实中断了。UCOS-II@STC32G12K128 移植程序还没有深入研究,不知道这个问题有否屏蔽

    点评

    两步自定义PendSv使用的中断号 1. 文档"main.c"中修改初始化函数prvPortPendSvInit()的代码 2. 文档"os_cpu.h"中修改PendSv中断行为的相关宏定义  发表于 2024-1-5 14:33
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 10:40
  • 签到天数: 127 天

    [LV.7]常住居民III

    3

    主题

    215

    回帖

    620

    积分

    高级会员

    积分
    620
    发表于 2024-1-9 21:08:51 | 显示全部楼层
    刚刷到这个帖子,下载下来观摩学习一下
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9556

    回帖

    1万

    积分

    管理员

    积分
    14035
    发表于 2024-2-9 09:41:13 | 显示全部楼层
    龙年新春捷
    STC8H2K32U-45MHz-LQFP32/TSSOP28 的 USB 型 MCU 已开始制造光罩流程中
    RMB1.3 的 USB, STC8H2K32U-45MHz-LQFP32/TSSOP28/20,SOP16, 4月开始供货
    51世界火热的夏天全面来临 全面 进入 USB 时代 !新增硬件32位乘除法器MDU32C
    硬件USB 支持 仿真/下载, RTC 实时时钟, 年/月/日/时/分/秒,星期
    真12位ADC, 144MHz-16位高级PWM新增硬件移相功能

    32K Flash, 2.5k SRAM, USB, 双串口/I2C/SPI, 轨到轨比较器,12位ADC, PWM
    串口1/串口2:

    ===都支持串口接收硬件超时侦测硬件奇偶校验
    ===都支持帧错误数据检测自动地址识别
    T11,强大的24位低功耗定时器/系统定时器,支持低功耗唤醒
    P1.2口在P5.4口上共享P1.0/P1.1的全部数字功能可以交换

    STC8H2K32U51成为永恒的经典:钻石恒久远51永流传


    ======================================================================

    RMB0.99 的 USB, STC8H2K08U-45MHz-TSSOP20/SOP16,已开始供货
    51世界火热的夏天全面来临 全面 进入 USB 时代 !

    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 172 天

    [LV.7]常住居民III

    116

    主题

    475

    回帖

    638

    积分

    高级会员

    积分
    638
    发表于 2024-2-10 08:23:08 | 显示全部楼层
    神农鼎 发表于 2024-2-9 09:41
    龙年新春捷报:
    STC8H2K32U-45MHz-LQFP32/TSSOP28 的 USB 型 MCU 已开始制造光罩流程中
    RMB1.3 的 USB, STC ...

    加油!
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9556

    回帖

    1万

    积分

    管理员

    积分
    14035
    发表于 2024-2-10 09:20:33 | 显示全部楼层
    截图202402100920312652.jpg
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-21 09:51 , Processed in 0.080931 second(s), 74 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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