打印

stm8问题

[复制链接]
11200|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tantao820629|  楼主 | 2009-7-3 11:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8, ADI, IO, kd, ov
请教一下
  我在使用stm8s103k3芯片的时候定义了一个数组后提示:
   #error clnk Debug adiogram.lkf:1 segment .bss size overflow (1)
  我看了一下内存我才用300字节左右,根本没有超出范围,是不是哪里没有设置???
沙发
汉之云| | 2009-7-3 12:08 | 只看该作者

把数组长度改小一个字节,让其编译成功,

然后再看.map, 就知道内存分配的情况了

使用特权

评论回复
板凳
tantao820629|  楼主 | 2009-7-3 12:36 | 只看该作者

stm8问题

改小我试过了是可以的!下面是.map文件(改后缀.map)
请指教!!!
相关链接:https://bbs.21ic.com/upfiles/img/20097/200973123235117.rar

使用特权

评论回复
地板
汉之云| | 2009-7-3 13:58 | 只看该作者

.LKF也要发上来


 

使用特权

评论回复
5
tantao820629|  楼主 | 2009-7-3 14:08 | 只看该作者

.LKF

麻烦你了,比较急,在线等!!
相关链接:https://bbs.21ic.com/upfiles/img/20097/20097314425476.rar

使用特权

评论回复
6
汉之云| | 2009-7-3 14:23 | 只看该作者

可以试试下面方法

.lkf中
+seg .data -b 0x100 -m 0x100 -n .data 
+seg .bss -a .data -n .bss


