香山书院分享 http://blog.sciencenet.cn/u/wjwqbit we're back, we're back in San Francisco

博文

1.数组边界溢出问题(2010.07.20)

已有 4139 次阅读 2010-7-29 22:48 |个人分类:嵌入式C语言编程常见错误(连载)|系统分类:科研笔记|关键词:学者| C语言, 常见错误, 嵌入式, 硬件编程

很高兴今天我的博客开了“嵌入式C语言编程常见错误”这个模块。这是笔者在自己实际项目中遇到的编程问题,把它们列出来,一是为了提醒自己以后别犯这些错误了,另外也为读者提供了一些编程习惯的参考和告诫。

以后还可能会遇到一些其他编程问题,笔者将会继续写下来。另外也会提出一些编程经验,仅供学习参考。

定义一维数组ADC_Buff[10],数组下标上溢出时,另一变量TempCalibration 被“奇妙”的修改了。例子如下(编译环境为ICCAVR):

 

int ADC_Buff[10]={0};       //ADC转换缓冲区  
 char TempCalibration = 200; 

 unsigned char ADC_Buff_Index;

 #pragma interrupt_handler ADC_Isr:iv_ADC


void ADC_Isr(void)//ADC转换结束中断
{   
   ADC_Buff[ADC_Buff_Index] = (ADCH<<8)+ADCL;
   Set_ADC_Read_Flag;
   ADC_Buff_Index++;
}

 

//主函数

Void main(void)

{

ADC_Init() ;

ADC_SelChanl(0);
       ADC_Start ;

While(1)

{

           if(ADC_Read_Flag)
           {  
                Clear_ADC_Read_Flag ; 
                if(ADC_Buff_Index>10)
                {
                      Set_ADC_Sampled_Flag;
                      ADC_Buff_Index =0 ;
                 }
                 else
                 {
                      ADC_Start ;
                  }
      }
    }//end while(1)

}//end main

 

 

主要红色字体部分,主函数启动AD采样后,单次AD采样完成后自动进入AD中断处理函数。第10AD中断处理完成后,ADC_Buff_Index10。返回主函数后执行到 if(ADC_Buff_Index>10)时,if条件不成立,则执行else中内容在次启动AD采样(实际上我需要在这里就停止采样了),再次进入AD中断服务函数,此时读取ADC采样值ADC_Buff[ADC_Buff_Index] = (ADCH<<8)+ADCL;注意数组下标ADC_Buff_Index10,因此是给缓存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)”后问题消除。

 


https://m.sciencenet.cn/blog-331690-348359.html

上一篇:从一个高Q值低通滤波电路看电容的影响
下一篇:2.数据运算出错

0

发表评论 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-2 21:45

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部