查看: 2511|回复: 2

[CodeWarrior] codewarrior6.3,AW60,数组长度,ILLEGAL_BP

[复制链接]

该用户从未签到

12

主题

36

帖子

0

中级会员

Rank: 3Rank: 3

积分
252
最后登录
1970-1-1
发表于 2015-4-29 08:34:12 | 显示全部楼层 |阅读模式
在ADC.C中定义了一个全局数组变量,同时进行了初始化,长度16,类型int。map中查到,它被放到了0x0100。需要把这个数组加长,发现,长度只要超过17,程序就跑不起来,一启动就被告知ILLEGAL_BP。
我把别的数组缩短,试图“腾出”空间,无效。
我把STRACKSIZE加大,也无效。
后来找到两个解决方法:
1. 把这个数组设成函数中的局部变量
2. 仍是全局变量但不初始化,到函数里面去初始化。这个时候,map中,它就不在0x100了。

项目其他背景:
程序中使用了flash读写,实现掉电数据保存。程序为freescale某个文档提供的。因此,增加了strack的大小。也为了在AW32和AW60上通用,修改PRM文件中的ROM起始地址。



请问,可能的原因是什么?如果存在溢出,是否能在map文件中看到蛛丝马迹?

谢谢!
我知道答案 目前已有2人回答
回复

使用道具 举报

该用户从未签到

7

主题

107

帖子

0

中级会员

Rank: 3Rank: 3

积分
444
最后登录
2019-3-7
发表于 2015-4-29 09:07:46 | 显示全部楼层
建议贴代码出来,论坛上对这个错误解释都一样,不过还没遇到这种错误!
1.重新下载。
2.在调试过程中非法设置断点。(从名字来看,这个命令应该是报ILLEGAL_BP错误~)
3.堆栈溢出。因为片上资源有限,而如果用到的临时变量太多,会导致片上堆栈溢出。
4.程序中中断设置错误。程序中设置了开中断,但是却没有中断处理函数,就会报错。
   解决办法:要么写中断处理函数,要么别开中断。
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

36

帖子

0

中级会员

Rank: 3Rank: 3

积分
252
最后登录
1970-1-1
 楼主| 发表于 2015-4-29 10:26:05 | 显示全部楼层
就这么一段代码。见后。
1. 下载N次,表现一样
2. 没有设置断点
3. 整个项目已经成功运行、销售。这次只是想把测温范围从0-150提高到0-220,所以,数组要加长。
4. 调整数组赋值方式后,问题解决,可以说明,程序逻辑、数组的引用都没有越界、错误之类的问题。

#include "includes.h"

unsigned int AD12[8];
unsigned char AD12_count;

unsigned int AD13[8];
unsigned char AD13_count;


/*   对应温度传感器输出15档(150度,140度..0度)电阻时的AD采样值  */
unsigned  int Temperature[] ={
        33, //150度
        42, //140度
        53,//130度
        68, //120度
        87, //110度
        114,
        148,
        194,
        254,
        328,
        417,
        517,
        625,
        729,
        821,
        889   //0度  
};

/* 查表得到温度值                */
/* 输入  :  10位AD采样值         */
/* 结果变量:0--1500(单位:0.1度)     */
unsigned int AD2T(unsigned  int ADValue)
{
        unsigned  int tmp1,tmp2;
        unsigned  char i=0,VH,VL;
        tmp1=Temperature;
        if (ADValue <= tmp1)
        {
                return 1500;
        }
        if (ADValue > Temperature[15])
        {
                return 0;
        }
        while (ADValue > tmp1)
        {
                i++;
                tmp1=Temperature;
        }  
        if (ADValue==tmp1)
        {
                VH=i;
                VL=0;
        }
        else
        {
                i--;
                VH=i;
                tmp2=Temperature;
                tmp1-=tmp2;
                tmp2=ADValue-tmp2;  
                tmp2*=100;        //100等分
                VL=0;
                while(tmp1<=tmp2)
                {
                  tmp2-=tmp1;
                  VL++;
                }
        }           
        return (150-VH*10)*10-VL;
}

void get_T(void)
{
        unsigned int temp;
        unsigned char AD_Value_H,AD_Value_L,i;
        
        ADC1SC1 = 12;//获取ADP12通道的AD值------热风口温度
        while( ADC1SC1_COCO == 0 )
        {
                if( ADC1SC2_ADACT == 0 )
                        return;
        }
        AD_Value_L = ADC1RL;
        AD_Value_H = ADC1RH;
        temp = AD_Value_H;
        temp = (temp <<8) + AD_Value_L;
        AD12[AD12_count]=temp;
        AD12_count++;
        if(AD12_count==8)                //采样8次后取平均值,然后换算成温度
        {
                temp=0;
                for(i=0;i<8;i++) temp+=AD12;
                temp=(temp>>3);
                temp=AD2T(temp);
                T12=(temp/10);
                AD12_count=0;
        }
        
        ADC1SC1 = 13;//获取ADP13通道的AD值------环境温度
        while( ADC1SC1_COCO == 0 )
        {
                if( ADC1SC2_ADACT == 0 )
                        return;
        }
        AD_Value_L = ADC1RL;
        AD_Value_H = ADC1RH;
        temp = AD_Value_H;
        temp = (temp <<8) + AD_Value_L;
        AD13[AD13_count]=temp;
        AD13_count++;
        if(AD13_count==8)                //采样8次后取平均值,然后换算成温度
        {
                temp=0;
                for(i=0;i<8;i++) temp+=AD13;
                temp=(temp>>3);
                temp=AD2T(temp);
                T13=(temp/10);
                AD13_count=0;
        }

}



void ADC_init(void)
{
        /* ADC初始化 */
        APCTL1 = 0x00; //ADPC7~1=0=允许AD7~0管脚用作I/O  
        //AD12:热风口温度
        //AD13:环境温度
        //AD14:预留
        //AD15:预留
    APCTL2 = 0b00110000; //ADPC12/13用于AD,其他引脚用作I/O         
        ADC1CFG = 0b00001000;//(高速、不分频、短采样时间) ,10位模式                                   
        ADC1SC2 = 0x00; //未启动转换,软件触发转换,禁止比较功能                                    
        ADC1CV = 0x00;  //比较位清零
        ADC1SC1 = 0x1F; //0001 1111,转换完成禁止中断,非连续转换,通道选择VREFH(获取AD值时,在GetAD中切换通道)        
        
        AD12_count=0;
        AD13_count=0;
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-21 21:27 , Processed in 0.086854 second(s), 23 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表