环境介绍:
开发软件:keil4
硬件:STM32F107
开篇杂谈:
写下这篇文章,已经有段时间没有来自己的博客分享自己在工作中遇到的问题了。每当自己想写分享的时候,都是自己再项目中遇到了困扰自己的问题,最后解决问题后的分享之 谈。对于一个还未毕业的实习嵌入式开发的我来说,自己的知识面也有限。自己在分享的过程中有什么错误的地方,希望大家予以指正。自己每篇文章,哪怕对大家有一点点帮助,对于自己来说都是莫大的推动力。自己也始终相信,互相分享交流大家才会一起进步。
问题描述:
这几天开始了公司的一个新项目,自己在组建项目底层驱动写到falsh芯片的数据存储的时候出现了问题。这里自己写了一个读写falsh芯片一个扇区的测试代码。这里打印调试发现读写都成功了,但是代码跑到后面就跑飞了(也就是死机了)。代码当时跑飞在测试段代码后面的Lwip初始化的代码段里。奇怪的是,当我把这个测试的位置放在Lwip初始化代码后面,程序会跑起来,但是过了十几秒还是会出现跑飞的现象。对于这种现象自己的心情是崩溃的,下面这张图片来表达下自己的心情,相信每个程序 员碰到这样的问题时内心都是拒绝的。虽然内心是拒绝的,但是还是得拿起家伙冲进BUG堆中奋战。
问题发现:
通过不断的调试自己发现问题出现在了下面这段代码中,代码当时不是死在这个地方也让我找了很久,其实最后问题解决了自己也感叹自己C语言的功底还是不够啊!自己还是要加强C语言的学习啊!骚年革命尚未成功,同志仍需努力啊!自己早些时候在看C语言的书籍的时候就看到这样一句话“作为一个嵌入式开发人员,如果没有内存分配的概念,而只会C语言永远只是一个普通的 程序员”,这次遇到这个问题,对这句话现在是深有体会啊!下面直接给出我的问题代码:
#define MEM_SECTOR_SIZE 4096
u8 MX25_TEST(void)
{
u16 i;
u8 tmp_buf[MEM_SECTOR_SIZE];
app_trace_log(“Read Sectorrn”);
Mem_Sector_Read(1, tmp_buf);
app_trace_dump(tmp_buf,5);
app_trace_log(“Write Sectorrn”);
for(i=0;i《MEM_SECTOR_SIZE;i++)
tmp_buf[i] = i%256;
Mem_Sector_Write(1, tmp_buf);
memset(tmp_buf, 0x55, MEM_SECTOR_SIZE);
app_trace_log(“Read Sectorrn”);
Mem_Sector_Read(1, tmp_buf);
app_trace_dump(tmp_buf,5);
for(i=0;i《MEM_SECTOR_SIZE;i++)
{
if(tmp_buf[i] != (i%256))
break;
}
if(i《MEM_SECTOR_SIZE)
{app_trace_log(“Sector OP ERR”);
return 1;
}
else
{ app_trace_log(“Sector OP OK”);
return 0;
}
}
问题解决:
这里最后发现是由于局部变量带来的问题,局部变量当我在函数中定义使用这个变量的时候系统分配了一个临时的内存,当函数 运行完这个变量的内存就会被释放掉。这里我们都知道这样一个原理,但是需要大家注意的是。当我们开发的微控制器的内存有限 的时候,用来分配这个临时内存更是有限的。当我们这个时候定义了一个很大的临时变量,这个时候我们的系统就崩溃了。这里值 得结合微控制器的内存分配的机制多加揣摩,相信会学到很多。大家这里在以后开发的时候,一定要注意这个不起眼的局部变量 了。下面直接给出解决代码段。
解决办法一: 使用static关键字定义大数组的局部变量
解决办法二:将数组的局部变量放在函数外定义
其实这两种方法的最后的底层操作效果,都是让这个变量的内存分配发生了变化,变量不会在使用之前有限的临时内存段。这里自己也在不断的查阅书籍,不断学习这里关于底层详细的知识点,自己后续也会不断的更新和加强。这里也希望对这一块很是了解的朋友可以再微博评论栏写写你的分享,让我们也跟着学习学习。当然您也可以加入这个嵌入式交流群469602418,和同行更多的朋友一起交流。
#define MEM_SECTOR_SIZE 4096
//u8 tmp_buf[MEM_SECTOR_SIZE]; //解决办法二
u8 MX25_TEST(void)
{
u16 i;
static u8 tmp_buf[MEM_SECTOR_SIZE]; //解决办法一
app_trace_log(“Read Sectorrn”);
Mem_Sector_Read(1, tmp_buf);
app_trace_dump(tmp_buf,5);
app_trace_log(“Write Sectorrn”);
for(i=0;i《MEM_SECTOR_SIZE;i++)
tmp_buf[i] = i%256;
Mem_Sector_Write(1, tmp_buf);
memset(tmp_buf, 0x55, MEM_SECTOR_SIZE);
app_trace_log(“Read Sectorrn”);
Mem_Sector_Read(1, tmp_buf);
app_trace_dump(tmp_buf,5);
for(i=0;i《MEM_SECTOR_SIZE;i++)
{
if(tmp_buf[i] != (i%256))
break;
}
if(i《MEM_SECTOR_SIZE)
{app_trace_log(“Sector OP ERR”);
return 1;
}
else
{ app_trace_log(“Sector OP OK”);
return 0;
}
}