RISC-V MCU移植RTOS系列教程(二)

接着以WCH沁恒微电子的赤菟V103(CH32V103)和赤菟V307(CH32V307)两款RISC-V内核芯片来详细说下针对RISC-V平台,移植实时操作系统的注意点。

今天聊下移植RTOS时RISC-V内核时单片机任务栈保存哪些内容

上一章中列举了所有的寄存器,当需要切换任务时刻的寄存器值,除x0恒为0,其他的寄存器无法预知其值,切换时均需要保存(gp寄存器编译好后,固定不变,理论上可以不操作,为保持一致性和完整性,一并保存),如果使用浮点,还应该包括浮点寄存器。每个RTOS均会定义一个和上下文保存相关的结构体,以rt-thread为例,可以看到如下图1的数据结构定义。

 图1 上下文保存结构体

可以看到除了通用寄存器外,还有两个前文提到的成员mepc、mstatus,其中mstatus中含有中断的使能控制位,而mepc为机器模式下异常程序指针寄存器,其值会在执行mret后更新给pc,我们正式通过设置该寄存器的值来控制程序运行的切换。
当我们新建一个线程,初始化线程时,会为其开辟一个线程栈(程序中通常设置一个数组),即对上述结构体做初始化,在rt-thread中的代码如下图2所示。

图2 线程堆栈初始化 

由程序可知,堆栈初始化在线程初始化中被调用,线程初始化程序中首先将整个堆栈空间设成“#”,然后根据堆栈的增长方向设置不同参数,以红框中的向下增长为例,将线程的入口位置,线程可以带一个参数,返回地址,堆栈顶部地址。从堆栈初始化程序*rt_hw_stack_init中可以看出,其先将堆栈顶部地址对齐,然后向下偏移一个rt_hw_stack_frame结构体的大小,用于存储图1中需要存储的寄存器,并对该部分空间进行了初始化。其中把线程的入口地址给了mepc,线程输入参数给a0,mstatus初始值(MPP、MPIE、FS、MIE),即强制机器模式,使能浮点,MPIE为1,MIE为0。如果不带硬件浮点,可将该值设置为0x1880。另外设置ra为线程的返回地址,一般情况下一个线程我们希望一直运行的,当需要返回时说明该线程不再需要运行,所以返回地址一般是一段将该线程从线程列表中删除并切换至下一个线程的一段程序,即图2红框的中调用的函数_rt_thread_exit。


初始化线程时会定义一个rt_thread结构的全局变量,线程的操作即依靠该结构体。其内部内容如下图3所示,其内部可以看到一个sp成员,初始化好的堆栈指针即传给该成员。

图3 rt_thread结构体详情


综上可以看出有每个线程一个rt_thread结构体,由rt_thread->sp可获得该线程的堆栈位置,堆栈的栈顶的sizeof(rt_hw_stack_frame)空间存放了该线程运行需要的CPU寄存器值,剩余空间用于该线程运行时变量的出入栈。


以上的内容在其他RTOS中也能看到,例如上下文保存结构体rt_hw_stack_frame在华为鸿蒙LiteOS_M中有TaskContext,TencentOS_Tiny中有cpu_context_t,而线程管理的结构体rt_thread,LiteOS_M中LosTaskCB,TencentOS_Tiny中有k_task_st等。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: rt-thread是一个轻量级的实时操作系统,并且它可以被移植到不同的处理器架构上,包括RISC-V移植rt-thread到RISC-V处理器需要进行一些步骤。 首先,需要根据RISC-V处理器的体系结构和指令集特性,进行rt-thread的适配和修改。这可能涉及到整理处理器的文件和寄存器初始化的代码,以匹配RISC-V的特性。 其次,需要编写RISC-V处理器对应的启动代码,这些代码的目的是初始化处理器并设置一些必需的环境变量,例如堆栈指针和中断向量表。 接下来,需要实现RISC-V处理器的硬件抽象层(HAL),包括时钟管理、中断管理、内存管理和设备驱动等。这些代码将负责处理处理器底层的硬件操作和通信。 然后,根据目标RISC-V处理器的内存映射和外设配置,进行rt-thread的内核配置和编译。这包括选择所需的组件、功能和驱动器,并进行相应的配置。 最后,在RISC-V处理器上运行rt-thread,并进行测试和调试。这可能包括验证系统的稳定性、性能和功能。如果有必要,还可以进行性能优化和问题修复。 通过以上步骤,就可以成功地将rt-thread移植RISC-V处理器上,并实现在该处理器上运行实时操作系统的功能。这样可以为RISC-V处理器提供更多的应用和开发选择。 ### 回答2: rt-thread是一个开源的实时操作系统,支持多种硬件平台。而RISC-V是一种基于开源指令集架构的处理器架构。要将rt-thread移植RISC-V平台,需要进行以下步骤: 1. 首先,需要了解RISC-V处理器的初步知识,包括其指令集、寄存器、内存架构等等。这样才能更好地理解RISC-V的工作方式和特性。 2. 接下来,需要根据RISC-V处理器的特点,对rt-thread进行修改和适配。这包括对内核的调度器、中断处理、任务管理等进行适配,以使其能够在RISC-V平台上正常工作。 3. 在适配过程中,需要根据RISC-V的指令集架构,对rt-thread的汇编代码进行修改。这涉及到对寄存器、堆栈、内存访问等方面的调整,以确保rt-thread能够在RISC-V上正确运行。 4. 还需要根据RISC-V平台的硬件特性,对rt-thread的设备驱动进行适配。这包括对串口、GPIO、定时器等外设的驱动程序进行修改,以使其能够与RISC-V平台上的硬件相匹配。 5. 最后,进行一系列的测试和验证,确保rt-thread在RISC-V平台上的正常运行。这包括对实时性、稳定性、性能等方面进行测试,以验证移植的正确性和可靠性。 综上所述,rt-thread移植RISC-V平台需要对rt-thread进行修改和适配,同时还需要对汇编代码和设备驱动程序进行调整。最终需要进行测试和验证,以确保rt-thread在RISC-V平台上的正常工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值