找回密码
 立即注册
查看: 6317|回复: 24

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

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

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2023-3-2 20:08:27 | 显示全部楼层 |阅读模式
本帖最后由 LAOXU 于 2023-3-3 13:03 编辑

从STC-ISP中下载的示范程序, STC8H系列-增强型双数据指针示例代码2-ASM

直接下载编译, 测试芯片为 STC8H8K64U

TEST.rar (14.19 KB, 下载次数: 202)


测试结果显示, 根本无法从ROM中拷贝数据到XRAM中!


11111.jpg

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:139
  • 最近打卡:2024-05-24 15:33:43

13

主题

52

回帖

1428

积分

金牌会员

积分
1428
发表于 2023-3-3 09:47:29 | 显示全部楼层
“测试结果显示”--照你的截图,你是想把所谓结果从KEIL界面(软件仿真)看到。但是KEIL并不认识STC大量的新外设。DPTR0、DPTR1这两个指针共用同一个寄存器地址,通过DPS切换和设置是否自动递增递减等功能。你就会发现你认为的结果跟KEIL得出的完全不同。这些都应该在实物上运行和回显,比如使用硬件仿真或者串口回发数据。
回复 支持 1 反对 0

使用道具 举报 送花

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

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2023-3-3 13:05:30 | 显示全部楼层
飞*** 发表于 2023-3-3 09:47
“测试结果显示”--照你的截图,你是想把所谓结果从KEIL界面(软件仿真)看到。但是KEIL并不认识STC大量 ...

谢谢飞哥回复.

说明一下,  DPTR0、DPTR1这两个指针不是共用同一个寄存器地址,详见STC相关手册.

我是通过全速运行的, DPS切换中未设置任何断点及单步运行(上次测试就发现, STC仿真不支持双数据指针), 详见:

笑死, STC8H的双DPTR仿真问题折腾三天,绝望的发帖前30秒解决...
https://www.stcaimcu.com/forum.p ... id=1122&fromuid=559
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)


另外, 我是通过 STC8H实物板子来仿真的, 换过好几块板子, 结果一样, 无法从ROM中, 将数据拷贝到XRAM中.

官方的示范程序, STC8H系列-增强型双数据指针示例代码2-ASM

运行后, 应该将 CODE中内容拷贝到 XRAM中才是, 实际运行结果是, 拷贝全FF 到 XRAM中.


未命名.JPG

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

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2023-3-5 06:32:31 | 显示全部楼层
在学习改写 Keil 字符串操作函数库(原型在 STRING.H 中)过程中, 发现原库 memmove 程序, 有一个 bug, 在将 code (或 xdata) 中内容 拷贝到 xdata中, 正向移动没问题, 反向移动时, 没有保护 指针返回的高位地址, 引起返回指针错误.

另外, 在将 code 中内容 拷贝到 xdata中, 程序中对移动地址作了判断, 决定采用正向移动还是反向移动, Keil 这段程序是多余的, 完全没必要, 因为51的CODE 和 XDATA 地址空间, 永远不会重叠, 这判断及反向移动, 我给优化了, 以精简代码提升执行速度.  


  1. MOVE_CODE_XDATA:
  2. /*                      SETB     C                        // Keil 这段程序是多余的, 因为C51的CODE和XDATA地址空间, 永远不会重叠
  3.                       MOV      A,R1
  4.                      SUBB     A,R0
  5.                       MOV      A,R2
  6.                       SUBB     A,R4
  7.                     JNC      MOVE_013  
  8.                       MOV      A,R1
  9.                      ADD      A,R7
  10.                      MOV      DPL,A
  11.                      MOV      A,R2
  12.                      ADDC     A,R3
  13.                      MOV      DPH,A
  14.                       MOV      A,R0
  15.                 ADD      A,R7
  16.                       MOV      R0,A
  17.                       MOV      A,R4
  18.                       ADDC     A,R3
  19.                       XCH      A,R4                        // Keil的BUG, 反向传送时, s1指针高位地址未保护, 现已修正
  20.                       MOV      R2,A                        // R4 -->R2
  21. MOVE_010:        INC      DPL
  22.                      DJNZ     DPL,MOVE_011
  23.                      DEC      DPH
  24. MOVE_011:        DEC      DPL
  25.                       CLR      A
  26.                 MOVC     A,@A+DPTR
  27.                       XCH      A,R0
  28.                      XCH      A,DPL
  29.                       XCH      A,R0
  30.                       XCH      A,R4
  31.                      XCH      A,DPH
  32.                       XCH      A,R4
  33.                      INC      DPL
  34.                      DJNZ     DPL,MOVE_012
  35.                     DEC      DPH
  36. MOVE_012:        DEC      DPL
  37.                       MOVX     @DPTR,A
  38.                       XCH      A,R0
  39.                      XCH      A,DPL
  40.                       XCH      A,R0
  41.                       XCH      A,R4
  42.                      XCH      A,DPH
  43.                       XCH      A,R4
  44.                      DJNZ     R7,MOVE_010
  45.                      DJNZ     R6,MOVE_010
  46.                      SJMP     MOVE_END3                    */
  47. MOVE_013:        MOV      DPL,R1
  48.                      MOV      DPH,R2
  49.                       MOV      A,R4
  50.                       MOV      R2,A
  51. MOVE_014:          CLR      A
  52.                      MOVC     A,@A+DPTR
  53.                       ........
复制代码



下面为修正后的 memmove 程序, 可挂在 c51项目中编译, 以替代有错误的 memmove 库程序.


