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

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

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

54

主题

1327

回帖

5395

积分

荣誉版主

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

主题

1327

回帖

5395

积分

荣誉版主

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

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

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

点评

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

使用道具 举报 送花

11

主题

340

回帖

929

积分

荣誉版主

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

主题

1327

回帖

5395

积分

荣誉版主

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

主题

1327

回帖

5395

积分

荣誉版主

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

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

点评

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

使用道具 举报 送花

11

主题

340

回帖

929

积分

荣誉版主

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

截图202309070823007430.jpg

回复 支持 反对

使用道具 举报 送花

11

主题

340

回帖

929

积分

荣誉版主

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

回帖

929

积分

荣誉版主

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

主题

1327

回帖

5395

积分

荣誉版主

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

回帖

929

积分

荣誉版主

积分
929
发表于 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, 下载次数: 107

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 17:17 , Processed in 0.142395 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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