英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

标题: PIC C语言的RAM使用,PICC使用 [打印本页]

作者: kingman    时间: 2009-4-18 17:39
标题: PIC C语言的RAM使用,PICC使用
PICC的RAM使用> (1)当我编译一个PICC程序时出现以下错误:
Can't find space for psect rbss_0 in segment BANK0 (error)>这就将是什么意思?
这表明你已经耗尽了RAM的BANK0的空间(从rbss_0的名字来判断的)。在不同的环境下,还有可能会出现类似的
COMBANK空间不够的报错。在这些情况下,你可能需要把一些变量移到BANK1,2或者3,你可以在全局变量声明时加上,限定词前缀(bank1,bank2,bank3)的方法来做这些移动,例如:bank1 int fred;
自然地,你应该尽量把经常会访问的变量组合在一起并放到同一个BANK(译者注:这有利于缩减代码和提高代码执
行速度)。但是,你不能对局部变量,函数或其参数使用bank限定词。还有,你不能对位变量使用此限定词。
另外,对于指针要注意,例如:
bank2 char * p;
这是一个指向BANK2的字符型变量的指针,但是这个指针本身还是位于BANK0的。
如果换成下面的方式声明:
bank2 char * bank1 p;
这是一个指向BANK2里字符型变量的指针,但是这个指针本身位于BANK1。
(2)为什么编译器不自动地开始使用BANK1,而非要我设置呢?等等类似问题。
因为编译器可以让你把各自独立地编译的目标文件连接起来生成代码,不到连接的时候,你不太可能确认使用资源
是否匹配,而在连接的时候再来重新分配变量到另一个BANK里去已经为时已晚。如果代码产生器在产生代码时,不
去考虑变量在哪一个BANK,那么它产生的代码势必是在每一次RAM访问前,都要加上BANK选择和复位的指令-这完完
全全是不可能接受的。
当某一个模块被编译了,此时试图去猜测BANK0是否溢出了几乎是不可能的。-因为一点点小的函数调用表的变化就
会显著地改变变量分配的需求。
基于这些原因,我们得出结论,除了用户自己来指定BANK之外,没有另外可行的变通方法。

(3)我看了使用手册但对什么东西放到哪里了还是不很清楚。
> 你可以指导我究竟RAM是如何被组织的吗?
BANK0是被用来放任何(非常量)变量,他们包括:
        1)局部变量
        2) 静态或全局变量,以及没有指定到其他BANK去的变量
        3)中断现场保护用的寄存器
        4)临时位置(如果芯片有common RAM,这些通常位于这里,译者注:Common RAM即Share Bank,
就是相互地址映射的一段RAM,详见单片机数据手册)
任何一个被明确指定BANK的变量将肯定放到那个BANK里去,局部变量(例如,函数里的不是静态的变量)不能被分

配到其他BANK里去





欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://www.enroobbs.com/) Powered by Discuz! X3.2