打印
[STM8]

【转】STM8L的RAM与内存模型

[复制链接]
1075|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
焚琴煮鹤|  楼主 | 2016-11-2 23:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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


沙发
超超呼叫乐乐| | 2016-12-21 17:53 | 只看该作者
你好,读完你的[STM8] 【转】STM8L的RAM与内存模型这篇帖子后,我在某个.c程序中定义了如下类型的变量:unsigned int TINY aa; 在.h文件中声明extern unsigned int TINY aa;
然后我在主程序中把aa这个变量赋给bb,但是编译的时候报错 declaration is incompatible with "unsigned int __tiny aa" 。
我想问一下,是否定义的变量只能在本.c文件中使用,不能在其他文件中使用?

使用特权

评论回复
板凳
heisexingqisi| | 2016-12-21 18:56 | 只看该作者
没想到除了使用默认的配置外,还可以自己设置。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

106

帖子

3

粉丝