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口读取数据验证。

页: 1 [2] 3
查看完整版本: 请问STC, 这官方示范程序, 你们测试过吗???