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
以上描述为基本原理,详情请自行分析源码。。。