0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

编译PIC程序时RAM使用

麦辣鸡腿堡 来源:Microchip微芯 作者:Microchip微芯 2023-01-22 16:33 次阅读

(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去的。

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

    关注

    8

    文章

    1367

    浏览量

    114517
  • 编译器
    +关注

    关注

    1

    文章

    1618

    浏览量

    49043
收藏 人收藏

    评论

    相关推荐

    PIC单片机程序设计的基本结构框架

    为了快速掌握PIC单片机源程序的基本结构,这里给出一个典型的程序结构框架。建立源程序时首先用伪指令TITLE提供程序的标题,接着给出整个
    发表于 11-04 17:18 1573次阅读

    编译程序时遇到问题

    小弟单片机新手在编译程序时遇到下列问题,求高手指教!问题截图在图片中,源代码再压缩文件中
    发表于 10-12 17:27

    如何解决编译led_on程序时出现的错误?

    我在编译led_on 程序时出现以下错误,麻烦大家解答一下
    发表于 07-12 01:14

    如何解决使用MPLAB开发PIC无法通过编译的问题

    序用PIC18F46K80作为处理器,MPLABX为IDE,在写完程序时编译无法通过,会报大量的warning、error。经查阅资料和反复安装IDE,得出结果是交叉编译环境安装不对。
    发表于 11-25 06:08

    kendryte编译程序时报错是为什么?

    kendryte编译程序时报错
    发表于 09-14 06:18

    PIC单片机的C编译器(软件)

    PIC单片机的C编译器(软件)
    发表于 10-12 11:00 132次下载

    PIC系列单片机WINDOWS版反编译软件

    PIC系列单片机WINDOWS版反编译软件
    发表于 04-14 15:06 0次下载

    程序时间控制电路图

    程序时间控制电路图
    的头像 发表于 05-08 15:18 1898次阅读
    <b class='flag-5'>程序时</b>间控制电路图

    如何选择PIC单片机的C编译

    PIC单片机的C编译器只有HI-TECH公司出品PICC编译器,和CCS公司的CCS编译器。还有PIC的生产商Microchip公司自行生产
    发表于 03-29 14:09 5351次阅读

    PIC单片机源程序的模拟仿真设计

    要用C语言开发PIC单片机和模拟仿真调试程序,必须有相应的编译器,PICC与PICC18的C编译器是优化的PIC单片机C
    发表于 09-26 15:29 2485次阅读
    <b class='flag-5'>PIC</b>单片机源<b class='flag-5'>程序</b>的模拟仿真设计

    在处理PIC单片机的中断服务程序时需要注意哪些问题

    PIC与51系列单片机一个显著的区别就是:PIC只有一个中断入口地址(为04H),而51有多个中断源。这样对PIC来说,无论发生何种中断程序将自动转移执行04H处的
    发表于 10-28 16:45 2616次阅读
    在处理<b class='flag-5'>PIC</b>单片机的中断服务<b class='flag-5'>程序时</b>需要注意哪些问题

    使用MPLAB开发PIC无法通过编译的问题

    序用PIC18F46K80作为处理器,MPLABX为IDE,在写完程序时编译无法通过,会报大量的warning、error。经查阅资料和反复安装IDE,得出结果是交叉编译环境安装不对。
    发表于 11-16 19:21 31次下载
    使用MPLAB开发<b class='flag-5'>PIC</b>无法通过<b class='flag-5'>编译</b>的问题

    关于Stm芯片,keil编译后输出的信息,查看程序所占用的Flash、RAM空间大小

        根据keil编译输出的信息code:表示程序代码部分RO_data:表示程序已经定义的常量(如用const修饰的变量......)RW_data :表示已经初始化的全局变量(已初始化的和未
    发表于 12-02 09:21 8次下载
    关于Stm芯片,keil<b class='flag-5'>编译</b>后输出的信息,查看<b class='flag-5'>程序</b>所占用的Flash、<b class='flag-5'>RAM</b>空间大小

    关于Stm芯片,keil编译后输出的信息,查看程序所占用的Flash、RAM空间大小

        根据keil编译输出的信息code:表示程序代码部分RO_data:表示程序已经定义的常量(如用const修饰的变量......)RW_data :表示已经初始化的全局变量(已初始化的和未
    发表于 12-02 09:36 9次下载
    关于Stm芯片,keil<b class='flag-5'>编译</b>后输出的信息,查看<b class='flag-5'>程序</b>所占用的Flash、<b class='flag-5'>RAM</b>空间大小

    keil编译之后占用flash、ram大小

    keil编译之后占用flash、ram大小
    发表于 12-02 11:06 11次下载
    keil<b class='flag-5'>编译</b>之后占用flash、<b class='flag-5'>ram</b>大小