编译PIC程序时RAM使用

描述

(1)问:当我在编译一个PIC的程序时得到这样的报错:

::Can't find space for psect rbss_0 in segment BANK0 (error)

这究竟是什么意思?

答:它说明你已经用完了RAM bank0的空间,而且空间还不够(由rbss_0名称得出)。在不同的情况下,这样的报错也可能是提到class COMBANK的。出现这种报错,你可能需要做的是,要移动一些变量到bank1,2或3。

你可以在一些全局变量的声明前加上一个前缀限定符,像bank1,例如:

bank1 int fred;

当然,你应该把会经常访问的变量归为一组,并且放置到同一个bank。你不能够对局部变量、函数的参数来使用bank限定。对于位变量使用bank限定也是可以的。但是,对指针使用bank限定一定要当心,例如:

bank2 char * p;

这是一个指向bank2内char型数据的指针,这个指针本身(p)还是在bank0里的。

下面这个声明:

bank2 char * bank1 p;

这是一个指向bank2内char型数据的指针,但指针本身是位于bank1里的。

(2)问:为什么编译器不会自动地开始使用bank1、2、3呢?

答:因为你可以把各自独立编译的目标文件链接到一起,在链接之前是不太可能知道所有的东西是否在存储空间里放得下,到链接时再来重新分配变量到其他bank已经为时太晚了。如果代码产生器是用不假定某一个变量位于哪个bank的方式来产生代码,那么它将不得不在每一个RAM访问之前和之后,都要产生设置和重设 bank选择位的指令,这将是一个完全不能接受的编译结果。

即使是尝试对bank0是否溢出做最好的猜测,对于一个将被编译的模块来说也是近乎不可能的——函数调用图的一点点微小的变化就可能很大程度地改变变量分配的需求。

基于这些原因,我们总结出,除了要求用户指定bank之外暂时没有可行的替代方案。(译者注:这里基本都是针对PICC STD版本而言的,对于PRO版本,因为编译模式根本改变,前面提到的(1)(2)问题都得到了解决。)

(3)问:我读了手册还是不能确切地知道什么东西去了哪里。你能告诉我究竟RAM是怎么来组织的吗?

答:Bank0是给非const变量使用的,它们有:

1) 局部变量;
    2) 静态或者全局的变量,没有用限定符指定到其他bank的;
    3) 中断寄存器保护;
    4) 临时位置(它们将尽可能地被放置到common RAM)。

明确地用bankx限定的东西(不包括局部变量和函数参数)会被放到相应的bank。局部变量(例如:函数内部的不是静态的变量)是不能够被分配到其他bank去的。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分