深圳市智创电脑培训有限公司
18026990143
深圳市智创电脑培训有限公司
店铺信息
店铺名称
 :
深圳市智创电脑培训有限公司
店铺地址
 :
深圳宝安福永
标签
 :
联系电话
客服
 :
18026990143查看

首先说一下 MCU 的存储器组织。

MCU 中常使用的存储器类型有:FLASH、RAM、ROM(包括EEPROM)

在软件角度来看,程序和数据的存储分为以下几个部分:

软件存储区与硬件存储器类型是怎么对应的呢?

一般来讲如下:

注:

1.MCU 中的 ROM 通常用于存储制造商信息、控制器型号等信息;

2.对于 x86 体系结构的系统,因为没有 Flash 类型的存储器,所以,所有的软件存储区最终都加载到内存中,但是其内存是分段的,用户对不同内存段的访问权限不同,其代码段和常量段不可以被用户修改,如果意外修抛出段错误异常。

知道了存储器类型和各存储区的划分之后,让我们来看以下三组程序:

1.

static void ProcStr(void)


这段程序中,Str[] 是一个局部数组,其大小为 6,占用的堆栈空间是 2 个字符 是常量,被存储在常量段;Str[] 的初始化过程,相当于从常量区拷贝 6 个字符的数据到栈中,这 6 个字符是""。

2.

static void ProcStr(void)


这段程序中,Str[] 是一个局部数组,其大小为 6,占用的堆栈空间是 2 个字符 是常量,被存储在常量段;Str[] 的初始化过程,相当于从常量区拷贝 6 个字符的数据到栈中,这 6 个字符是 ""。

3.

static void ProcStr(void)

const uchar* Str = "12345";

这段程序中没有数组,唯一的 Str 是一个局部指针,其大小为 4(在 32 位系统中),因此这段程序只占用 4(在 32 位系统中) 个字符的堆栈空间是常量,被存储在常量段;Str 的初始化过程,是将指针 Str 初始化为常量"12345"的,后续程序通过指针 Str 直接访问常量段,无需内存拷贝过程。

从以上分析可以看出,前两种方法是一样的,都需要为局部数据分配存储空间,并将静态存储区的数据拷贝过来,而最后一种方法是通过指针直接访问静态数据而无需拷贝。如果字符串长度大于系统中指针的长度,第三种方法将在时间和空间上大大优于前两种方法(第三种方法极大的节省了堆栈空间,并减少了拷贝数据所用的时间)。

但是,对于 MCU 来说,并不总是第三种方法好,原因在于第三种方法是直接访问常量段,由上面的表可知,对于将常量存储于 Flash 的 MCU 来说,访问常量段要比访问 RAM 慢得多。因此,如果接下来要频繁访问这个字符串,那么,采用前两种方法在速度上将会更优一些,理由是前两种方法只需要访问一次 Flash,而第三种方法则每次都需要访问 Flash。

当然,如果在接下来的程序中,需要修改字符串 Str 中的内容,那就只能采用前两种方法,第三种方法将会提示错误。

说明:这里说的一些内容跟编译器的特性相关,不同编译器,甚至相同编译器的不同版本间存在一定差异。

  • 嵌入式程序开发之存储器类型与存储区划分,字符串与RAM占用