搜索
bottom↓
回复: 10

常量数组查表,数据放在ram内没有问题,放到rom内总返回0

[复制链接]

出0入27汤圆

发表于 2022-12-28 12:28:30 | 显示全部楼层 |阅读模式
一个c51的案子,移植到新厂家新型号,之前放code区的数组查表没有问题,换到新ic上面(keil工程也换了),code区内数据查表回来总是0,把数组放ram内是可以的。
不熟51的汇编,请大佬帮忙看一下。

数据放在ram内,查表可以返回正确数值:
  1. uint8_t  xdata  gu8a_7SegLed[10]                  = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};                /* 数码管字符(置1点亮) */
复制代码

  1.    592:                 gu8_LedData[3] |= gu8a_7SegLed[((gu16_DmxChannel+1) / 1 % 10)];
  2. C:0x0146    90000F   MOV      DPTR,#0x000F
  3. C:0x0149    E0       MOVX     A,@DPTR
  4. C:0x014A    FB       MOV      R3,A
  5. C:0x014B    900011   MOV      DPTR,#0x0011
  6. C:0x014E    E0       MOVX     A,@DPTR
  7. C:0x014F    2401     ADD      A,#0x01
  8. C:0x0151    FF       MOV      R7,A
  9. C:0x0152    900010   MOV      DPTR,#gu16_DmxChannel(0x0010)
  10. C:0x0155    E0       MOVX     A,@DPTR
  11. C:0x0156    3400     ADDC     A,#0x00
  12. C:0x0158    FE       MOV      R6,A
  13. C:0x0159    7C00     MOV      R4,#0x00
  14. C:0x015B    7D0A     MOV      R5,#0x0A
  15. C:0x015D    120E18   LCALL    C?UIDIV(C:0E18)
  16. C:0x0160    742A     MOV      A,#gu8a_7SegLed(0x2A)
  17. C:0x0162    2D       ADD      A,R5
  18. C:0x0163    F582     MOV      DPTR(0x82),A
  19. C:0x0165    7400     MOV      A,#0x00
  20. C:0x0167    3C       ADDC     A,R4
  21. C:0x0168    F583     MOV      DPH(0x83),A
  22. C:0x016A    E0       MOVX     A,@DPTR
  23. C:0x016B    FF       MOV      R7,A
  24. C:0x016C    EB       MOV      A,R3
  25. C:0x016D    4F       ORL      A,R7
  26. C:0x016E    90000F   MOV      DPTR,#0x000F
  27. C:0x0171    F0       MOVX     @DPTR,A
复制代码


数据放ROM内:
  1. uint8_t  code  gu8a_7SegLed[10]                  = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};                /* 数码管字符(置1点亮) */
复制代码

  1.    592:                 gu8_LedData[3] |= gu8a_7SegLed[((gu16_DmxChannel+1) / 1 % 10)];
  2. C:0x014A    900038   MOV      DPTR,#0x0038
  3. C:0x014D    E0       MOVX     A,@DPTR
  4. C:0x014E    FB       MOV      R3,A
  5. C:0x014F    90003A   MOV      DPTR,#0x003A
  6. C:0x0152    E0       MOVX     A,@DPTR
  7. C:0x0153    2401     ADD      A,#0x01
  8. C:0x0155    FF       MOV      R7,A
  9. C:0x0156    900039   MOV      DPTR,#gu16_DmxChannel(0x0039)
  10. C:0x0159    E0       MOVX     A,@DPTR
  11. C:0x015A    3400     ADDC     A,#0x00
  12. C:0x015C    FE       MOV      R6,A
  13. C:0x015D    7C00     MOV      R4,#0x00
  14. C:0x015F    7D0A     MOV      R5,#0x0A
  15. C:0x0161    120DAB   LCALL    C?UIDIV(C:0DAB)
  16. C:0x0164    7461     MOV      A,#0x61
  17. C:0x0166    2D       ADD      A,R5
  18. C:0x0167    F582     MOV      DPTR(0x82),A
  19. C:0x0169    7412     MOV      A,#0x12
  20. C:0x016B    3C       ADDC     A,R4
  21. C:0x016C    F583     MOV      DPH(0x83),A
  22. C:0x016E    E4       CLR      A
  23. C:0x016F    93       MOVC     A,@A+DPTR
  24. C:0x0170    FF       MOV      R7,A
  25. C:0x0171    EB       MOV      A,R3
  26. C:0x0172    4F       ORL      A,R7
  27. C:0x0173    900038   MOV      DPTR,#0x0038
  28. C:0x0176    F0       MOVX     @DPTR,A
