MCU C语言存储的一些理解

初学MCU,C语言等知识的时候,对总线地址,ROM、RAM,flash,特殊寄存器等等都只是表面理解。突然想总结一下这几年的理解。

RAM:

首先RAM是我们常人理解的运行内存。存储在这里面的内容断电以后就没了,再次上点以后就要重新开始了。
那么我们思考再写单片机程序的时候,哪些东西是掉电以后就没了呢。
自然是我们的变量,但要只是是可以读写的变量哦,如果是只读变量也就是常量是存储在RAM空间的。

那我们再分一下可以读写的变量包含哪些;
不同的关键字修饰它可能就会不太一样。
常用的static变量,全局变量,局部变量这些都是再RAM内,但是RAM可以分为三个区域。堆、栈、静态存储区;

1、堆 由程序员自动分配(malloc)以及释放,这里的释放很关键,一定要在使用完成后释放内存(free)!!!
2、栈 编译器自动分配的,我们的局部变量,函数的一些形参都会存储在这个区域
3、静态存储区:这里存放的就是初始化的全局变量和static修饰的变量,这里注意只要是static修饰的变量都是存放在静态存储区的。

ROM/FLASH

关于ROM和flash,flash是ROM的一种;
所有的常量,只读变量,还有代码都是存储在flash的。

大师匈碰到的问题:

前段时间在用一家国产的MCU,RAM空间比较小。大师兄在做一个加密算法的时候碰到了空间不够用的情况。
通过计算代码的RAM占用情况,应该是够用的,但是结果却不够用。
是因为原厂把flash分为了俩个区域,编译器不能自动分配这俩个地址池。需要加关键字bank去修饰,程序员自己去分配。

还有就是因为编译器做的不好,所以在C语言的情况下,有很多比较方便的写法,但是涉及到直接寻址和间接寻址的关系,需要比较啰嗦,分开去写,效率会更高。印象很深的是要注意不能多次传参,受到他们堆栈级数的约束。

所以要参考他们给到的一些示意例程去写。提高效率合理使用。

国产MCU或者是芯片这方面还需要加油。。。。

猜你喜欢

转载自blog.csdn.net/qq_27854611/article/details/109398359