neutronlmk 发表于 2022-12-28 12:28:30

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

一个c51的案子,移植到新厂家新型号,之前放code区的数组查表没有问题,换到新ic上面(keil工程也换了),code区内数据查表回来总是0,把数组放ram内是可以的。
不熟51的汇编,请大佬帮忙看一下。

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

   592:               gu8_LedData |= gu8a_7SegLed[((gu16_DmxChannel+1) / 1 % 10)];
C:0x0146    90000F   MOV      DPTR,#0x000F
C:0x0149    E0       MOVX   A,@DPTR
C:0x014A    FB       MOV      R3,A
C:0x014B    900011   MOV      DPTR,#0x0011
C:0x014E    E0       MOVX   A,@DPTR
C:0x014F    2401   ADD      A,#0x01
C:0x0151    FF       MOV      R7,A
C:0x0152    900010   MOV      DPTR,#gu16_DmxChannel(0x0010)
C:0x0155    E0       MOVX   A,@DPTR
C:0x0156    3400   ADDC   A,#0x00
C:0x0158    FE       MOV      R6,A
C:0x0159    7C00   MOV      R4,#0x00
C:0x015B    7D0A   MOV      R5,#0x0A
C:0x015D    120E18   LCALL    C?UIDIV(C:0E18)
C:0x0160    742A   MOV      A,#gu8a_7SegLed(0x2A)
C:0x0162    2D       ADD      A,R5
C:0x0163    F582   MOV      DPTR(0x82),A
C:0x0165    7400   MOV      A,#0x00
C:0x0167    3C       ADDC   A,R4
C:0x0168    F583   MOV      DPH(0x83),A
C:0x016A    E0       MOVX   A,@DPTR
C:0x016B    FF       MOV      R7,A
C:0x016C    EB       MOV      A,R3
C:0x016D    4F       ORL      A,R7
C:0x016E    90000F   MOV      DPTR,#0x000F
C:0x0171    F0       MOVX   @DPTR,A

数据放ROM内:
uint8_tcodegu8a_7SegLed                  = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};                /* 数码管字符(置1点亮) */

   592:               gu8_LedData |= gu8a_7SegLed[((gu16_DmxChannel+1) / 1 % 10)];
C:0x014A    900038   MOV      DPTR,#0x0038
C:0x014D    E0       MOVX   A,@DPTR
C:0x014E    FB       MOV      R3,A
C:0x014F    90003A   MOV      DPTR,#0x003A
C:0x0152    E0       MOVX   A,@DPTR
C:0x0153    2401   ADD      A,#0x01
C:0x0155    FF       MOV      R7,A
C:0x0156    900039   MOV      DPTR,#gu16_DmxChannel(0x0039)
C:0x0159    E0       MOVX   A,@DPTR
C:0x015A    3400   ADDC   A,#0x00
C:0x015C    FE       MOV      R6,A
C:0x015D    7C00   MOV      R4,#0x00
C:0x015F    7D0A   MOV      R5,#0x0A
C:0x0161    120DAB   LCALL    C?UIDIV(C:0DAB)
C:0x0164    7461   MOV      A,#0x61
C:0x0166    2D       ADD      A,R5
C:0x0167    F582   MOV      DPTR(0x82),A
C:0x0169    7412   MOV      A,#0x12
C:0x016B    3C       ADDC   A,R4
C:0x016C    F583   MOV      DPH(0x83),A
C:0x016E    E4       CLR      A
C:0x016F    93       MOVC   A,@A+DPTR
C:0x0170    FF       MOV      R7,A
C:0x0171    EB       MOV      A,R3
C:0x0172    4F       ORL      A,R7
C:0x0173    900038   MOV      DPTR,#0x0038
C:0x0176    F0       MOVX   @DPTR,A

1a2b3c 发表于 2022-12-28 12:46:41

其它没看,你那个查表里面弄个除以1是起个啥用?
把我自学的所有功夫都用遍了硬是没理解到:(
难道不是浪费时间和空间吗?我只有这样认为了

1a2b3c 发表于 2022-12-28 12:56:17

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

Himem 发表于 2022-12-28 13:52:39

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

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

Himem 发表于 2022-12-28 13:55:53

指令粗略看没看出什么

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

比如gu8a_7SegLed不在code区的0x1261

neutronlmk 发表于 2022-12-28 13:58:22

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

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

neutronlmk 发表于 2022-12-28 14:01:10

Himem 发表于 2022-12-28 13:55
指令粗略看没看出什么

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

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

1a2b3c 发表于 2022-12-28 14:04:02

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

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

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

zzh90513 发表于 2022-12-28 14:06:33

被优化掉了,加上volatile就行

neutronlmk 发表于 2022-12-28 15:17:38

本帖最后由 neutronlmk 于 2022-12-28 15:25 编辑

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

lindabell 发表于 2022-12-28 16:35:06

试试把flash改成small模式
页: [1]
查看完整版本: 常量数组查表,数据放在ram内没有问题,放到rom内总返回0