bianhengyang 发表于 2013-3-17 18:01:43

为什么定义了一个无用的变量就解决了单片机死机问题

本帖最后由 bianhengyang 于 2013-3-17 18:08 编辑

今天用野火M3的开发板做一个液晶显示汉字的程序,移植了开发板中所带的文件系统、SD卡读写、LCD等功能能函数到我的工程中;在main函数中基本初始化如下:       
mian()
{
SysTick_Init();         /*systick 初始化*/
LCD_Init();            /*LCD初始化*/
sd_fs_init();

LCD_Str_O(50, 20,"CAN Receice Data Information", 0);//显示提示信息
LCD_Str_CH(10,50,"阿莫论坛野火专区",0,0xffff);
while( Can_flag == 0xff ); //等待主机端的数据
}
编译没有产生错误,但是下载到板子上就显示不了,后来仿真在LCD_Init(); 函数里死机了
void LCD_Init(void)
{
    uint8_t xxx = 0;                     //本来没有这句的,加上这句就能正常显示了

    unsigned long i;

    LCD_GPIO_Config();                  //初始化使用到的GPIO
    LCD_FSMC_Config();        //初始化FSMC模式
    LCD_Rst();                //复位LCD液晶屏
    Lcd_init_conf();                      //写入命令参数,对液晶屏进行基本的初始化配置
    Lcd_data_start();            //发送写GRAM命令
    for(i=0; i<(320*240); i++)                              
    {
      LCD_WR_Data(GBLUE);      //发送颜色数据,使屏幕初始化为GBLUE颜色                                          
    }
}

后来我就在LCD_Init(void)中随便定义了一个局部变量xxx,结果神奇般得能正常显示了;
出现这个问题我很纳闷,就加了一个无用的变量,尽然就能通过了,是编译器的问题吗?我用的是keil编译器。请教各位高手给我指点下迷津

robin45853258 发表于 2013-3-18 18:34:21

是不是因为systick之后时钟没稳定,加个延时就会好啊?要是我,我可能会对比一下前后软件编译完的寄存器值有没有差异,然后对比一下编译完的map地址有没有什么差异,一般不会出现编译器的问题,有时候也可能芯片的问题。都不好说,有结果了告诉我O(∩_∩)O哈!

bianhengyang 发表于 2013-3-19 21:18:14

robin45853258 发表于 2013-3-18 18:34 static/image/common/back.gif
是不是因为systick之后时钟没稳定,加个延时就会好啊?要是我,我可能会对比一下前后软件编译完的寄存器值 ...

能告诉我下如何对比一下前后软件编译完的寄存器值没有差异和map地址有没有什么差异。我没理解你说的意思

flylokj 发表于 2013-9-10 19:17:29

我也遇到这个问题,何解,不明白啊

camtime 发表于 2013-9-10 19:34:17

你的KEIL版本是多少?

wshtyr 发表于 2013-9-10 19:39:13

LCD_GPIO_Config();                  //初始化使用到的GPIO
LCD_FSMC_Config();                  //初始化FSMC模式
这两个函数里应该会有GPIO和FSMC的初始化结构体,这些结构体本身也是要初始化的。有时给这些结构体赋值时,会忘记给在这种配置下无效的成员赋值,导致其值在允许的范围之外,这时候就会卡在参数检查那儿。

例如,初始化GPIO为输入状态,此时GPIO_Speed是无效的,但GPIO_Init函数内会对所有成员进行参数检查,如果检测到GPIO_Speed是无效值,就不会执行下去了。

LZ可以看看那两个函数内有没有类似的情况。

ab1212144 发表于 2013-9-10 21:08:11

我是进来取精的…………!

armfans 发表于 2013-9-10 23:25:34

楼主用的什么软件,感觉MDK总是会出现莫名其妙的问题,还是IAR稳定点

nome 发表于 2013-9-10 23:28:39

{:lol:}                           

bailao99 发表于 2013-9-14 14:04:55

奇怪,楼主的main()写成了mian(),居然编译通过,执行正常?

mcu_mouse 发表于 2013-9-20 21:33:03

bailao99 发表于 2013-9-14 14:04 static/image/common/back.gif
奇怪,楼主的main()写成了mian(),居然编译通过,执行正常?

应该就是这个的问题了{:lol:}

68336016 发表于 2013-9-20 22:01:54

我也遇到过类似问题,定义全局变量a导致不相关的函数b崩溃。后来发现b里面有sscanf函数,将值输入到一个16位变量,但是sscanf里面%d是32位整型,运行到这部后导致其他全局变量被修改。

szmini2006 发表于 2013-9-20 22:05:24

有可能是内存越界

Gallen.Zhang 发表于 2013-9-20 22:09:35

bailao99 发表于 2013-9-14 14:04 static/image/common/back.gif
奇怪,楼主的main()写成了mian(),居然编译通过,执行正常?

好犀利的眼神啊,这都被你看出来了,佩服佩服!!!

Sullivan 发表于 2013-9-21 14:11:09

bailao99 发表于 2013-9-14 14:04 static/image/common/back.gif
奇怪,楼主的main()写成了mian(),居然编译通过,执行正常?

厉害!!!
页: [1]
查看完整版本: 为什么定义了一个无用的变量就解决了单片机死机问题