||||
很高兴今天我的博客开了“嵌入式C语言编程常见错误”这个模块。这是笔者在自己实际项目中遇到的编程问题,把它们列出来,一是为了提醒自己以后别犯这些错误了,另外也为读者提供了一些编程习惯的参考和告诫。
以后还可能会遇到一些其他编程问题,笔者将会继续写下来。另外也会提出一些编程经验,仅供学习参考。
定义一维数组ADC_Buff[10],数组下标上溢出时,另一变量TempCalibration 被“奇妙”的修改了。例子如下(编译环境为ICCAVR):
int ADC_Buff[10]={0}; //ADC转换缓冲区 unsigned char ADC_Buff_Index; #pragma interrupt_handler ADC_Isr:iv_ADC
//主函数 Void main(void) { ADC_Init() ; ADC_SelChanl(0); While(1) { if(ADC_Read_Flag) }//end main |
主要红色字体部分,主函数启动AD采样后,单次AD采样完成后自动进入AD中断处理函数。第10次AD中断处理完成后,ADC_Buff_Index是10。返回主函数后执行到 if(ADC_Buff_Index>10)时,if条件不成立,则执行else中内容在次启动AD采样(实际上我需要在这里就停止采样了),再次进入AD中断服务函数,此时读取ADC采样值ADC_Buff[ADC_Buff_Index] = (ADCH<<8)+ADCL;注意数组下标ADC_Buff_Index是10,因此是给缓存ADC_Buff[10]赋值,显然数组下标越界了。那么实际上ADC_Buff[10]是哪个变量呢?
其实,C语言编译器对有初始化的变量的初始化是连续的,什么意思呢?看看在定义了ADC_Buff后,定义的是哪个变量?是TempCalibration。编译器在编译程序时,变量TempCalibration是紧跟在ADC_Buff之后的。内存中的位置如下:
...... |
ADC_Buff[0] |
ADC_Buff[1] |
...... |
ADC_Buff[9] |
TempCalibration |
...... |
因此在给ADC_Buff[10]赋值是,实际上指针指向的是TempCalibration,所以TempCalibration被“奇妙”的修改了。将“if(ADC_Buff_Index>10)”改为“if(ADC_Buff_Index>9)”后问题消除。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-6-2 19:32
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社