搜索
bottom↓
回复: 14

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

[复制链接]

出0入0汤圆

发表于 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编译器。请教各位高手给我指点下迷津

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2013-3-19 21:18:14 | 显示全部楼层
robin45853258 发表于 2013-3-18 18:34
是不是因为systick之后时钟没稳定,加个延时就会好啊?要是我,我可能会对比一下前后软件编译完的寄存器值 ...

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

出0入0汤圆

发表于 2013-9-10 19:17:29 | 显示全部楼层
我也遇到这个问题,何解,不明白啊

出0入0汤圆

发表于 2013-9-10 19:34:17 | 显示全部楼层
你的KEIL版本是多少?

出0入42汤圆

发表于 2013-9-10 19:39:13 | 显示全部楼层
LCD_GPIO_Config();                  //初始化使用到的GPIO
LCD_FSMC_Config();                  //初始化FSMC模式
这两个函数里应该会有GPIO和FSMC的初始化结构体,这些结构体本身也是要初始化的。有时给这些结构体赋值时,会忘记给在这种配置下无效的成员赋值,导致其值在允许的范围之外,这时候就会卡在参数检查那儿。

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

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

出0入0汤圆

发表于 2013-9-10 21:08:11 来自手机 | 显示全部楼层
我是进来取精的…………!

出0入0汤圆

发表于 2013-9-10 23:25:34 | 显示全部楼层
楼主用的什么软件,感觉MDK总是会出现莫名其妙的问题,还是IAR稳定点

出0入0汤圆

发表于 2013-9-10 23:28:39 | 显示全部楼层
                           

出0入0汤圆

发表于 2013-9-14 14:04:55 | 显示全部楼层
奇怪,楼主的main()写成了mian(),居然编译通过,执行正常?

出0入0汤圆

发表于 2013-9-20 21:33:03 | 显示全部楼层
bailao99 发表于 2013-9-14 14:04
奇怪,楼主的main()写成了mian(),居然编译通过,执行正常?

应该就是这个的问题了

出130入129汤圆

发表于 2013-9-20 22:01:54 来自手机 | 显示全部楼层
我也遇到过类似问题,定义全局变量a导致不相关的函数b崩溃。后来发现b里面有sscanf函数,将值输入到一个16位变量,但是sscanf里面%d是32位整型,运行到这部后导致其他全局变量被修改。

出0入0汤圆

发表于 2013-9-20 22:05:24 | 显示全部楼层
有可能是内存越界

出0入0汤圆

发表于 2013-9-20 22:09:35 | 显示全部楼层
bailao99 发表于 2013-9-14 14:04
奇怪,楼主的main()写成了mian(),居然编译通过,执行正常?

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

出0入0汤圆

发表于 2013-9-21 14:11:09 | 显示全部楼层
bailao99 发表于 2013-9-14 14:04
奇怪,楼主的main()写成了mian(),居然编译通过,执行正常?

厉害!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 04:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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