|
板子应该是没有问题的,这里想请教下我在做这个实验的时候遇到的一个非常奇怪的问题。
在现在做过的实验中,rtc实验和adc实验需要从寄存器读取数据。但是adc比rtc来说还多了个计算功能。
问题就出在这个计算中。
如果我使用一个变量然后保存寄存器的值,然后进行运算(除法,乘法)那么程序保证运行到这个位置飞掉。但是读取寄存器的值到变量这部分代码是可以通过的,运算的代码也是可以通过的(都是互相屏蔽掉单独测试)。最可怕的是,我改一个赋值语句,最终生成的bin文件就会相差达到100多字节。
请大家帮助分析一下,小弟感激不尽!!
我贴出adc测试部分的代码
else if(!(no_system_strcmp("adc test",cmd_buf)))
{
char temp[6];
int adc_data0;
float adc_data;
no_system_memset(cmd_buf,0,50);
adc_init();
/*成功的部分,表明读取寄存器的值无错*/
adc_data0 = adc_read_once();
uart0_printf("convert adc\n\r");
temp[0] = '0';
temp[1] = 'x';
temp[2] = ((adc_data0 >> 8) & 0x3) + 48;
temp[3] = ((adc_data0 >> 4) & 0xf) + ((((adc_data0 >> 4) & 0xf) > 9) ? 55 : 48);
temp[4] = (adc_data0 & 0xf) + (((adc_data0 & 0xf) > 9) ? 55 : 48);
temp[5] = '\0';
uart0_printf("adc capture data: ");
uart0_printf(temp);
uart0_printf(" v");
/*上面证明了读取寄存器无错,最后打印出来的是0~0x3ff的值*/
adc_data1 = 800;/*如果这句的赋值语句改为adc_data1 = ADCDAT0就是直接读取寄存器的值,程序编译后会增大100多字节,且程序运行到这里飞掉,*/
adc_data = (adc_data1 / 1024 * 3.3);/*这个和上面的一句配合有问题,单独测试都是好的*/
/*现在完全搞不懂为何这样,我的几个想法是:1.编译器本身bug问题(但是单独测试都能通过,和他们的汇编没有太大关系)2.和自己的程序配合问题(不知道是哪方面的配合有问题?我很在意代码暴涨的情况,还在看反汇编代码,但是分析的头都大了,发布上来希望遇到过这样情况的朋友指点一下)*/
temp[1] = '.';
temp[5] = '\0';
temp[0] = ((int)adc_data) + 48;
temp[2] = ((int)(adc_data * 10) - (int)adc_data * 10) + 48;
temp[3] = ((int)(adc_data * 100) - ((int)(adc_data * 10) * 10)) + 48;
temp[4] = ((int)(adc_data * 1000) - ((int)(adc_data * 100) * 10)) + 48;
uart0_printf("adc capture data: ");
uart0_printf(temp);
uart0_printf(" v");
} |
|