查看: 1156|回复: 1
收起左侧

浅谈RISC-V GCC之:链接脚本学习笔记(二)

  [复制链接]

  离线 

  • TA的每日心情
    拍拍
    2021-10-29 10:26
  • 签到天数: 1 天

    [LV.1]

    发表于 2021-11-8 14:39:37 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    上一篇介绍了部分链接脚本知识,这次我们以MRS(MounRiver Studio)中内置的CH57系列模板工程来具体实践一下:
    1 入口
         
    MounRiver Stuido IDE-浅谈RISC-V GCC之:链接脚本学习笔记(二)risc-v单片机中文社区(1)
    ENTRY 关键字,确定程序入口在_start处

    2 内存布局
    MounRiver Stuido IDE-浅谈RISC-V GCC之:链接脚本学习笔记(二)risc-v单片机中文社区(2)
    内存分配,FLASH只读可执行,起始地址为0x00000000.大小为448K,448K也可以写成16进制;RAM读写可执行,起始地址为0x20003800,大小为18K。

    3输出段

    MounRiver Stuido IDE-浅谈RISC-V GCC之:链接脚本学习笔记(二)risc-v单片机中文社区(3)
    .init输出段,提供了两个符号_sinit和_einit,_sinit为FLASH起始地址,紧接着4字节对齐之后放的是输入段.init,这个输入段可以在start_CH573.S中看到,是起始跳转。
    MounRiver Stuido IDE-浅谈RISC-V GCC之:链接脚本学习笔记(二)risc-v单片机中文社区(4)

    这两个段是将本来默认放在FLASH 中的代码放到RAM中去运行,.highcodelalign段起始地址4字节对齐,符号_highcode_lma是FLASH 中已经排布到的地址,注意.highcode段运行在RAM中,其中 ”.” 是在RAM中的地址,在这里就是RAM起始地址,_highcode_vma_start与此相同,在这个输出段中有  .vector .vertor_handler .highcode输入段,四字节对齐之后又提供了一个此段结束的地址_highcode_vma_end ,这两个输出段中定义的三个符号是为了将FALSH 中的代码搬运到RAM里取运行,同样可以在start_CH573.S中可以看到
    MounRiver Stuido IDE-浅谈RISC-V GCC之:链接脚本学习笔记(二)risc-v单片机中文社区(5)
    使用和上面同样的写法,可以自定义将源码中的函数或者数据自定义到RAM中执行,只需要在源码中指定其section属性即可
    __attribute__((section(".highcode")))
    UINT16 Get_Calibration_Cnt_RAM( UINT16 loc ){
    ...
    ...
    }

    MounRiver Stuido IDE-浅谈RISC-V GCC之:链接脚本学习笔记(二)risc-v单片机中文社区(6)


    .text段是存放在FLASH,运行时地址也在FLASH中。
    MounRiver Stuido IDE-浅谈RISC-V GCC之:链接脚本学习笔记(二)risc-v单片机中文社区(7)
    首先说下__global_pointer这个符号,RISC-V内核中有一个GP寄存器,可以用来访问其地址内+/- 2K的数据,只需要一条汇编语句即可,如果不在范围内,就会使用auipc或者lui配合其他包括低12位立即数的指令来访问,可以手动调整其位置,使频繁用到的数据在其访问范围内可以有效的减少代码大小。
    此三段可以看成一个部分,首先.dalign中”.”的值是一个表达式,ORIGIN(RAM)是RAM 的起始地址,MAX(0x800,SIZEOF(.highcode))代表0x800和.highcode段中的最大值, “.”等于两值相加,.dlalign定义了符号_data_lma,是FLASH排布到此处的地址,.data段中_data_vma与.dalign中的”.”地址相同,因为中间没有占用RAM区的数据,_data_vma,_data_lma,_edata,三个符号为搬运数据到RAM 中提供了地址,同样可以在start_CH573.S中可以看到
    MounRiver Stuido IDE-浅谈RISC-V GCC之:链接脚本学习笔记(二)risc-v单片机中文社区(8)
    其中data中的输入段具体有哪些类型变量,对应哪种段,有兴趣的可以到对应的MAP文件中查看,如下图所示

    MounRiver Stuido IDE-浅谈RISC-V GCC之:链接脚本学习笔记(二)risc-v单片机中文社区(9)



    .bss存放未初始化的变量或者初始化为0的全局变量,其中COMMON段比较特殊,有机会专门在说一下,_sbss和_ebss为清零提供地址,同样可以在start_CH573.S中可以看到

    MounRiver Stuido IDE-浅谈RISC-V GCC之:链接脚本学习笔记(二)risc-v单片机中文社区(10)


    设置栈,起始地址放在RAM最上层。





    上一篇:浅谈RISC-V GCC之:链接脚本学习笔记(一)
    下一篇:RISC-V MCU IDE MRS(MounRiver Studio)开发之:绑定各后缀名文件打开方式
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

      离线 

  • TA的每日心情
    奋斗
    2022-6-21 08:23
  • 签到天数: 2 天

    [LV.1]

    发表于 2022-1-24 22:30:20 | 显示全部楼层
    强大
    全球首家只专注于RISC-V单片机行业应用的中文网站
    点评回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条


    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-11-26 00:39 , Processed in 0.504526 second(s), 49 queries .

    快速回复 返回顶部 返回列表