为什么定义了一个无用的变量就解决了单片机死机问题
本帖最后由 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编译器。请教各位高手给我指点下迷津 是不是因为systick之后时钟没稳定,加个延时就会好啊?要是我,我可能会对比一下前后软件编译完的寄存器值有没有差异,然后对比一下编译完的map地址有没有什么差异,一般不会出现编译器的问题,有时候也可能芯片的问题。都不好说,有结果了告诉我O(∩_∩)O哈! robin45853258 发表于 2013-3-18 18:34 static/image/common/back.gif
是不是因为systick之后时钟没稳定,加个延时就会好啊?要是我,我可能会对比一下前后软件编译完的寄存器值 ...
能告诉我下如何对比一下前后软件编译完的寄存器值没有差异和map地址有没有什么差异。我没理解你说的意思
我也遇到这个问题,何解,不明白啊 你的KEIL版本是多少? LCD_GPIO_Config(); //初始化使用到的GPIO
LCD_FSMC_Config(); //初始化FSMC模式
这两个函数里应该会有GPIO和FSMC的初始化结构体,这些结构体本身也是要初始化的。有时给这些结构体赋值时,会忘记给在这种配置下无效的成员赋值,导致其值在允许的范围之外,这时候就会卡在参数检查那儿。
例如,初始化GPIO为输入状态,此时GPIO_Speed是无效的,但GPIO_Init函数内会对所有成员进行参数检查,如果检测到GPIO_Speed是无效值,就不会执行下去了。
LZ可以看看那两个函数内有没有类似的情况。 我是进来取精的…………! 楼主用的什么软件,感觉MDK总是会出现莫名其妙的问题,还是IAR稳定点 {:lol:} 奇怪,楼主的main()写成了mian(),居然编译通过,执行正常? bailao99 发表于 2013-9-14 14:04 static/image/common/back.gif
奇怪,楼主的main()写成了mian(),居然编译通过,执行正常?
应该就是这个的问题了{:lol:} 我也遇到过类似问题,定义全局变量a导致不相关的函数b崩溃。后来发现b里面有sscanf函数,将值输入到一个16位变量,但是sscanf里面%d是32位整型,运行到这部后导致其他全局变量被修改。 有可能是内存越界 bailao99 发表于 2013-9-14 14:04 static/image/common/back.gif
奇怪,楼主的main()写成了mian(),居然编译通过,执行正常?
好犀利的眼神啊,这都被你看出来了,佩服佩服!!! bailao99 发表于 2013-9-14 14:04 static/image/common/back.gif
奇怪,楼主的main()写成了mian(),居然编译通过,执行正常?
厉害!!!
页:
[1]