找回密码
 立即注册
楼主: CosyOS

全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板

 火... [复制链接]

2

主题

14

回帖

125

积分

注册会员

积分
125
发表于 2024-7-9 16:35:34 | 显示全部楼层
Cos*** 发表于 2024-7-9 15:52
你这个差的地方有很多:
1、V3.0.0 版本开始,增加了 Port 文件,你没有加入;
2、os_redef.h,原为 #incl ...

感谢!!!!!!!!!!!!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-7-10 13:11:11 | 显示全部楼层
本帖最后由 CosyOS 于 2024-7-10 13:17 编辑
tzz1*** 发表于 2024-7-8 22:53
Keil C251 编译器, 也有 ?C_XBP  , 不过我没有尝试过.  难道你用251也搬栈?   
我觉得即便是只有 2K edata ...

C251,局部变量,
如果想放在 可重入栈 中,就不要指定 存储域,这样还有 寄存器优先分配;
如果想放在 特定的内存,就用 static,这样就由 存储域 或 内存 Model 决定,
不受 可重入函数 影响。但,该函数一旦重入,static 变量 就无法满足 重入条件了,

该函数就不是 可重入函数了,这点需要注意。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:472
  • 最近打卡:2025-05-05 10:52:20

44

主题

231

回帖

2859

积分

金牌会员

积分
2859
发表于 2024-7-10 22:40:43 | 显示全部楼层
CosyOS 支持 SDCC吗?

点评

暂时不支持,以后会的  发表于 2024-7-11 06:32
不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2024-10-07 09:37:38

3

主题

18

回帖

145

积分

注册会员

积分
145
发表于 2024-7-12 16:44:39 | 显示全部楼层
STC-USB Link1D仿真器连接上STC8H8K64U的试验箱,一运行仿真默认就全速运行状态,退也退不了,不知道什么情况
截图202407121643336684.jpg

点评

我从来不用仿真,也没进行过相关测试,不知道怎么回事。 但无论是离线还是在线仿真,都无法进入 PendSV中断,任务是无法启动运行的。  详情 回复 发表于 2024-7-12 19:21
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-7-12 19:21:08 | 显示全部楼层
2245*** 发表于 2024-7-12 16:44
STC-USB Link1D仿真器连接上STC8H8K64U的试验箱,一运行仿真默认就全速运行状态,退也退不了,不知道什么情 ...

我从来不用仿真,也没进行过相关测试,不知道怎么回事。
但无论是离线还是在线仿真,都无法进入 PendSV中断,任务是无法启动运行的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2024-10-07 09:37:38

3

主题

18

回帖

145

积分

注册会员

积分
145
发表于 2024-7-13 10:23:07 | 显示全部楼层
Cos*** 发表于 2024-7-12 19:21
我从来不用仿真,也没进行过相关测试,不知道怎么回事。
但无论是离线还是在线仿真,都无法进入 PendSV中 ...

好的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-03-02 22:40:36

3

主题

13

回帖

167

积分

注册会员

积分
167
发表于 2024-7-22 22:31:20 | 显示全部楼层
迟老师,啥时候有空开个课,讲个项目,带我们进阶一下呗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-07-26 20:24:26

0

主题

1

回帖

10

积分

新手上路

积分
10
发表于 2024-7-26 20:18:03 | 显示全部楼层
请问你是怎么解决可重入栈XBP的?

点评

首先,用各任务的任务栈,做为各任务的可重入栈; 而后,各任务栈数据初始化时,“XBP”指向任务栈顶+1; 最后,任务切换时,保护现场/恢复现场,要保护/恢复 ?C_XBP。  详情 回复 发表于 2024-7-26 22:24
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:426
  • 最近打卡:2025-05-05 00:48:46
已绑定手机

19

主题

3191

回帖

4934

积分

论坛元老

积分
4934
发表于 2024-7-26 20:58:06 | 显示全部楼层
进来学习一下,RTOS是学习单片机的一部分。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-7-26 22:24:19 | 显示全部楼层
本帖最后由 CosyOS 于 2024-7-26 23:04 编辑
励磁*** 发表于 2024-7-26 20:18
请问你是怎么解决可重入栈XBP的?

一、首先,用各任务的任务栈,做为各任务的可重入栈

二、而后,各任务栈数据初始化时,“XBP”指向 (任务栈顶+1);

#if MCUCFG_XBPSTACK == __ENABLED__
#define mXBP_INIT \
        *(s_u16_t *)(node_news->bsp + 15 + MCUCFG_USERREGSIZE) \  // 这里是任务栈中,XBP对应的两个字节
        = node_news->bsp + node_news->stacksize  // bsp为任务栈起始指针,加上任务栈size正好为 任务栈顶+1
#else
#define mXBP_INIT
#endif

#define mTaskStack_INIT \
do{ \
        node_news->stacklen = ( \
                (MCUCFG_TASK_REGBANK == MCUCFG_SYSINT_REGBANK ? 15 : 7) + \
                (MCUCFG_USERREGCONFIG == 1 ? MCUCFG_USERREGSIZE : 0) \
        ); \  // 初始化 stacklen:任务栈的初始长度
        *(s_u16_t *)node_news->bsp = ( \
                ((s_u16_t)s_task_starter->entry << 8) | \
                ((s_u16_t)s_task_starter->entry >> 8) \
        ); \  // 初始化 任务函数入口
        *(s_u8_t *)(node_news->bsp + 7 - 1) = MCUCFG_TASK_REGBANK * 8; \  // 初始化 PSW
        mUserReg_INIT; \  // 用户自定义任务切换现场保护汇编语言保护方案,用户寄存器的初始化
        mXBP_INIT; \  // 初始化XBP
        mUserReg_CINIT; \  // 用户自定义任务切换现场保护C语言保护方案,用户寄存器的初始化
}while(false)

三、最后,任务切换时,保护/恢复现场,要保护/恢复 ?C_XBP
其中恢复 ?C_XBP 时,必须关闭 总中断EA。


IF MCUCFG_XBPSTACK == __ENABLED__                                ; 保护 ?C_XBP
                                MOV          A, ?C_XBP                            ; 先保存XBP高字节
                                MOVX        @DPTR, A
                                INC           DPTR
                                MOV          A, ?C_XBP+1                        ; 再保存XBP低字节
                                MOVX        @DPTR, A
ENDIF

IF MCUCFG_XBPSTACK == __ENABLED__                                ; 恢复 ?C_XBP
                                MOVX        A, @DPTR
                                MOV          R0, A                                   ; XBP高字节缓存至R0
                                INC           DPTR
                                MOVX        A, @DPTR                            ; XBP低字节缓存至A
                                JBC           EA, __EA                              ; 如果总中断EA开着呢,就跳转至__EA并关中断,而后再恢复,最后开中断;否则说明EA已经关了,继续往下直接恢复
                                MOV         ?C_XBP, R0                           ; 恢复 高字节
                                MOV         ?C_XBP+1, A                        ; 恢复 低字节
                                SJMP        RETURN
__EA:                        MOV         ?C_XBP, R0
                                MOV         ?C_XBP+1, A
                                SETB        EA
ENDIF

以上描述为基本原理,详情请自行分析源码。。。


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-5 15:02 , Processed in 0.186166 second(s), 124 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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