网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

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

时间:2023-01-31 13:52

人气:

作者:admin

标签:

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

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

今天聊下移植RTOS时RISC-V内核时单片机切换至第一个任务。

以RT-Thread为例,rt-thread和其他RTOS有点区别的是其gcc下的入口函数定义为entry,而main函数则可以被初始化为线程之一,图1为rt-thread的详细的启动流程。rt-thread定义一个rt_thread类型的全局指针rt_current_thread,用于实时获取当前运行的线程。从图9可知,硬件启动后进rtthread_startup,其开始进行了必要的初始化,如系统滴答定时器、堆、串口、调度器、定时器、main线程、空闲idle线程等等,最后执行了rt_system_scheduler_start后转交调度器执行。其内容如下图2所示。

poYBAGECCgiAaInbAAEs3dd2mrs534.png

图1 rt_thread启动流程

pYYBAGPYrEuAWC6IAADViZVU80o027.png

图2 调度器启动

由图2可知,其会查找优先级较高的就绪组优先级,并根据该优先级查找就绪链表,获取优先级较高的任务并得到控制块to_thread,然后调用rt_hw_context_switch_to切换至该任务。其是一段汇编实现的代码,传入的参数为该任务的sp指针。由前文可知,我们可以根据to_thread->sp得到该任务的堆栈位置,该堆栈的顶部空间存储了执行该任务时cpu寄存器的值,由此也可推测该部分汇编代码主要完成的就是从sp处恢复cpu寄存器值,并转而执行该任务。其代码如下图3所示,详见注释。

poYBAGPYrEuAa2jJAAEViOd45Vo522.png

poYBAGPYrEuAcgnxAABtrxtHDbE317.png

图3 切换至第一个任务

由上注释分析可知,rt_hw_context_switch_to通过传入的sp,恢复cpu寄存器,其中mepc寄存器任务初始化时设置为任务的入口地址,ra寄存器设置为返回地址,其指向公用函数_rt_thread_exit。 当mret返回后,pc更新为mepc值,即转向执行任务函数,若其不是一个持续执行的[while(1)]函数,那么其返回至_rt_thread_exit,删除该任务,并切换至其他任务。 由此也可理解图2中,最后一句注释“never

come back”的含义了,一旦开始执行任务,pc值被改变,再不会回到调用的地方。

其他RTOS中也有和此汇编函数类似的汇编实现,例如liteOS_M中的HalStartToRun,TencentOS_Tiny中的port_sched_start等。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信