STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored

在连续整了一个下午,一个晚上,又一个上午之后终于可以用STVD调试了!以此来纪念一下。

单片机时STM8AF5189,工程是人家编译好的,结果拿到手里编译后发现s19文件变大了不少,而且里面的地址出现了一些0x0000开始的地址,正常情况下应该是从0x8080开始才对,最开始的感觉就是编译器配置问题,在改了若干项配置,包括优化等等,还是不能仿真,debug时提示swim communication error,在排除了硬件问题之后,感觉是软件问题。经历了长时间折腾后打算用IAR,结果换用IAR问题又是一大堆。无奈又回头折腾STVD,偶然的发现,可能是c编译器的问题,也就是COSMIC的问题,当时用的是从网上下的一个,没注意有代码限制。后来从网上找到一款切实不错的COSMIC,安装完成后,打上补丁,可以debug了,s19文件里的地址也正常了。

下载地址:链接:http://pan.baidu.com/s/1hrK4iyw 密码:j5z8

在此继续杂记一些东西。

STM8AF5189,LQFP64封装有CAN,64K flash,4096B RAM,2048B EEPROM,供电3-5.5v。http://www.lierda.com/product/id/149/show.html

很多人选用STVD+COSMIC做为stm8 系列MCU产品开发的IDE,在编译调试过程中常常遇到些问题。这里我稍加整理,分享几个硬件线路和软件语法以外的话题。抛砖引玉,细节请自行研究相关手册。

一、零页内存区出界溢出的问题。

对于这个问题一般会提诸如bsct/ubsct size overflow……


这个提示告知默认的零页区放不下现有全局变量或静态变量,导致溢出。这里的RAM零页数据区,即00-0xff区域。至于BSCT/UBSCT是什么意思在COSMIC 编译手册里有讲。关于各STM8芯片的存储分配请看数据手册里的MEMORY MAP.

STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored_第1张图片

上面截图来自于COSMIC 里的编译手册里的相关描述

STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored_第2张图片

上面截图来自于STVD+COSMIC 编译环境的相关配置页面。

解决这个问题比较简洁的办法有两种:

1、把大部分全局变量或静态变量前冠以@near, 保留部分使用频繁的数据在零页区;

STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored_第3张图片

上面截图来自于COSMIC 里的编译手册里存储模式的相关描述。


2、 在编译配置那里将堆栈模式改为长堆栈模式,数据默认放在0x100以上的区域,把需要放在0页区的变量前冠以@TINY。操作如下图所示。

STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored_第4张图片

二、数据存储区溢出话题。

数据存储区溢出是指除了堆栈的以外的RAM空间不足以存放现有全局变量或静态变量。一般有诸如.DATA/.BSS size overflow的提示。

STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored_第5张图片

如下图,红色RAM空间存放各种全局变量或静态变量,灰色区用作堆栈。

STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored_第6张图片
上面截图来自于STM8S参考手册里的相关描述。

假设现有变量数据不能压缩精简,那就尝试将堆栈区域压缩。比方将下图中的0x1ff改为0x2ff,具体改多少要结合你实际应用和芯片本身RAM空间大小,满足需求就好。当然如果RAM空间跟你实际需求相差甚远,自然得想别的办法了。

STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored_第7张图片

顺便提下,STM8的堆栈是向下生长的,或者是从高位地址往低位地址压入数据的。起始栈顶一般默认为RAM最大地址处。

三、一个跟程序代码编译优化有关的话题

ST官方也为STM8各系列提供了参考标准外设固件库,里面有大量的外设操作库函数。在利用库函数编程时,有时会发现并没有写几句代码,结果生成的目标文件很大,明显不太正常。这个可能在C Compiler的优化那个地方选择不合适,要打开SPLIT选项。

下面有两幅图,找了个简单例程测试下。main()里就一个GPIO读端口,外加TIM1 的默认设置函数和配置函数。

没打开SPLIT选项时,生成的程序代码为4965 Byte,打开SPLIT选项后生成的程序代码是548 Byte,二者的常量代码均为124 Byte。很明显,开与不开相差甚远。

STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored_第8张图片

上图是优化配置里的SPLIT项关闭时的情形。

STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored_第9张图片

上图是优化配置里的SPLIT项打开时的情形。

注:

1、关于SPLIT选项的说明,COSMIC手册里有描述。

2、开与不开SPLIT项的机器码文件大小差别也得看你具体调用的库函数和实际应用,并非总是跟上面的例子那样悬殊。

四、中断矢量文件话题。

一般来说,不论你自己新建工程还是利用ST官方库的模板建立工程,项目里总会自动生成一个中断矢量文件 stm8_interrupt_vector.c。这里面其实就是放的一个常量表,即STM8芯片各个中断矢量的入口地址。

STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored_第10张图片
有的人希望使用自己的中端矢量名字,想把这个stm8_interrupt_vector.c拿掉,比方说改换为vector.c 。发现怎么改都不行。每次改完编译,stm8_interrupt_vector.c如幽灵般的又回来了。

其实,这里是可以修改的,但要LINKER 配置的那个地方同步修改,就像下方图示那样。好奇的话可以去试试。

STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored_第11张图片
另外,不建议在这个矢量文件里写中断函数或其它函数,不然有时可能会出现些让你找不着北的奇怪问题。

五、断言函数出错提示问题。

这个问题一般是刚接触STM8开发的人使用库过程中才遇到的。他把main.c里的void assert_failed(uint8_t* file, uint32_t line) 函数体删掉了导致的。

一般出错时有如下提示:


这个函数作什么用就不用解释了,建议你先不要急于删它。不想要时,就在stm8s_conf.h文件里把#define USE_FULL_ASSERT (1)注释后即可删除相关代码。


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