ethantlh 发表于 2024-7-9 16:35:34

CosyOS 发表于 2024-7-9 15:52
你这个差的地方有很多:
1、V3.0.0 版本开始,增加了 Port 文件,你没有加入;
2、os_redef.h,原为 #incl ...

感谢!!!!!!!!!!!!

CosyOS 发表于 2024-7-10 13:11:11

本帖最后由 CosyOS 于 2024-7-10 13:17 编辑

tzz1983 发表于 2024-7-8 22:53
Keil C251 编译器, 也有 ?C_XBP, 不过我没有尝试过.难道你用251也搬栈?   
我觉得即便是只有 2K edata ...
C251,局部变量,
如果想放在 可重入栈 中,就不要指定 存储域,这样还有 寄存器优先分配;
如果想放在 特定的内存,就用 static,这样就由 存储域 或 内存 Model 决定,
不受 可重入函数 影响。但,该函数一旦重入,static 变量 就无法满足 重入条件了,

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

大锤子 发表于 2024-7-10 22:40:43

CosyOS 支持 SDCC吗?

22456890 发表于 2024-7-12 16:44:39

STC-USB Link1D仿真器连接上STC8H8K64U的试验箱,一运行仿真默认就全速运行状态,退也退不了,不知道什么情况


CosyOS 发表于 2024-7-12 19:21:08

22456890 发表于 2024-7-12 16:44
STC-USB Link1D仿真器连接上STC8H8K64U的试验箱,一运行仿真默认就全速运行状态,退也退不了,不知道什么情 ...

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

22456890 发表于 2024-7-13 10:23:07

CosyOS 发表于 2024-7-12 19:21
我从来不用仿真,也没进行过相关测试,不知道怎么回事。
但无论是离线还是在线仿真,都无法进入 PendSV中 ...

好的{:4_197:}

黄乃贝 发表于 2024-7-22 22:31:20

迟老师,啥时候有空开个课,讲个项目,带我们进阶一下呗{:4_168:}。

励磁器狂人 发表于 2024-7-26 20:18:03

请问你是怎么解决可重入栈XBP的?

soma 发表于 2024-7-26 20:58:06

进来学习一下,RTOS是学习单片机的一部分。

CosyOS 发表于 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

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


页: 74 75 76 77 78 79 80 81 82 83 [84] 85 86 87 88 89 90 91 92 93
查看完整版本: 全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板