首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

好些天没有搞明事情,麻烦各位给看看。

好些天没有搞明事情,麻烦各位给看看。

#include <hidef.h>      /* common defines and macros */
#include <mc9s12dp256.h>     /* derivative information */  


#pragma LINK_INFO DERIVATIVE "mc9s12dp256b"  


char autoset_rssi_rx_rf(){ 
  unsigned char tt[2];
  char rssi=-91; 
  float rssi_14_t1;
  float rssi_14_t2;
  float rssi_14_t;   
  float rssi_f1_t1;
  float rssi_f2_t1;
  float rssi_f_t1;  
  float rssi_f1_t2;
  float rssi_f2_t2;
  float rssi_f_t2;  
  float rssi_f_t;
  tt[0]=2;
  tt[1]=190;


   //eeprom_trx_rd(tt,1024+360, 2);//14875MHz,-45dBm,D,t1=25     
  rssi_14_t1=256*tt[0]+tt[1];   //702
  //eeprom_trx_rd(tt,1024+503, 2);//14875MHz,-45dBm,D,t2=55     
  rssi_14_t2=256*tt[0]+tt[1]+2;  //704
     rssi_14_t=rssi_14_t1+(rssi_14_t2-rssi_14_t1)*0.77;   // 703
///////////////////////////////////////////////////////////////////////  
    //eeprom_trx_rd(tt,800+81, 2);//15300MHz,-45dBm,t1=25
    rssi_f1_t1=256*tt[0]+tt[1];   //702
    //eeprom_trx_rd(tt,800+83, 2);//15350MHz,-45dBm,t1=25
    rssi_f2_t1=256*tt[0]+tt[1]+6; //708
    rssi_f_t1= (rssi_f2_t1+rssi_f1_t1)/2;   //705
 ////////////////////////////////////////////////////////////////// 
    //eeprom_trx_rd(tt,800+104, 2);//15300MHz,-45dBm,t2=55
    rssi_f1_t2=256*tt[0]+tt[1];   //702
   //eeprom_trx_rd(tt,800+106, 2);//15350MHz,-45dBm,t2=55 
   rssi_f2_t2=256*tt[0]+tt[1]+8;  //710
   rssi_f_t2=(rssi_f1_t2+rssi_f2_t2)/2;   //706
 /////////////////////////////////////////////////////////////    rssi_f_t=rssi_f_t1+(rssi_f_t2-rssi_f_t1)*0.77;   //705
 //////////////////////////////////////////////////////////////
    rssi=(char)(rssi_14_t-rssi_f_t);     //703-705= -2
    return rssi;
 
}   
void main(void) {
  /* put your own code here */
  char test;
  test= autoset_rssi_rx_rf(); 
  for(;;) {} /* wait forev


软件仿真时设置断点查看,发现


rssi        <not allocated> float
rssi_14_t1  <not allocated> float
rssi_14_t2  <not allocated> float
rssi_14_t   <not allocated> float
rssi_f1_t1  <not allocated> float
rssi_f2_t1  <not allocated> float
rssi_f_t1   <not allocated> float
rssi_f1_t2  <not allocated> float
rssi_f2_t2  <not allocated> float
rssi_f_t2   <not allocated> float
rssi_f_t    <not allocated> float  

如果将函数autoset_rssi_rx_rf()的代码全部放到main()中,则一切正常
请问是什么原因,谢谢了。

[此贴子已经被作者于2006-8-25 11:30:47编辑过]

局部变量不会分配固定的地址,只会放入堆栈中,而且要等其所在程序运行时才会分配。所以,只有程序进入autoset_rssi_rx_rf()函数后,你才能看到这些变量的地址和数据。
海纳百川  有容乃大

我是在autoset_rssi_rx_rf()函数
rssi=(char)(rssi_14_t-rssi_f_t); //703-705= -2
处设置的断点呀。 而且我可以看到TT【0】,和TT【1】中已经是我写入的值

我原打算把相关信息的抓图发上来的可是上传图片老是提示

ADODB.Stream 错误 '800a0bbc'

写入文件失败。

/uploadTwo.inc,行175

[此贴子已经被作者于2006-8-25 15:07:41编辑过]

恩,最近网站上传有点问题
也可能是这些变量大都执行中间过程的操作,所以编译器优化了操作,没有分配固定的空间
堆栈溢出了?
海纳百川  有容乃大
堆栈溢出了?
应该不会,我的 STACKSIZE 0x2000
如果将函数autoset_rssi_rx_rf()的代码全部放到main()中,则一切正常
如下
#include /* common defines and macros */
#include /* derivative information */


#pragma LINK_INFO DERIVATIVE "mc9s12dp256b"

void main(void) {
/* put your own code here */
unsigned char tt[2];
char rssi=-91;
float rssi_14_t1;
float rssi_14_t2;
float rssi_14_t;
float rssi_f1_t1;
float rssi_f2_t1;
float rssi_f_t1;
float rssi_f1_t2;
float rssi_f2_t2;
float rssi_f_t2;
float rssi_f_t;
tt[0]=2;
tt[1]=190;

//eeprom_trx_rd(tt,1024+360, 2);//14875MHz,-45dBm,D,t1=25
rssi_14_t1=256*tt[0]+tt[1]; //702
//eeprom_trx_rd(tt,1024+503, 2);//14875MHz,-45dBm,D,t2=55
rssi_14_t2=256*tt[0]+tt[1]+2; //704
rssi_14_t=rssi_14_t1+(rssi_14_t2-rssi_14_t1)*0.77; // 703
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//eeprom_trx_rd(tt,800+81, 2);//15300MHz,-45dBm,t1=25
rssi_f1_t1=256*tt[0]+tt[1]; //702
//eeprom_trx_rd(tt,800+83, 2);//15350MHz,-45dBm,t1=25
rssi_f2_t1=256*tt[0]+tt[1]+6; //708
rssi_f_t1= (rssi_f2_t1+rssi_f1_t1)/2; //705
//////////////////////////////////////////////////////////////////////////////////////////////////
//eeprom_trx_rd(tt,800+104, 2);//15300MHz,-45dBm,t2=55
rssi_f1_t2=256*tt[0]+tt[1]; //702
//eeprom_trx_rd(tt,800+106, 2);//15350MHz,-45dBm,t2=55
rssi_f2_t2=256*tt[0]+tt[1]+8; //710
rssi_f_t2=(rssi_f1_t2+rssi_f2_t2)/2; //706
//////////////////////////////////////////////////////////////////////////////////////////////////
rssi_f_t=rssi_f_t1+(rssi_f_t2-rssi_f_t1)*0.77; //705
//////////////////////////////////////////////////////////////////////////////////////////////////
rssi=(char)(rssi_14_t-rssi_f_t); //703-705= -2
EnableInterrupts;
for(;;) {} /* wait forever */
}
strongchen 麻烦再给看看吧。
把整个project打包贴上来看看吧。或者发到strongchen_free@yahoo.com.cn。
海纳百川  有容乃大
不能上传,已经发送到你的信箱。请查收一下。
这可能是因为编译时优化产生的问题。你可以在变量声明前加static说明来解决,像这样:

static char rssi=-91;
static float rssi_14_t1;
static float rssi_14_t2;
static float rssi_14_t;
static float rssi_f1_t1;
static float rssi_f2_t1;
static float rssi_f_t1;
static float rssi_f1_t2;
static float rssi_f2_t2;
static float rssi_f_t2;
static float rssi_f_t;

调试时你就可以看到变量的地址和数值了。
海纳百川  有容乃大
谢谢了,原来是这个原因呀。搞的我这几天头都大了。
变量声明前加static说明来解决
我想再请教一下,如果不加的话,调测时看不到变量值,这样对最后的运算结果有影响吗?如果只是因为优化的原因不能在调测时看到变量值,而最终结果正确的话,我是不是可以在需要看变量值的地方加static,其他定义的变量可以不加?
对,如果局部变量声明前加static,就会分配一个固定的地址,会占用很多的资源。如非必需,尽量不要加。正常情况下,应该不会影响结果。当可能影响结果时,编译器会有警告。此时关闭相应的优化选项即可。
海纳百川  有容乃大
Hi Strongchen, saying hello to you!
----------------- Once upon a time in Beijing
返回列表