STM8L的RAM与内存模型
一、RAM空间
在内存映射图上可以看到STM8L的RAM划分为2部分,如下:
2K的RAM空间包含513个字节的Stack,经过深入研究发现,其实RAM被划分为:short range、long range、stack这3个部分。如下:
可以在STVD中通过project setting设置上述3部分的大小,具体如下:Project->Settings->linker->input:
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中的一项内容,如下:
如果Memory Models设置为short stack模式,则寻址空间只能达到256bytes,此模式下只能使用short range部分,因此如果要使用long range部分,应当设置为Long Stack模式。
二、内存模型
根据代码空间的大小,在工程配置中,可以使用不同的模型。对于代码空间小于64K的情况,可以使用mods0或modsl0;对于代码空间大于64K的情况,可以使用mods或modsl。
1、代码空间小于64K
函数指针和数据指针默认使用@near(2bytes)。
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
函数指针默认使用@far(3bytes),数据指针默认使用@near(2bytes),可以使用@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