复制代码

出0入475汤圆

发表于 2022-12-28 12:46:41 来自手机 | 显示全部楼层
其它没看,你那个查表里面弄个除以1是起个啥用?
把我自学的所有功夫都用遍了硬是没理解到:(
难道不是浪费时间和空间吗?我只有这样认为了

出0入475汤圆

发表于 2022-12-28 12:56:17 来自手机 | 显示全部楼层
这种太简单的问题,你可以分步骤来找问题,首先你把索引值单独计算出来,然后再去索引表格,不要一大堆变量计算放里面当索引值。连你自己都不知道咋回事。
索引值单独计算出来后,看是不是0-9之间的数值,是的话肯定没有任何问题的,有问题就是比如开发工具哪里设置错了;不是的话就是尼自己计算索引值的地方错了,导致索引值溢出表格最大范围,否则不可能返回0,因为你表格里面压根没有0值

出0入984汤圆

发表于 2022-12-28 13:52:39 | 显示全部楼层
1a2b3c 发表于 2022-12-28 12:46
其它没看,你那个查表里面弄个除以1是起个啥用?
把我自学的所有功夫都用遍了硬是没理解到:(
难道不是浪 ...
(引用自2楼)

很明显编译器把/1优化掉了

出0入984汤圆

发表于 2022-12-28 13:55:53 | 显示全部楼层
指令粗略看没看出什么

我倒是有些怀疑是下载问题,51空闲rom区读出的是00

比如gu8a_7SegLed不在code区的0x1261

出0入27汤圆

 楼主| 发表于 2022-12-28 13:58:22 | 显示全部楼层
1a2b3c 发表于 2022-12-28 12:46
其它没看,你那个查表里面弄个除以1是起个啥用?
把我自学的所有功夫都用遍了硬是没理解到:(
难道不是浪 ...
(引用自2楼)

没作用,只是为了风格统一。前面还有拆分变量千位、百位、十位的代码。

出0入27汤圆

 楼主| 发表于 2022-12-28 14:01:10 | 显示全部楼层
Himem 发表于 2022-12-28 13:55
指令粗略看没看出什么

我倒是有些怀疑是下载问题,51空闲rom区读出的是00
(引用自5楼)

我怀疑是项目工程设置的问题,但是实在找不到关键词来搜索。
同样的代码在另外一家51芯片的里面是跑是正常的。

出0入475汤圆

发表于 2022-12-28 14:04:02 | 显示全部楼层
neutronlmk 发表于 2022-12-28 14:01
我怀疑是项目工程设置的问题,但是实在找不到关键词来搜索。
同样的代码在另外一家51芯片的里面是跑是正 ...
(引用自7楼)

叫你分步来调试下就清楚了

把里面索引值单独变量传递一下,就行了,单步调试跟过去看code区的表格的内容是啥,清清楚楚的,

出100入143汤圆

发表于 2022-12-28 14:06:33 | 显示全部楼层
被优化掉了,加上volatile就行

出0入27汤圆

 楼主| 发表于 2022-12-28 15:17:38 | 显示全部楼层
本帖最后由 neutronlmk 于 2022-12-28 15:25 编辑

找原厂支援解决问题,这个程序还是用了flash做掉电记忆之用,程序开头调用了函数 Flash_ReadArr(0x0000,6,gu8a_Eeprom);      来读取记忆;
官方的demo程序在读取数据之后没有把指针复位,丢。
我直接改了官方demo测试掉电记忆已经OK,没审清楚里面程序。

出0入8汤圆

发表于 2022-12-28 16:35:06 | 显示全部楼层
试试把flash改成small模式
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 09:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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