意思是.data (初始化了的&分配到0页以外的变量)从0X100开始(-b 0x100),最大长度为0X100(-m 0x100 ,即到0X200)
.bss((没有初始化的&分配到0页以外的变量)跟在.data后面(-a .data )长度在.data规定的地址范围之内

你报的错:segment .bss size overflow (1),所以,你可以把-m 0x100改大一点,比如-m 0x130.

同时要注意这么做的风险: 你的STACK的可用范围变小了(从0x200~0x3FF 变成c从0x230到0x3FF). 但你如果没有中断嵌套以及没有很深的程序嵌套以及没有在一个函数内部有超多的变量或函数参数,(这些都是要占用堆栈的),就没事

同时从你的.MAP中,可以看到,
start 00000009 end 0000005e length    85 segment .ubsct
start 00005e:0 end 000063:5 length    45 segment .bit, initialized
在0xff以内,0x64~0xff是没有分配变量的,如果还有变量需要分配,可以放在这里.

使用特权

评论回复
7
tantao820629|  楼主 | 2009-7-3 15:03 | 只看该作者

感谢 汉之云

我也大概理解你说的意思!
  这颗芯片RAM是1K的RAM 堆栈默认就占去512字节
  现在您的意思是把堆栈改小,空出更多的内存供程序使用,
  但我应该在那改堆栈大小呢!在.lkf里直接改吗?

使用特权

评论回复
8
汉之云| | 2009-7-3 15:09 | 只看该作者

可以在STVD 的IDE里改

project - setting - linker -category(input)
把Ram的空间改大一些

使用特权

评论回复
9
香水城| | 2009-7-3 15:10 | 只看该作者

STVP中有一个配置窗口可以配置的

包括6楼说的修改lkf文件和堆栈的大小。

我手头没有安装STVP,不记得在哪个菜单下,你可以找找,应该很容易找到,我以前曾经贴过这样的图片如下:

使用特权

评论回复
10
tantao820629|  楼主 | 2009-7-3 15:20 | 只看该作者

感谢 香水城 汉之云

现在可以了!呵呵!!非常感谢!

使用特权

评论回复
11
tantao820629|  楼主 | 2009-7-3 18:07 | 只看该作者

追问一个问题


同时从你的.MAP中,可以看到,
start 00000009 end 0000005e length    85 segment .ubsct
start 00005e:0 end 000063:5 length    45 segment .bit, initialized
在0xff以内,0x64~0xff是没有分配变量的,如果还有变量需要分配,可以放在这里.
 
上面这段话我不是很理解?????内存这段地址怎么会空起来??
还有就是从0x00--0x100这段地址编译器为什么不能自动分配使用???
 

使用特权

评论回复
12
香水城| | 2009-7-3 18:39 | 只看该作者

在STM8中,操作0x00~0xff这段地址的指令有更高的效率

从8、9楼贴出的图你可以看出,Ram与Zero Page是分开为2个不同的区段。

操作0x00~0xff这段地址内数据的指令,比操作其它地址的指令有更高的效率,同时位操作指令只能处理在0x00~0xff这段地址中的数据,所以一般编译器会把经常用到的数据(如局部变量等)分配到这个区间,如果用户自己需要用到这个区间,则需要特别指定。

我还没有时间玩这个STM8,没有仔细研究如何把变量特别指定分配到这个区间,但我想发布的例程中应该有对应的操作,你可以按照.map的指示找找。

比如在你给出的.map中,有这么一行:
_WirelessTxFram             0000003f   defined in Debugmain.o section .ubsct
这表示WirelessTxFram这个变量被分配到0x3f这个地址,这个变量出现在main.c中。

使用特权

评论回复
13
tantao820629|  楼主 | 2009-7-4 08:43 | 只看该作者

谢谢 香水城

谢谢香主耐心讲解!!!长见识了!!

使用特权

评论回复
14
tantao820629|  楼主 | 2009-7-4 17:41 | 只看该作者

又有问题请教

 你们好!我有有问题请教了:
 我在写EEPROM的时候字节写没问题,但一次要写字节多了我想采用块写(提高速度),(块大小为64字节)现在就是块写怎么也写不进去!!我的思路是这样的!
   初始化的时候我定义了两个64字节数组,一个在RAM里一个在EEPROM里;
                  uchar   @near   ueeprom[64] @ 0x4000 ; 
                  uchar   @near   AACS140xreadData[64] ;
  然后设置为块写模式
                   FLASH_CR2  |= 1;                
         FLASH_NCR2 &= (uchar)~(1<<0); 
 接下来开些eeprom 锁
                   FLASH_DUKR = FLASH_RASS_KEY2;   
              FLASH_DUKR = FLASH_RASS_KEY1;     
  最后把AACS140xreadData数据一次往eeprom写64字节 
        for(i=0;i<64;i++)
        {
                ueeprom = AACS140xreadData
        }
现在运行这段程序就死机了!我不知道我那里写错了??块写应该怎么写???请指点!!!

使用特权

评论回复
15
tantao820629|  楼主 | 2009-7-6 15:40 | 只看该作者

自己顶!!!!!

高手请指教

使用特权

评论回复
16
tantao820629|  楼主 | 2009-7-6 20:36 | 只看该作者

自己顶

高手在哪??都没人用过吗??

使用特权

评论回复
17
汉之云| | 2009-7-7 09:32 | 只看该作者

要放在RAM里运行

STM8的参考手册里面
  In DATA area
–     Devices with RWW capability: DATA block operations can be executed from main program memory. However the data loading phase (see below) has to be executed from RAM.
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~           
–     Devices without RWW capability: block program operations must be executed totally from RAM. 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

使用特权

评论回复
18
tantao820629|  楼主 | 2009-7-7 21:29 | 只看该作者

具体怎么操作呢??

具体怎么操作呢??
有没有例程参考??

使用特权

评论回复
19
ddmking| | 2009-7-9 16:28 | 只看该作者

ram定义

是在Ram里添加一个“eeprom_pg” section, 加上-ic.

使用特权

评论回复
20
jynkelan| | 2009-7-10 16:57 | 只看该作者

0x00-0xff分配到哪去了

zero page溢出,但又不知道分配到哪去了:
#error clnk Debugsc_demo.lkf:1 segment .ubsct size overflow (296)

使用特权

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

本版积分规则

18

主题

89

帖子

0

粉丝