LAOXU
发表于 2023-9-3 16:50:10
熊仔 发表于 2023-9-3 08:02
正向移动和 反向移动是判断用户的代码
下面的例子能说明。
char xdata buf1 [] = "123456789";
Keil的BUG, 是反向传送时, 有一个移动组合, s1指针高位地址未保护, 函数返回时,指针指向错误的数据。
LAOXU
发表于 2023-9-3 16:57:34
正向移动 12种组合, 反向移动 12种组合,仅一种反向移动组合,s1指针高位地址未保护, 函数返回时,指针指向错误的数据 。
因此, 没有用到这种组合, 是不可能发现错误的。
我也是在分析反汇编(memmove函数)时, 发现的 这个 BUG。
熊仔
发表于 2023-9-3 22:02:11
LAOXU 发表于 2023-9-3 16:57
正向移动 12种组合, 反向移动 12种组合,仅一种反向移动组合,s1指针高位地址未保护, 函数返回时,指针指 ...
今晚测试了一下,确实在数组大,拷贝距离远的时候就出错了。没有保护好返回的R4内容。R2还是原来的内容。
还是得改成双DPTR简单,速度杠杠的。
LAOXU
发表于 2023-9-6 20:39:11
熊仔 发表于 2023-9-3 22:02
今晚测试了一下,确实在数组大,拷贝距离远的时候就出错了。没有保护好返回的R4内容。R2还是原来的内容。
...
改双dptr要关中断, stc的双dptr设计的不合理, 和Keil 的兼容性差。
LAOXU
发表于 2023-9-6 20:42:57
修正后的 memmove 程序, 在前 3楼有下载连接, 可直接挂在 c51项目中编译, 以替代有错误的 memmove 库程序.
这样, 拷贝大数组,距离远的时候就不会出错了。
熊仔
发表于 2023-9-7 08:23:18
我也重新整理了一份,改用双DPTR,速度快多了。
测试DPTR1仿真时可以读取code的。
熊仔
发表于 2023-9-7 08:26:12
本帖最后由 熊仔 于 2023-9-7 08:31 编辑
LAOXU 发表于 2023-9-6 20:42
修正后的 memmove 程序, 在前 3楼有下载连接, 可直接挂在 c51项目中编译, 以替代有错误的 memmove 库程序. ...
改双DPTR只需要在中断里面对DPS,DPL1,DPH1 出入堆栈就行。
我移植的uCOS2准备更新,加入支持双DPTR。
熊仔
发表于 2023-9-7 08:31:33
LAOXU 发表于 2023-9-6 20:39
改双dptr要关中断, stc的双dptr设计的不合理, 和Keil 的兼容性差。
STC设计的双DPTR比Atmel设计的速度快,好用,更合理。
只能说keil没有给STC单独适配罢了。当然我们自己修改对应使用双DPTR的string函数。
目前已经移植了3个函数,memcpy,memmove,strcpy使用双DPTR
LAOXU
发表于 2023-9-7 17:05:39
你自用1没问题, 如要普及 移植的uCOS2 系统, 就有问题, STC51有几十个中断, 每个中断都要改写增加保护,老司机还好点,
那么多菜菜的学生党,只会照搬照抄混毕业,你让他们修改对应的中断程序???
所以普及性不高,以前STC搞的 STC11/10 系列就挺不错的, 双DPTR 完全兼容 KEIL, 非常好用。
熊仔
发表于 2023-9-8 17:09:11
例子修改下可以仿真
方案1:
MOV DPS,#00000000B ;选择DPTR0,默认就是DPTR0,可以屏蔽
MOV DPTR,#1000H ;将1000H写入DPTR0中
MOV DPS,#00000001B ;选择DPTR1
MOV DPTR,#0103H ;将0103H写入DPTR1中
方案2:
MOV DPTR,#1000H ;将1000H写入DPTR0中
MOV DPL1,#03H
MOV DPH1,#01H ;将0103H写入DPTR1中
官方例子方案烧录进板子去运行。结果对的。只是不能仿真,调试发现,执行MOV DPTR,#1000H 后,不会自动切换到DPTR1
; MOV DPS,#00100000B ;使能TSL,并选择DPTR0
; MOV DPTR,#1000H ;将1000H写入DPTR0中,执行完成后选择DPTR1为DPTR
; MOV DPTR,#0103H ;将0103H写入DPTR1中
附件能运行的代码,增加了P2口读取数据验证。