打印
[STM8]

这是怎么回事

[复制链接]
14777|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
segment .bsct size overflow (911) segment .ubsct size overflow (436)
代码编译后出现以上错误
高手帮分析下,由于本人是新手,不知这个出错在哪?
代码可以保证在32K以内(我使用的是STM8S105C6)
沙发
汉之云| | 2009-9-17 15:46 | 只看该作者
这个是RAM冒了,不是FLASH的容量不够 不知道你用什么样的MEMORY MODEL,试试STACK LONG. 在project setting 里面改

1.JPG (20.21 KB )

1.JPG

使用特权

评论回复
板凳
young_xyj|  楼主 | 2009-9-17 17:22 | 只看该作者
2# 汉之云 谢谢,按照你方法解决了问题,但是出现了bss size overflow
这又是什么原因!谢谢大侠

使用特权

评论回复
地板
young_xyj|  楼主 | 2009-9-17 18:00 | 只看该作者
大侠们,帮帮小弟,看看是什么原因引起的啊?
segment .bss size overflow

使用特权

评论回复
5
汉之云| | 2009-9-17 20:45 | 只看该作者
memory model还用stack long, 然后看segment .bss size overflow了多少个(假设n个),只要n<255,就比较好办。
办法是:挑n个全局变量,将它们的定义和声明前面添加 @tiny ,这样将把这些变量定义在0~0xff中。

说明:
stack long默认将变量放在0x100以后(@near)。stack short默认将变量放在0xff以内(@tiny)。如果变量比较多,单放在那边都不够,可以强行指定其存放空间(加@tiny或@near)。

使用特权

评论回复
6
young_xyj|  楼主 | 2009-9-18 10:43 | 只看该作者
非常感谢你的帮助,问题的解决办法应该 就是这个了,但是我想多问一句,这个变量的数量有限制吗?因为我的一个系统内肯定有很多变量的啊。
还有就是只要是全局变量都要进行@tiny 或是@near定义?
为什么@tiny  u8 g_temp[30];就会出错,说编译不成功

使用特权

评论回复
7
香水城| | 2009-9-18 10:55 | 只看该作者
变量以@near定义表示要求分配该变量在0x0100~0xFFFF之间的存储空间。

变量以@tiny定义表示要求分配该变量在0x0000~0x00FF之间的存储空间。

不管哪段存储空间,大小都是有限制的。因为你之前在@near空间分配的变量太多,所以5楼才建议你挑几个变量放到@tiny空间,但如果你在@tiny空间分配太多变量,当然编译不能成功。

使用特权

评论回复
8
grant_jx| | 2009-9-18 12:35 | 只看该作者
STM8号称Flash是线性地址分配,为什么COSMIC偏要搞出一个分页,搞得客户问我为什么RAM、ROM这么大,编译器为什么不会学会自动分配空间,我无语了。

使用特权

评论回复
9
香水城| | 2009-9-18 13:37 | 只看该作者
STM8继承了ST7的指令系统,在这套指令系统中采用不同的指令操作地址段0x0000~0x00FF(tiny)和地址段0x0100~0xFFFF(near),操作处于tiny变量的指令比操作near变量的指令具有更高的效率(指令长度短、执行时间短),位操作指令也只能作用于tiny变量。

这就是为什么要分段的原因。

当然如果编译器足够聪明,它可以自动地把最常用到的、需要进行位操作的变量分配到tiny段,把其它变量分配到near段,可惜这个编译器做的不够好,需要用户的人工干预。

使用特权

评论回复
10
young_xyj|  楼主 | 2009-9-18 16:13 | 只看该作者
我的项目以前是用三星的830,现在移植到ST这颗芯片上发现RAM不够啊,同样是2K的最高容量,这是什么原因啊,所以问问大侠们:怎样看代码用了多少RAM?还有是否有哪里设置的原因?

使用特权

评论回复
11
香水城| | 2009-9-18 16:16 | 只看该作者
.map文件中可以看到变量的分配情况和存储器(RAM和Flash)分配的数目。

使用特权

评论回复
12
young_xyj|  楼主 | 2009-9-21 11:28 | 只看该作者
[img][/img]

使用特权

评论回复
13
young_xyj|  楼主 | 2009-9-21 11:35 | 只看该作者
我的项目原来用51的芯片,KEIL编译后:
Program Size: data=38.1 xdata=878 code=28881
但是现在我移植到105c6后,编译:
#error clnk Debug\sy5158ce121.lkf:1 segment .ubsct size overflow (5)
#error clnk Debug\sy5158ce121.lkf:1 segment .bss size overflow (41)
#error clnk Debug\sy5158ce121.lkf:1 segments .ubsct (0x0-0x105) and .data (0x100-0x58f) overlap
The command: "clnk -lC:\STM8S\CXSTM8\Lib  -o Debug\sy5158ce121.sm8 -mDebug\sy5158ce121.map Debug\sy5158ce121.lkf " has failed, the returned value is: 1
exit code=1.
105C6有2K的RAM,但是按照51的编译,RAM应该是足够的,但是为什么这里会出现上面出现的问题的。搞了很久没有搞明白问题会出在哪里。
版主,大侠们救救我这菜鸟啊,项目赶得急,在此先谢谢了!

使用特权

评论回复
14
young_xyj|  楼主 | 2009-9-21 11:36 | 只看该作者
补充,现在.MAP文件都没有产生啊,所以我也无法看内存的分配情况

使用特权

评论回复
15
香水城| | 2009-9-21 13:52 | 只看该作者
你的堆栈是不是设置的太大了,占用了很多RAM空间?

使用特权

评论回复
16
young_xyj|  楼主 | 2009-9-21 16:55 | 只看该作者
谢谢,今天在同事的帮助下解决了问题!
现在原因写在这,希望和我一样的菜鸟不会犯这个错误。
其实就是:如何将一个表放到ROM里去。
解决:
keil有code关键字方便的指定;STVD中用const,它会自动优化到rom里面。

这个东西其实在其他的论坛上有过发表,一直没注意!
呵呵,谢谢这几天版主和大侠们的帮助!

使用特权

评论回复
17
IJK| | 2009-9-21 17:21 | 只看该作者
const

const 应该是C的关键字,跟IDE(STVD)以及C编译器没什么关系。

使用特权

评论回复
18
xuannin| | 2009-9-22 20:50 | 只看该作者
10楼:怎样看代码用了多少RAM?
在debug的.map文件中可以看到,而且要计算,这也是cosmic讨厌地方之一!

使用特权

评论回复
19
young_xyj|  楼主 | 2009-9-24 14:42 | 只看该作者
借avr-size来显示stm8代码大小。
Post-Build加上:
avr-size $(OutputPath)$(TargetSName).elf

avr-size Debug\demo.elf
   text    data     bss     dec     hex filename
  27580       7      92   27679    6c1f Debug\demo.elf

使用特权

评论回复
20
stvoe| | 2015-8-30 09:54 | 只看该作者
好贴,受益了,谢谢!

使用特权

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

本版积分规则

9

主题

30

帖子

1

粉丝