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

恭喜,恭喜,又出新版本了。
页: 70 71 72 73 74 75 76 77 78 79 [80] 81 82 83 84 85 86 87 88 89
查看完整版本: 全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板