keil中的 Use MicroLIB

首先说明下什么是MicroLIB,还是给大家看英文吧,当阅读学习了。

MicroLib is a highly-optimized library for ARM-based embedded applications written in C.  When compared to the standard C library included with the ARM Compiler toolchain, MicroLib provides significant code size advantages required for many embedded systems.

更详细的解释请直接去引用的网站吧:

http://www.keil.com/arm/microlib.asp

 

使用它后问题出现了,给函数中的数组赋值,结果不相关的全局变量居然也被赋值了。取出地址查看,原来重叠了,keil居然会出这种大bug吗,而且已经是4.71的版本了。

之后实验了两个地方,发现问题原因了。

第一,增加那个*.s的文件里面的Stack size,足够大到可以容纳所有全局变量、函数入口、函数内部变量,这样就可以解决以上问题。

第二,去掉那个 Use MicroLIB,也可以解决问题。

 

问题原因,含部分猜测:Use MicroLIB把函数内部的数组是放在Stack中的,这个Stack是循环使用的。而标准C库,估计采用了某些其它算法,把函数内部的大数组,放到了其它位置。

 

给出一个出错的例子,有时候,我们总是喜欢把错误推给别人,其实大部分都是自己的。

定义Stack = 0x400

Use MicroLIB 打钩

 

写下面函数实验,stm32的一些变量库

 

u8 test1[1024];

 

void TestFunc1(void)
{
 u8 test3[1024];
 u16 i;
 for(i=0;i<1024;i++)
 {
  test3[i] = 0x55; //这个地方赋值,test1会跟着一起变,有趣吧
 }
}

 

void TestFunc(void)
{
 u8 test2[1014];
 test2[0] = 1;
 TestFunc1();
}

 

int main(void)
{
 memset(test1, 0xaa, 1024);
 
 TestFunc();

 

}

 

本文结束elecsea(C),引用注明出处。

 

 

 

你可能感兴趣的:(keil中的 Use MicroLIB)