常量数组查表,数据放在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
其它没看,你那个查表里面弄个除以1是起个啥用?
把我自学的所有功夫都用遍了硬是没理解到:(
难道不是浪费时间和空间吗?我只有这样认为了 这种太简单的问题,你可以分步骤来找问题,首先你把索引值单独计算出来,然后再去索引表格,不要一大堆变量计算放里面当索引值。连你自己都不知道咋回事。
索引值单独计算出来后,看是不是0-9之间的数值,是的话肯定没有任何问题的,有问题就是比如开发工具哪里设置错了;不是的话就是尼自己计算索引值的地方错了,导致索引值溢出表格最大范围,否则不可能返回0,因为你表格里面压根没有0值 1a2b3c 发表于 2022-12-28 12:46
其它没看,你那个查表里面弄个除以1是起个啥用?
把我自学的所有功夫都用遍了硬是没理解到:(
难道不是浪 ...
(引用自2楼)
很明显编译器把/1优化掉了 指令粗略看没看出什么
我倒是有些怀疑是下载问题,51空闲rom区读出的是00
比如gu8a_7SegLed不在code区的0x1261 1a2b3c 发表于 2022-12-28 12:46
其它没看,你那个查表里面弄个除以1是起个啥用?
把我自学的所有功夫都用遍了硬是没理解到:(
难道不是浪 ...
(引用自2楼)
没作用,只是为了风格统一。前面还有拆分变量千位、百位、十位的代码。 Himem 发表于 2022-12-28 13:55
指令粗略看没看出什么
我倒是有些怀疑是下载问题,51空闲rom区读出的是00
(引用自5楼)
我怀疑是项目工程设置的问题,但是实在找不到关键词来搜索。
同样的代码在另外一家51芯片的里面是跑是正常的。 neutronlmk 发表于 2022-12-28 14:01
我怀疑是项目工程设置的问题,但是实在找不到关键词来搜索。
同样的代码在另外一家51芯片的里面是跑是正 ...
(引用自7楼)
叫你分步来调试下就清楚了
把里面索引值单独变量传递一下,就行了,单步调试跟过去看code区的表格的内容是啥,清清楚楚的, 被优化掉了,加上volatile就行 本帖最后由 neutronlmk 于 2022-12-28 15:25 编辑
找原厂支援解决问题,这个程序还是用了flash做掉电记忆之用,程序开头调用了函数 Flash_ReadArr(0x0000,6,gu8a_Eeprom); 来读取记忆;
官方的demo程序在读取数据之后没有把指针复位,丢。
我直接改了官方demo测试掉电记忆已经OK,没审清楚里面程序。 试试把flash改成small模式
页:
[1]