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

请问STC, 这官方示范程序, 你们测试过吗???

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 2023-9-3 16:50:10 | 显示全部楼层
熊*** 发表于 2023-9-3 08:02
正向移动和 反向移动是判断用户的代码
下面的例子能说明。
  char xdata buf1 [] = "123456789";

Keil的BUG, 是反向传送时, 有一个移动组合, s1指针高位地址未保护, 函数返回时,指针指向错误的数据。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 2023-9-3 16:57:34 | 显示全部楼层
正向移动 12种组合, 反向移动 12种组合,仅一种反向移动组合,s1指针高位地址未保护, 函数返回时,指针指向错误的数据 。

因此, 没有用到这种组合, 是不可能发现错误的。

我也是在分析反汇编(memmove函数)时, 发现的 这个 BUG。

点评

今晚测试了一下,确实在数组大,拷贝距离远的时候就出错了。没有保护好返回的R4内容。R4还是原来的内容。 [attachimg]19922[/attachimg] 还是得改成双DPTR简单,速度杠杠的。  详情 回复 发表于 2023-9-3 22:02
回复

使用道具 举报 送花

11

主题

340

回帖

939

积分

荣誉版主

积分
939
发表于 2023-9-3 22:02:11 | 显示全部楼层
LAO*** 发表于 2023-9-3 16:57
正向移动 12种组合, 反向移动 12种组合,仅一种反向移动组合,s1指针高位地址未保护, 函数返回时,指针指 ...

今晚测试了一下,确实在数组大,拷贝距离远的时候就出错了。没有保护好返回的R4内容。R2还是原来的内容。
截图202309032201379913.jpg


还是得改成双DPTR简单,速度杠杠的。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 2023-9-6 20:39:11 | 显示全部楼层
熊*** 发表于 2023-9-3 22:02
今晚测试了一下,确实在数组大,拷贝距离远的时候就出错了。没有保护好返回的R4内容。R2还是原来的内容。
...

改双dptr要关中断, stc的双dptr设计的不合理, 和Keil 的兼容性差。

点评

STC设计的双DPTR比Atmel设计的速度快,好用,更合理。 只能说keil没有给STC单独适配罢了。当然我们自己修改对应使用双DPTR的string函数。 目前已经移植了3个函数,memcpy,memmove,strcpy使用双DPTR  详情 回复 发表于 2023-9-7 08:31
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 2023-9-6 20:42:57 | 显示全部楼层
修正后的 memmove 程序, 在前 3楼有下载连接, 可直接挂在 c51项目中编译, 以替代有错误的 memmove 库程序.

这样, 拷贝大数组,距离远的时候就不会出错了。

点评

改双DPTR只需要在中断里面对DPS,DPL1,DPH1 出入堆栈就行。 我移植的uCOS2准备更新,加入支持双DPTR。  详情 回复 发表于 2023-9-7 08:26
回复

使用道具 举报 送花

11

主题

340

回帖

939

积分

荣誉版主

积分
939
发表于 2023-9-7 08:23:18 | 显示全部楼层
我也重新整理了一份,改用双DPTR,速度快多了。
测试DPTR1仿真时可以读取code的。
截图202309070822514897.jpg

截图202309070823007430.jpg

回复

使用道具 举报 送花

11

主题

340

回帖

939

积分

荣誉版主

积分
939
发表于 2023-9-7 08:26:12 | 显示全部楼层
本帖最后由 熊仔 于 2023-9-7 08:31 编辑
LAO*** 发表于 2023-9-6 20:42
修正后的 memmove 程序, 在前 3楼有下载连接, 可直接挂在 c51项目中编译, 以替代有错误的 memmove 库程序. ...

改双DPTR只需要在中断里面对DPS,DPL1,DPH1 出入堆栈就行。
我移植的uCOS2准备更新,加入支持双DPTR。
回复

使用道具 举报 送花

11

主题

340

回帖

939

积分

荣誉版主

积分
939
发表于 2023-9-7 08:31:33 | 显示全部楼层
LAO*** 发表于 2023-9-6 20:39
改双dptr要关中断, stc的双dptr设计的不合理, 和Keil 的兼容性差。

STC设计的双DPTR比Atmel设计的速度快,好用,更合理。
只能说keil没有给STC单独适配罢了。当然我们自己修改对应使用双DPTR的string函数。
目前已经移植了3个函数,memcpy,memmove,strcpy使用双DPTR
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 2023-9-7 17:05:39 | 显示全部楼层
你自用1没问题, 如要普及 移植的uCOS2 系统, 就有问题, STC51有几十个中断, 每个中断都要改写增加保护,老司机还好点,

那么多菜菜的学生党,只会照搬照抄混毕业,你让他们修改对应的中断程序???

所以普及性不高,以前STC搞的 STC11/10 系列就挺不错的, 双DPTR 完全兼容 KEIL, 非常好用。

点评

ucos中断入口统一管理的。这个很好处理,加上DPS,DPL1,DPH1出入堆栈。  详情 回复 发表于 2023-9-8 17:15
回复

使用道具 举报 送花

11

主题

340

回帖

939

积分

荣誉版主

积分
939
发表于 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中

截图202309081706454412.jpg


附件能运行的代码,增加了P2口读取数据验证。

TEST.zip

6.65 KB, 下载次数: 129

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-25 10:32 , Processed in 0.131854 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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