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

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

 火... [复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-04 20:54:20

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-6-30 19:37:55 | 显示全部楼层
本帖最后由 CosyOS 于 2024-6-30 19:41 编辑
tzz1*** 发表于 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,都没有问题的,就是不行。

究其根本原因,迄今为止未能找到。


点评

嗯 , 你说的很有道理! 你这么一说, 我就想起来一件事情, 前两天看反汇编的时候, 就发现了一个疑问, 当时并没有引起注意. 如下图: [attachimg]49275[/attachimg] 编译器是写了DPTR就直接用DR56访问, 确实没有写D  详情 回复 发表于 2024-6-30 20:08
回复 支持 反对

使用道具 举报 送花

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

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-6-30 19:45:16 | 显示全部楼层
tzz1*** 发表于 2024-6-30 18:52
话说,  你说的所有选项我都尝试了一遍, 无果!  

真的是很无耐, 控制块放在EDATA, 一切正常.  

你再调整一下 PUSH DR56 / POP DR56,试一试吧
回复 支持 反对

使用道具 举报 送花

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

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-6-30 20:06:27 | 显示全部楼层
本帖最后由 CosyOS 于 2024-6-30 20:20 编辑
tzz1*** 发表于 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啊,为什么就不行呢???

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2323

积分

荣誉版主

积分
2323
发表于 2024-6-30 20:08:47 | 显示全部楼层
本帖最后由 tzz1983 于 2024-6-30 20:11 编辑
Cos*** 发表于 2024-6-30 19:37
还有件事要通知你,当前我的测试结论:
任务切换现场保护时,如果入栈DR56,会导致 访问 xdata 出现异常, ...

嗯 , 你说的很有道理!

你这么一说, 我就想起来一件事情, 前两天看反汇编的时候, 就发现了一个疑问, 当时并没有引起注意.

如下图:
截图202406302000576007.jpg

编译器是写了DPTR就直接用DR56访问, 确实没有写DPXL.
当时以为DR56是专门用作XDATA间址的, 写或不写DPXL都无所谓. 现在看来是编译器故意不写的吧!

看来硬件冷知识还是欠缺. 等会我再去试一下, 改改这个地方看看能不能一针见血.

回复 支持 反对

使用道具 举报 送花

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

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-6-30 20:09:24 | 显示全部楼层
tzz1*** 发表于 2024-6-30 18:52
话说,  你说的所有选项我都尝试了一遍, 无果!  

真的是很无耐, 控制块放在EDATA, 一切正常.  

当前的有效解决方案就是,不要 PUSH/POP DR56,改为 PUSH/POP DPH、DPL,
这样,访问 xdata 就会一切正常。

点评

非常感谢, 等会我去尝试  详情 回复 发表于 2024-6-30 20:13
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2323

积分

荣誉版主

积分
2323
发表于 2024-6-30 20:13:47 | 显示全部楼层
Cos*** 发表于 2024-6-30 20:09
当前的有效解决方案就是,不要 PUSH/POP DR56,改为 PUSH/POP DPH、DPL,
这样,访问 xdata 就会一切正常 ...

非常感谢, 等会我去尝试

点评

我找到 PUSH DR56 导致 访问 xdata 异常的原因了! 不是 不能 PUSH DR56, 是因为各个任务在首次调度的时候,是直接恢复现场, 所以,各个任务栈数据的初始化 要正确,DPXL 对应的字节需要正确的初始化, 直接把 DPX  详情 回复 发表于 2024-7-2 23:14
而且,我们看一下 C251 反汇编,Keil 从来都不会 PUSH DR56,从来都是 PUSH DPH、DPL。 最早我还再想,Keil 怎么这么蠢呢?直接 PUSH DR56 不就完了吗? 现在看来,其中必有深意。。。  详情 回复 发表于 2024-6-30 20:45
虽然原因未知,按我说的方法做,一定会正常的。 当前 CosyOS 最新版,已经进行了全方位的测试,包括内存方案1、2、3、4、5。 方案4、5都是大模型,而且 CosyOS 的任务管理器 的串口发送缓存,固定使用 xdata, 前些  详情 回复 发表于 2024-6-30 20:29
回复 支持 反对

使用道具 举报 送花

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

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-6-30 20:29:42 | 显示全部楼层
tzz1*** 发表于 2024-6-30 20:13
非常感谢, 等会我去尝试

虽然原因未知,按我说的方法做,一定会正常的。
当前 CosyOS 最新版,已经进行了全方位的测试,包括内存方案1、2、3、4、5。
方案4、5都是大模型,而且 CosyOS 的任务管理器 的串口发送缓存,固定使用 xdata,
前些天移植的时候,一旦 PUSH DR56,就会导致任务管理器 不能运行,而且方案4、5,任务也不能运行。
最后调整为 PUSH DPH、DPL,才解决了相关问题,xdata的访问才正常。


回复 支持 反对

使用道具 举报 送花

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

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 2024-6-30 20:45:33 | 显示全部楼层
tzz1*** 发表于 2024-6-30 20:13
非常感谢, 等会我去尝试

而且,我们看一下 C251 反汇编,Keil 从来都不会 PUSH DR56,从来都是 PUSH DPH、DPL。
最早我还在想,Keil 怎么这么蠢呢?直接 PUSH DR56 不就完了吗?
现在看来,其中必有深意。。。
回复 支持 反对

使用道具 举报 送花

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

5

主题

1127

回帖

4275

积分

荣誉版主

积分
4275
发表于 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内存 的应用(内存配置方案五),提供了强有力的保障。





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:306
  • 最近打卡:2025-05-05 09:15:18

0

主题

24

回帖

411

积分

中级会员

积分
411
发表于 2024-7-1 21:03:07 | 显示全部楼层
恭喜,恭喜,又出新版本了。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-5 14:47 , Processed in 0.147295 second(s), 115 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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