MEMMOVE.rar (1.5 KB, 下载次数: 185)

点评

正向移动和 方向移动是判断用户的代码 下面的例子能说明。 char xdata buf1 [] = "123456789"; memmove (buf1,&buf1[1], 5);//向左 正向移动 memmove (&buf1[2],buf1, 5);//向右 反向移动 memmove 函数主要是  详情 回复 发表于 2023-9-3 08:02
  • 打卡等级:以坛为家II
  • 打卡总天数:515
  • 最近打卡:2025-05-03 05:51:43

24

主题

515

回帖

994

积分

荣誉版主

积分
994
发表于 2023-3-8 20:12:15 | 显示全部楼层
上面的代码,应该是KEIL C51的通病,对指针的支持很差。一定要使用基于存储器的指针,才能得到较为精炼的代码。
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2023-3-10 09:50:05 | 显示全部楼层
  经过多次更改程序(使用 DPTR0 和 DPTR1 的不同排列组合 及 前后次序) 测试, 得出以下结论.

1, STC的双 DPTR指针, 支持 XRAM 读入/写入, 完全正确, 工作正常.

2, STC的双 DPTR指针, 第一指针 DPTR0 支持 CODE 读入, 完全正确, 工作正常.
    第二指针 DPTR1 完全不支持 CODE 读入, 一执行就玩蛋, 用 STC8H USB口仿真的直接死机(或数十秒才能退出),
    用 STC8H 232口仿真的能退出, 但执行结果错误.

3, 最终结论是 STC的双 DPTR指针, 第二指针 DPTR1 完全不支持 CODE,

4, STC8H USB口仿真, 性能比 用 232口仿真的 差很多, 直观上看, 下载程序, 执行单步等, 用USB口仿真 比 用 232口 速度慢 2-3倍(估算),

   执行到非法操作(比如前面提到的, 用 DPTR1读 ROM) , 可能死机退不出, 但用 232口仿真的, 能够正常退出.
  • 打卡等级:以坛为家II
  • 打卡总天数:515
  • 最近打卡:2025-05-03 05:51:43

24

主题

515

回帖

994

积分

荣誉版主

积分
994
发表于 2023-3-10 10:17:17 | 显示全部楼层
参考王珢的帖子,做WAV播放器,DPTR0 写到XRAM , DPTR1 从XRAM中读。工作正常。
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2023-3-10 14:03:00 | 显示全部楼层
社区*** 发表于 2023-3-10 10:17
参考王珢的帖子,做WAV播放器,DPTR0 写到XRAM , DPTR1 从XRAM中读。工作正常。

DPTR0 / DPTR1 读写 XRAM 。确实没问题, 工作正常。

但是,  一但打开双模式, 那怕最简单的自动切换模式, 哪怕用 DPTR0 读 CODE,  DPTR1 写 XRAM 。就出错.

唯一正确的, 是全程关闭 双 DPTR模式, 只用最原始的  DPTR0 读 CODE, 结果才是正确的!!!

点评

code到xdata双模式是没问题啊,我都写出来了。拷贝速度是原来的2倍多。  发表于 2023-9-5 22:38
回复 支持 0 反对 1

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2023-3-13 11:52:33 | 显示全部楼层

STC8H8K64U的双数据指针用汇编语言操作,可以将功能全部发挥出来
===C语言暂时KEIL C51支持不了,就不要管了,
===STC8H同频的速度是普通8051的13.2倍以上,还有DMA、MDU16来减轻CPU压力,估计快20倍以上
===主频能到45MHz, 不是传统的12MHz/24MHz

一,STC8H8K64U不用仿真功能,直接裸机运行时
1, 对 XRAM 读出/写入, STC8H8K64U的 双DPTR指针[DPTR0,DPTR1], 完全正确, 工作正常.
2, 对程序区的 CODE 读出, STC8H8K64U的 双DPTR指针[DPTR0,DPTR1], 完全正确, 工作正常.

二,STC8H8K64U用仿真功能时
1, 对 XRAM 读出/写入, STC8H8K64U的 双DPTR指针[DPTR0,DPTR1], 完全正确, 工作正常.

2, 对程序区的 CODE 读出, STC8H8K64U的双 DPTR指针[DPTR0,DPTR1], 访问code程序区
===第一指针 DPTR0 支持对 CODE 读出, 完全正确, 工作正常.
===第二指针 DPTR1 不支持对 CODE 读出,仿真系统没考量到这,请仿真时注意,后续会改进
回复 支持 2 反对 0

使用道具 举报 送花

11

主题

340

回帖

929

积分

荣誉版主

积分
929
发表于 2023-9-3 08:02:52 | 显示全部楼层
本帖最后由 熊仔 于 2023-9-3 08:51 编辑
LAO*** 发表于 2023-3-5 06:32
在学习改写 Keil 字符串操作函数库(原型在 STRING.H 中)过程中, 发现原库 memmove 程序, 有一个 bug, 在将  ...

正向移动和 反向移动是判断用户的代码
下面的例子能说明。
  char xdata buf1 [] = "123456789";

memmove  (buf1,&buf1[1], 5);//向左 正向移动
memmove  (&buf1[2],buf1, 5);//向右 反向移动

memmove  函数主要是考虑是否有覆盖区的移动,才有正向和反向移动算法
如果没有不考虑覆盖,直接用memcpy就行,正向移动算法。



反向移动测试返回指针对的。buf1开始分配地址是0x1234。移动后返回地址0x1236


截图202309030851317800.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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