STM8L的RAM与内存模型

STM8LRAM与内存模型

一、RAM空间

在内存映射图上可以看到STM8LRAM划分为2部分,如下:

2KRAM空间包含513个字节的Stack,经过深入研究发现,其实RAM被划分为:short rangelong rangestack3个部分。如下:

STM8L的RAM与内存模型_第1张图片

可以在STVD中通过project setting设置上述3部分的大小,具体如下:Project->Settings->linker->input:

STM8L的RAM与内存模型_第2张图片

Short range空间的最大值是256个字节,库函数有时也会占用几个字节,因此,在此区定义变量时要特别小心,如果越界,编译器提示如下错误:

#error clnk Debug\test.lkf:1 segment .ubsct size overflow (6)

 The command: "clnk -m Debug\test.map -l"D:\Program Files\COSMIC\Lib"  -o Debug\test.sm8 Debug\test.lkf " has failed, the returned value is: 1

exit code=1.

此错误说明段.ubsct超出6个字节,段.ubsct表示在short range内存中未初始化的数据。

Long range的空间根据需求配置,如果数据大小超出范围,编译器提示如下错误:

#error clnk Debug\test.lkf:1 segment .bss size overflow (1)

 The command: "clnk -m Debug\test.map -l"D:\Program Files\COSMIC\Lib"  -o Debug\test.sm8 Debug\test.lkf " has failed, the returned value is: 1

exit code=1.

此错误说明段.bss超出1个字节,段.bss表示在long range内存中未初始化的数据。

Stack是从RAM的最高字节开始的,因此Stack空间为RAM的最高值与long range的最高值之间的差,一方面stack空间不能定义的太小,另一方面,不要定义太大的局部变量,局部变量一般存放在stack中。

另外,如果使用long range,还需要修改Project->Settings->C Compliler中的一项内容,如下:

STM8L的RAM与内存模型_第3张图片

如果Memory Models设置为short stack模式,则寻址空间只能达到256bytes,此模式下只能使用short range部分,因此如果要使用long range部分,应当设置为Long Stack模式。

二、内存模型

根据代码空间的大小,在工程配置中,可以使用不同的模型。对于代码空间小于64K的情况,可以使用mods0modsl0;对于代码空间大于64K的情况,可以使用modsmodsl

1、代码空间小于64K

函数指针和数据指针默认使用@near2bytes)。

1)、mods0:全局变量默认定义在short range区,可以使用@near把全局变量显示定义的long range区。如:

unsigned char dat1[10];//数据存放在short range

@near unsigned char dat2[10];//数据存放在long range

2)、modsl0:全局变量默认定义在long range区,可以使用@tiny把全局变量显示定义在short range区。如:

unsigned char dat1[10];//数据存放在long range

@tiny unsigned char dat2[10];//数据存放在short range

2、代码空间大于64K

函数指针默认使用@far3bytes),数据指针默认使用@near2bytes),可以使用@far把数据指针显示设置为3bytes

1)、mods:全局变量默认定义在short range区,可以使用@near把全局变量显示定义的long range区。如:

unsigned char dat1[10];//数据存放在short range

@near unsigned char dat2[10];//数据存放在long range

2)、modsl:全局变量默认定义在long range区,可以使用@tiny把全局变量显示定义在short range区。如:

unsigned char dat1[10];//数据存放在long range

@tiny unsigned char dat2[10];//数据存放在short range

你可能感兴趣的:(嵌入式开发)