amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 2933|回复: 11

M128:定义的全局变量不能用的问题!

[复制链接]
发表于 2007-10-29 10:33:49 | 显示全部楼层 |阅读模式
马老师:我用的是ICCAVR及STK500仿真器.编译后全局变量地址从60H开始分配.而60H-FFH是扩展I/O区,全局变量(数组)中的值只能读不能写或者不是我定义的值.如果使用存储器绝对定位如:
#pragma abs_address:0x0700
unsigned char Flag,Usb_A_length,Usb_B_length;
unsigned char Usb_buf_A[64];
unsigned char Usb_buf_B[64];
#pragma end_abs_address
void main(void)
{
unsigned char i;
unsigned int TTS_Abuf_p,TTS_Bbuf_p,p;
unsigned char TTS_data_buff_A[1024];
unsigned char TTS_data_buff_B[1024];

又会造成主程序中定义的其他数组地址超过 0X1100 (注:我没用扩展RAM)
请教马老师:我的问题出在那里?如何正确使用全局变量? 谢谢!
发表于 2007-10-29 14:24:33 | 显示全部楼层
1。编译前请正确选择M128的芯片。
2。通常不提倡使用存储器绝对定位的方式定义内存变量的地址,绝对定位的方式主要应用在扩展RAM空间扩展了其它的并行接口器件时定义接口地址使用的。

3。注意程序中定义的数组空间不能太大了,2个1024就是2K了,M128还要使用堆栈、以及其它的变量也要占用空间,ICC还要使用一部分内存做软件堆栈(放临时变量、参数等),所以不可能将4K的RAM全部给用户使用。

4。将2个1024数组定义成全局变量试试,你现在作为局部变量,可能用于放局部变量的空间不够。

5。看你的定义,估计与USB有关,如果是HOST读U盘的话,4K的RAM非常紧张,要仔细考虑数据的结构,如数组开成512个,正好是一个扇区。
 楼主| 发表于 2007-10-29 16:18:38 | 显示全部楼层
马老师:
  我又重新写了个很短的测试程序,以验证全局变量的访问问题
#include <iom128v.h>
#include <macros.h>

void main(void);
void init_devices(void);

unsigned char Flag,Usb_A_length,Usb_B_length;
unsigned char Usb_buf_A[64];
unsigned char Usb_buf_B[64];

void main(void)
{
init_devices();
Flag = 0x80;
_NOP();
}
在仿真状态下见到的地址如下:
0x00E2   FLAG         值=0X00
0x00A0   Usb_buf_A
0x0060   Usb_buf_B
所有的地址都在60H-0FFH之间,程序执行完Flag=0x80后其值仍然为0.
烦请马老师再给分析一下.谢谢!
发表于 2007-10-29 16:30:52 | 显示全部楼层
ICC不会犯这样的错误,可能是你的设置上还不正确。

你用的什么仿真,M128的熔丝位配置成M128方式吗?M128出厂缺省为M103方式,你的内存分配有点像M103了。
 楼主| 发表于 2007-10-29 17:09:49 | 显示全部楼层
马老师:
  我用的是深圳微雪电子的STK500 5.0型,下面是我的熔丝位配置图

发表于 2007-10-29 17:21:02 | 显示全部楼层
你在ICC中芯片的选择是什么?不能选“M128:M103 mode”,应该选M128 / CAN128,然后重新编译、下载。

还有,为什么不先用AVR STUSIO中的软件模拟器看?多方便。ICC生成的map文件中好象有内存的分配情况的。根本不用硬仿真。原来是搞51的吧,学点新的调试技术。
 楼主| 发表于 2007-10-29 17:31:47 | 显示全部楼层
谢谢马老师!我选CAN128后再试.我的出身让老师说对了,一语中的.
 楼主| 发表于 2007-10-29 17:55:54 | 显示全部楼层
万分感谢马老师!改为CAN128重新编译,问题迎刃而解.谢谢!
发表于 2007-10-29 17:59:38 | 显示全部楼层
注意:"M128 / CAN128"是表示M128工作在M128模式,以及M128带CAN接口的都选择这个选项。
发表于 2011-11-10 13:33:33 | 显示全部楼层
#include "avr320240.h"
#include "pic.h"
//#pragma interrupt_handler usart1_RX_interrupt:iv_USART1_RX  //  31


unsigned char i=0;
unsigned char key=0;
//#pragma data:data
//#pragma data:code
//const unsigned char  string0[]={"String Test !"};
//const unsigned char  string1[]={"Hello ! BKS !"};
//const unsigned char  string2[]={"欢迎光临盐城吉华电子 !"};
//const unsigned char  string3[]={"Line Drawing Test !"};
//const unsigned char  string4[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
//#pragma data:data
//#pragma data:code
//////////////////////////////////////////////////////////////////////////////////////
// 1.PWM调节(没有必要用定时器实现)                                                                                                //
//2.显示字符串xy坐标类型必须为int型                                                                                                        //
//3.调用HZK.h库文件错误                                                                                                                                //
//4.读写时间不正确        电池没有电 或者晶振的电容错                                                                                //
//5.字符串不必再定义,直接写到显示函数里面                                                //
//6.全局变量定义之后,H文件中声明后就可以正常使用。                                                                 //
//////////////////////////////////////////////////////////////////////////////////////
unsigned char  sendbuf[30];

void main(void)
{  

//    unsigned char data=59;
//    unsigned char sendbuf[20]={"00112233445566778899"};
               
    port_init();                                                             //port&interrupt  chushihua
    init_pwm();                                                 //PWM          chushihua
    userinit();                                                                //display      chushihua
        Delay(500);                                                             //DS1302       chushihua
    init_devices();      
                                                 //write time   chushihua

              LcmClear();
        ShowPicture(0,0,320,240,bmp1);
               Delay(50);
               
                LcmClear();
        Display_String("欢迎光临盐城吉华电子 !",80,64,22);
                Display_String("www.yanchengjihua.com ",80,80,22);
                Display_String("Tel:0515-88637858  ",80,96,19);
                Display_String("Fax:0515-88637858  ",80,112,19);
                Display_String("E_mail:www.gfg@163.com ",80,128,22);
                Display_String("ADD:盐城大庆中路9号 ",80,144,20);
               
                  Delay(50);
                LcmClear();
                PORTF&=~(1<<2);
        max485_in;
                SEI();
    while(1)
            {

/*                  
//                LcmClear();
//      line(0,0,319,239);
//      line(0,239,319,0);
//                Delay(500);
            DisplayTime();
        line(0,20,319,20);
        line(0,25,319,25);
               
        line(0,230,319,230);
        line(0,235,319,235);
               
        Display_String("01.Ex  %LEL  0.00  25.00  50.00  Normal ",00,32,40);
                Display_String("02.Ex  %LEL  0.00  25.00  50.00  Normal ",00,48,40);
                Display_String("03.Ex  %LEL  0.00  25.00  50.00  Normal ",00,64,40);
            Display_String("04.Ex  %LEL  0.00  25.00  50.00  Normal ",00,80,40);
                Display_String("05.Ex  %LEL  0.00  25.00  50.00  Normal ",00,96,40);
                Display_String("06.Ex  %LEL  0.00  25.00  50.00  Normal ",00,112,40);
                Display_String("07.Ex  %LEL  0.00  25.00  50.00  Normal ",00,128,40);
                Display_String("08.Ex  %LEL  0.00  25.00  50.00  Normal ",00,144,40);
                Display_String("09.Ex  %LEL  0.00  25.00  50.00  Normal ",00,160,40);
                Display_String("10.Ex  %LEL  0.00  25.00  50.00  Normal ",00,176,40);
                Display_String("11.Ex  %LEL  0.00  25.00  50.00  Normal ",00,192,40);
                Display_String("12.Ex  %LEL  0.00  25.00  50.00  Normal ",00,208,40);
            Delay(5000);
                       
                LcmClear();       
                DisplayTime();                       
                line(0,20,319,20);
        line(0,25,319,25);
               
        line(0,230,319,230);
        line(0,235,319,235);       
                Display_String("13.Ex  %LEL  0.00  25.00  50.00  Normal ",00,32,40);
                Display_String("14.Ex  %LEL  0.00  25.00  50.00  Normal ",00,48,40);
                Display_String("15.Ex  %LEL  0.00  25.00  50.00  Normal ",00,64,40);
            Display_String("16.Ex  %LEL  0.00  25.00  50.00  Normal ",00,80,40);
                Display_String("17.Ex  %LEL  0.00  25.00  50.00  Normal ",00,96,40);
                Display_String("18.Ex  %LEL  0.00  25.00  50.00  Normal ",00,112,40);
                Display_String("19.Ex  %LEL  0.00  25.00  50.00  Normal ",00,128,40);
                Display_String("20.Ex  %LEL  0.00  25.00  50.00  Normal ",00,144,40);
                Display_String("21.Ex  %LEL  0.00  25.00  50.00  Normal ",00,160,40);
                Display_String("22.Ex  %LEL  0.00  25.00  50.00  Normal ",00,176,40);
                Display_String("23.Ex  %LEL  0.00  25.00  50.00  Normal ",00,192,40);
                Display_String("24.Ex  %LEL  0.00  25.00  50.00  Normal ",00,208,40);                       
            Delay(5000);
               
//                LcmClear();
//                Display_String("传感器单位值状态报警主机设置时间确定取消",00,80,40);
//                Display_String("可燃性气体日期正异常有毒",80,96,24);
//                Delay(5000);
               
*/      
            //Delay(5000);               
                //write_time(time);  
                //LcmClear();
                DisplayTime();
                key_check();
     
//      usart_out(sendbuf,6);
//         
//       max485_out;
//              usart1_str_sendArray(sendbuf,20);
//             max485_in;
        if(key==1)
         {
                 max485_out;
              usart1_str_sendArray(sendbuf,20);
                 PORTF&=~(1<<2);
                 max485_in;
                 }
         
       else
                key=0;
        
       
        }

}



void DisplayTime()
{
unsigned char lbuf1[26];
unsigned char time[8]={0x11,0x11,0x10,0x13,0x21,0x50};
//  write_time(time);               
read_time(time);
lbuf1[0]=time[0]/0x10+0x30;
lbuf1[1]=time[0]%0x10+0x30;
lbuf1[2]=0x2f;
lbuf1[3]=time[1]/0x10+0x30;
lbuf1[4]=time[1]%0x10+0x30;
lbuf1[5]=0x2f;
lbuf1[6]=time[2]/0x10+0x30;
lbuf1[7]=time[2]%0x10+0x30;

lbuf1[8]=time[3]/0x10+0x30;
lbuf1[9]=time[3]%0x10+0x30;
lbuf1[10]=0x3a;
lbuf1[11]=time[4]/0x10+0x30;
lbuf1[12]=time[4]%0x10+0x30;
lbuf1[13]=0x3a;
lbuf1[14]=time[5]/0x10+0x30;
lbuf1[15]=time[5]%0x10+0x30;

//lbuf1[16]=time[6]/0x10+0x30;
//lbuf1[17]=time[6]%0x10+0x30;


Display_ASCII(0x32,88,8);
Display_ASCII(0x30,96,8);
Display_ASCII(lbuf1[0],104,8);
Display_ASCII(lbuf1[1],112,8);
Display_ASCII(lbuf1[2],120,8);
Display_ASCII(lbuf1[3],128,8);
Display_ASCII(lbuf1[4],136,8);
Display_ASCII(lbuf1[5],144,8);
Display_ASCII(lbuf1[6],152,8);
Display_ASCII(lbuf1[7],160,8);

Display_ASCII(0x20,168,8);
Display_ASCII(0x20,176,8);

Display_ASCII(lbuf1[8],184,8);
Display_ASCII(lbuf1[9],192,8);
Display_ASCII(lbuf1[10],200,8);
Display_ASCII(lbuf1[11],208,8);
Display_ASCII(lbuf1[12],216,8);
Display_ASCII(lbuf1[13],224,8);
Display_ASCII(lbuf1[14],232,8);
Display_ASCII(lbuf1[15],240,8);
   
}


我的程序display中可以写时间  但是在主程序定义全局数组time【8】={0x11,。。。};用main函数写时间wtime(time);就不正确,(写的时间)但是在display中定义局部数组  在调用wtime(time)就能写正确  痛苦呢???各位给看一下??
发表于 2011-11-10 13:40:27 | 显示全部楼层
#include<iom128v.h>
#include<macros.h>
///////////////////宏定义////////////////////////////////////

#define Uchar unsigned char
#define Uint unsigned int
#define hzNum  200



头文件和读写时间函数在此头文件中  函数已经包含
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-17 11:20

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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