RISC-V处理器的C语言启动代码设计方法

本文探讨了如何使用C语言为RISC-V处理器设计启动代码,以替代传统的汇编语言。通过分析Cortex-M内核在IAR环境下的C启动代码,指出RISC-V的特点和挑战,并详细讲解了在SEGGER Embedded Studio环境下实现RISC-V内核C语言启动代码所需的知识,包括GCC内联汇编、链接器变量访问、函数属性等。最后,给出了一个C语言启动代码的实例。
摘要由CSDN通过智能技术生成

随着微处理器市场竞争加剧,RISC-V指令集越来越受到关注。虽然RISC-V并非第一个开源的指令集(ISA),却是第一个可依据实际应用场景灵活选择指令集的指令集架构。RISC-V指令集架构可以满足从高性能服务器CPU直至超低功耗传感器内嵌CPU的全部应用场景。

通常情况下,一款处理器的启动代码多使用汇编语言设计。其原因包括:在处理器启动阶段,C运行环境还未初始化;汇编语言实现的代码不受编译器影响;某些特殊寄存器操作无法通过C编译得到对应汇编代码;处理器的某些特殊设计不利于C语言的使用等。本文将解决前述问题,展示一种使用C语言为RISC-V处理器设计启动代码的方法。

为了更清晰地讨论问题并最大程度的便于读者理解某些流程,本文以芯来科技基于RV32IMC指令集的N205系列内核作为目标处理器,从N205内核的对标架构——来自ARM的Cortex-M内核在IAR EmbeddedWorkbench for ARM[1](后文简称IAR)环境下的C语言启动代码切入,逐步引入并实现SEGGER Embedded Studio[2](后文简称SES)环境下N205系列内核的C语言启动代码。

01

Cortex-M内核在IAR环境下的C语言启动代码

Cortex系列内核是ARM公司迄今为止最成功的系列产品,包括A、R、M三类,其中M系列主要针对微控制器市场。Cortex-M内核具有以下特点:内核包含高级中断控制器;中断响应时,处理器硬件将相应的寄存器入栈和出栈;向量表中首单元内容为栈地址,其余均为异常或中断函数的入口地址;向量表中的内容均为硬件自动载入。

代码段1所示内容是Cortex-M内核在IAR环境下使用C语言开发的启动代码。

【代码段-1】

#pragma language=extended          ❶

--snip--

voidResetISR(void);           ❷

--snip--

externvoid __iar_program_start(void);   ❸

staticunsigned long pulStack[64] @".noinit"; ❹

typedefunion         ❺

{

    void (*pfnHandler)(void);

    unsigned long ulPtr;

}

uVectorEntry;

__rootconst uVectorEntry __vector_table[] @".intvec" =          ❻

{

    { .ulPtr = (unsigned long)pulStack +sizeof(pulStack) },           ❼

    ResetISR,         

--snip--

};

--snip--

voidResetISR(void)

{

    __iar_program_start();

}

此处对上述代码做简要分析:

❶是IAR的#pragma指导符。

❷是复位函数声明,复位函数是处理器复位后首先执行的代码,有时也称为复位入口函数。

❸是IAR系统函数声明,__iar_program_start是IAR的系统函数,主要作用是执行C运行环境初始化并调用系统主函数main。

❹使用IAR @操作符定义系统栈区。

❺声明向量表的联合类型。

❻使用IAR对象属性声明__root及@操作符定义向量表,其中,第一个元素❼保存了栈底地址,后续元素均为函数地址。

从上述分析过程可以看出启动代码的必要工作包括定义栈区、定义并初始化向量表,定义并实现系统复位函数,初始化栈指针或栈寄存器等。依据处理器的架构不同,上述操作中某些过程需要由软件完成,有些则由硬件自动加载。

另外,有关IAR的指导符、对象属属性等内容不属于本文讨论范畴,有需要可自行查阅。这里给出两点提示:IAR环境的编译系统为IAR自行开发,故示例代码中的指导符号不适用于GCC;某些指导符会因IAR环境版本不同而有所差异。

02

在SES环境下实现RISC-V内核C语言启动代码的必要知识

前文提到,RISC-V是指令集而不是具体的设计实现,这与之前讨论的Cortex-M系列内核有很大不同。简单地说,不同厂商基于同种Cortex-M内核的处理器,仅从内核的层面来看可能没有太大差异,但不同厂商开发的具有相同指令集的RISC-V处理器则各有千秋:一方面是相同功能的具体实现可能不同;另一方面,不同厂商可以实现不同的指令扩展。

 这里对比Cortex-M内核,列举RISC-V处理器的一些特点:不同厂商中断控制器的实现各有特色;中

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值