CosyOS
发表于 2024-6-30 19:37:55
本帖最后由 CosyOS 于 2024-6-30 19:41 编辑
tzz1983 发表于 2024-6-30 11:57
@CosyOS有个问题需要您帮忙, 请教一下,251内核, 用RTOS时,使用XDATA 有什么特别要注意的地方吗?
我 ...
还有件事要通知你,当前我的测试结论:
任务切换现场保护时,如果入栈DR56,会导致 访问 xdata 出现异常,
即使内存模型为 XSmall 时,也是如此。
OS_PendSV_Handler{Prefix}:
PUSH DR28
PUSH DR24
PUSH DR20
PUSH DR16
PUSH DR12
PUSH DR8
PUSH DR4
PUSH DR0
PUSH DR56
PUSH PSW1
PUSH PSW
POP PSW
POP PSW1
POP DR56
POP DR0
POP DR4
POP DR8
POP DR12
POP DR16
POP DR20
POP DR24
POP DR28
RETI
如上,访问xdata就出问题了。
如果把:
PUSH DR56
POP DR56
改为:
PUSH DPH
PUSH DPL
POP DPL
POP DPH
就一切正常。
如果再增加入栈DPXL:
PUSH DPXL
PUSH DPH
PUSH DPL
POP DPL
POP DPH
POP DPXL
访问xdata仍然出问题。
如果调整为如下:
OS_PendSV_Handler{Prefix}:
PUSH DR28
PUSH DR24
PUSH DR20
PUSH DR16
PUSH DR12
PUSH DR8
PUSH DR4
PUSH DR0
PUSH DR56
PUSH PSW1
PUSH PSW
POP PSW
POP PSW1
POP DR0
MOV DPXL, R1
MOV DPH, R2
MOV DPL, R3
POP DR0
POP DR4
POP DR8
POP DR12
POP DR16
POP DR20
POP DR24
POP DR28
RETI
如果不写:MOV DPXL, R1
访问 xdata 就正常,否则,访问 xdata 异常。
结论就是这个 DPXL 只能读,不能写,一写就出问题,
所以,POP DR56、POP DPXL 等,都会导致访问xdata出问题。
而且我还做了判断,DPXL入栈前为1,出栈后仍为1,都没有问题的,就是不行。
究其根本原因,迄今为止未能找到。
CosyOS
发表于 2024-6-30 19:45:16
tzz1983 发表于 2024-6-30 18:52
话说,你说的所有选项我都尝试了一遍, 无果!
真的是很无耐, 控制块放在EDATA, 一切正常.
你再调整一下 PUSH DR56 / POP DR56,试一试吧
CosyOS
发表于 2024-6-30 20:06:27
本帖最后由 CosyOS 于 2024-6-30 20:20 编辑
tzz1983 发表于 2024-6-30 18:52
话说,你说的所有选项我都尝试了一遍, 无果!
真的是很无耐, 控制块放在EDATA, 一切正常.
我又做了一些有关 DPXL 的测试,这个 DPXL 也不是不能写,
每次任务切换时,都做下面的事,
1:
MOV DPXL, #1
2:
MOV R0, #1
MOV DPXL, R0
访问xdata都没问题的。
如果把入栈的 DPXL 出栈到 DPXL,或出栈到其它寄存器再MOV到DPXL,就不行。
但我也校验了,出栈到 DPXL 后,再读出来确实还是1啊,为什么就不行呢???
tzz1983
发表于 2024-6-30 20:08:47
本帖最后由 tzz1983 于 2024-6-30 20:11 编辑
CosyOS 发表于 2024-6-30 19:37
还有件事要通知你,当前我的测试结论:
任务切换现场保护时,如果入栈DR56,会导致 访问 xdata 出现异常, ...
嗯 , 你说的很有道理!
你这么一说, 我就想起来一件事情, 前两天看反汇编的时候, 就发现了一个疑问, 当时并没有引起注意.
如下图:
编译器是写了DPTR就直接用DR56访问, 确实没有写DPXL.
当时以为DR56是专门用作XDATA间址的, 写或不写DPXL都无所谓. 现在看来是编译器故意不写的吧!
{:dizzy:}看来硬件冷知识还是欠缺. 等会我再去试一下, 改改这个地方看看能不能一针见血.
CosyOS
发表于 2024-6-30 20:09:24
tzz1983 发表于 2024-6-30 18:52
话说,你说的所有选项我都尝试了一遍, 无果!
真的是很无耐, 控制块放在EDATA, 一切正常.
当前的有效解决方案就是,不要 PUSH/POP DR56,改为 PUSH/POP DPH、DPL,
这样,访问 xdata 就会一切正常。
tzz1983
发表于 2024-6-30 20:13:47
CosyOS 发表于 2024-6-30 20:09
当前的有效解决方案就是,不要 PUSH/POP DR56,改为 PUSH/POP DPH、DPL,
这样,访问 xdata 就会一切正常 ...
非常感谢, 等会我去尝试
CosyOS
发表于 2024-6-30 20:29:42
tzz1983 发表于 2024-6-30 20:13
非常感谢, 等会我去尝试
虽然原因未知,按我说的方法做,一定会正常的。
当前 CosyOS 最新版,已经进行了全方位的测试,包括内存方案1、2、3、4、5。
方案4、5都是大模型,而且 CosyOS 的任务管理器 的串口发送缓存,固定使用 xdata,
前些天移植的时候,一旦 PUSH DR56,就会导致任务管理器 不能运行,而且方案4、5,任务也不能运行。
最后调整为 PUSH DPH、DPL,才解决了相关问题,xdata的访问才正常。
CosyOS
发表于 2024-6-30 20:45:33
tzz1983 发表于 2024-6-30 20:13
非常感谢, 等会我去尝试
而且,我们看一下 C251 反汇编,Keil 从来都不会 PUSH DR56,从来都是 PUSH DPH、DPL。
最早我还在想,Keil 怎么这么蠢呢?直接 PUSH DR56 不就完了吗?
现在看来,其中必有深意。。。
CosyOS
发表于 2024-7-1 13:32:24
本帖最后由 CosyOS 于 2024-10-26 03:08 编辑
CosyOS-II 最新版 V3.0.0 补充说明
V3.0.0 较以前版本,优化调整的地方还是比较多的,
不仅仅是 任务切换保护/恢复现场、搬栈、中断挂起服务的装载 等,用纯汇编来实现。
1、增加了新的 指针域定义,_STATIC_MEM_
以前版本,只要是 内核对象,数据结构中的相关指针,指针域一律用 _OBJ_MEM_,
251内存方案3、4的时候,内核对象可能为静态或动态,所以,_OBJ_MEM_ 为空,
相关指针为 far* 或 huge*,4字节,访问慢。
由于 CosyOS 大部分内核对象只有静态创建,任务是有静态创建和动态创建,所以,
增加了 _STATIC_MEM_ 后,数据结构中,大部分内核对象的指针,指针域固定为
_STATIC_MEM_,只有可静态可动态的,如任务,指针域才用 _OBJ_MEM_,
这使得,新版本中,251下,无论哪种内存方案,相关指针都是 2bytes,
内存占用更低,访问速度更快。
2、51,增加了 ?C_XBP,的任务切换现场保护,可在mcu配置文件中配置,
默认为 不保护。方便用户在C51下,采用 reentrant 定义 可重入函数。
3、51、251,用户自定义任务切换现场保护,同时支持 C语言 和 汇编语言 两种保护
方法,用户可自由选择,具体可查看mcu配置文件 .h、.inc。
4、性能提升
(1)51搬栈速度不会有提升,相反还会稍有下降较以前版本。
(2)251搬栈速度会有质的提升
据热心网友评测,251搬栈速度较以前版本,相同内存配置方案,提升了30%~40%;
新版内存配置方案五(任务栈在xdata)的搬栈速度,与以前版本内存配置方案二(任务栈在edata)的搬栈速度相当。
这为 STC32G 小edata内存 的应用(内存配置方案五),提供了强有力的保障。
stc-xuewei
发表于 2024-7-1 21:03:07
恭喜,恭喜,又出新版本了。