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

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

3天内不再提示

基于RISC-V内核单片机移植RTOS实时操作系统(二)

CHANBAEK 来源:CSDN-借过风景 作者:CSDN-借过风景 2023-01-31 13:50 次阅读

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

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

pYYBAGPYq96ARIbwAAOAjPNk5hg719.png

图1 上下文保存结构体

可以看到除了通用寄存器外,还有两个前文提到的成员mepc、mstatus,其中mstatus中含有中断的使能控制位,而mepc为机器模式下异常程序指针寄存器,其值会在执行mret后更新给pc,我们正式通过设置该寄存器的值来控制程序运行的切换。

当我们新建一个线程,初始化线程时,会为其开辟一个线程栈(程序中通常设置一个数组),即对上述结构体做初始化,在rt-thread中的代码如下图2所示。

poYBAGPYq96AEg1zAAHMQmxj6UA843.png

图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成员,初始化好的堆栈指针即传给该成员。

poYBAGPYq96AaRzyAADJ3FDL9FI924.png

pYYBAGPYq96Aaa7DAADoOMLOp2w772.png

图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等。

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

    关注

    6037

    文章

    44558

    浏览量

    635349
  • 寄存器
    +关注

    关注

    31

    文章

    5343

    浏览量

    120373
  • 内核
    +关注

    关注

    3

    文章

    1372

    浏览量

    40290
  • RTOS
    +关注

    关注

    22

    文章

    813

    浏览量

    119643
  • RISC-V
    +关注

    关注

    45

    文章

    2277

    浏览量

    46159
收藏 人收藏

    评论

    相关推荐

    RISC-V 跑大模型():LLaMA零基础移植教程

    这是RISC-V跑大模型系列的第篇文章,主要教大家如何将LLaMA移植RISC-V环境里。
    的头像 发表于 07-17 16:16 1406次阅读
    <b class='flag-5'>RISC-V</b> 跑大模型(<b class='flag-5'>二</b>):LLaMA零基础<b class='flag-5'>移植</b>教程

    risc-v的mcu对RTOS兼容性如何

    RISC-V的MCU对RTOS实时操作系统)的兼容性主要取决于多个因素,包括RTOS的版本、RISC-
    发表于 05-27 16:26

    RISC-V中***会子活动之一:基于RISC-V的鸿蒙开发板设计

    的新一代物联网操作系统系统RISC-V单片机不同于ARM架构的单片机RISC-V+鸿蒙,目
    发表于 06-03 16:26

    如何实现一个RISC-V内核架构的芯片移植工作

    取决于 RTOS 如何实现当然,也可以使用 Software interrupt 来做任务切换, libcpu/risc-v/nuclei 这里的内核移植,就是使用了 Software interrupt
    发表于 03-25 10:11

    基于RT-Thread操作系统衍生rt-smart实时操作系统简介

    ,例如 ARM Cortex-A 系列芯片,MIPS 芯片,带 MMU 的 RISC-V 芯片等。rt-smart 在 RT-Thread 操作系统的基础上启用独立、完整的进程方式,同时以混合微内核模式
    发表于 06-22 17:56

    基于实时操作系统单片机应用系统设计

    介绍了Small RTOS 51 多任务操作系统的基本原理,结合单片机控制的电子存包柜,简要介绍了移植small RTOS51 及通过消息队
    发表于 01-06 16:21 51次下载

    关于单片机与嵌入式、操作系统RTOS之间的关系详解

    这篇文章我们就来聊一下关于单片机与嵌入式、操作系统RTOS 之间的那些事!通过这篇文章,让你操作系统实时性有一个
    的头像 发表于 03-29 14:20 7870次阅读
    关于<b class='flag-5'>单片机</b>与嵌入式、<b class='flag-5'>操作系统</b>与 <b class='flag-5'>RTOS</b>之间的关系详解

    实时操作系统Free RTOS的详细介绍

    ,可基本满足较小系统的需要。 由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时
    发表于 06-21 14:30 6265次阅读

    转载:DIY:给单片机写个实时操作系统内核

    转载:DIY:给单片机写个实时操作系统内核
    发表于 11-13 19:36 1次下载
    转载:DIY:给<b class='flag-5'>单片机</b>写个<b class='flag-5'>实时</b><b class='flag-5'>操作系统</b><b class='flag-5'>内核</b>!

    基于精简指令集的RISC-V内核单片机

    RISC-V就不必多说了,详细大家都了解。它是一个基于精简指令集的开源指令集架构。与主流的主流的架构为x86与ARM架构不同,其特点就是完全开源。今天跟大家一起盘点一下国产RISC-V内核
    的头像 发表于 10-17 16:49 2278次阅读

    基于RISC-V内核单片机移植RTOS实时操作系统(一)

      ARM上移植实时操作系统大家可能比较熟悉,且例程较多,对于RISC-V内核单片机,可能相对
    的头像 发表于 01-31 12:08 2709次阅读
    基于<b class='flag-5'>RISC-V</b><b class='flag-5'>内核</b><b class='flag-5'>单片机</b><b class='flag-5'>移植</b><b class='flag-5'>RTOS</b><b class='flag-5'>实时</b><b class='flag-5'>操作系统</b>(一)

    基于RISC-V内核单片机移植RTOS实时操作系统(三)

      接着以WCH沁恒微电子的赤菟V103(CH32V103)和赤菟V307(CH32V307)两款RISC-V
    的头像 发表于 01-31 13:52 1843次阅读
    基于<b class='flag-5'>RISC-V</b><b class='flag-5'>内核</b><b class='flag-5'>单片机</b><b class='flag-5'>移植</b><b class='flag-5'>RTOS</b><b class='flag-5'>实时</b><b class='flag-5'>操作系统</b>(三)

    基于RISC-V内核单片机移植RTOS实时操作系统(四)

     接着以WCH沁恒微电子的赤菟V103(CH32V103)和赤菟V307(CH32V307)两款RISC-V
    的头像 发表于 01-31 13:54 1496次阅读
    基于<b class='flag-5'>RISC-V</b><b class='flag-5'>内核</b><b class='flag-5'>单片机</b><b class='flag-5'>移植</b><b class='flag-5'>RTOS</b><b class='flag-5'>实时</b><b class='flag-5'>操作系统</b>(四)

    Green Hills Software 为 Imagination RISC-V CPU 增加量产就绪的 RTOS 和工具支持

    认证的实时操作系统RTOS)以增强生态系统支持。该合作将继续扩展到 ImaginationCatapult CPU 系列的未来产品上。 µ- veloSity
    的头像 发表于 07-06 10:15 565次阅读
    Green Hills Software 为 Imagination <b class='flag-5'>RISC-V</b> CPU 增加量产就绪的 <b class='flag-5'>RTOS</b> 和工具支持

    RISC-V跑大模型():LLaMA零基础移植教程

    这是RISC-V跑大模型系列的第篇文章,主要教大家如何将LLaMA移植RISC-V环境里。
    的头像 发表于 07-10 10:10 1079次阅读
    <b class='flag-5'>RISC-V</b>跑大模型(<b class='flag-5'>二</b>):LLaMA零基础<b class='flag-5'>移植</b>教程