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

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

电压谐波对配电变压器温升的影响
小米10曝光将支持5G网络辅以最高12GB内存支持最高66W快充
一文详谈物联网设备的作用和应用场景
恐遭美国列入贸易黑名单?蚂蚁集团回应:业务主要在中国发展
工业控制中可编程逻辑控制器模块设计方案
基于RISC-V内核单片机移植RTOS实时操作系统(三)
云服务下的媒体生态有什么改变
甲烷检测仪预防液化气体泄漏的特点
芯教程丨平头哥助力中科昊芯HX2000系列芯片专题SCI串口通信(三)FIFO中断通信
台积电7nm技术已经试产 苹果高通均产生浓厚兴趣
如何应对物联网的网络威胁?
IC设计商为抢物联网商机 并购之外有何新招?
华夏北斗星照明系统点亮香港科技大学(广州),助力开学典礼圆满成功!
为什么叫独石电容
央视联合腾讯发布报告:九成受访者认为AI距离自己不遥远
实力证明品质,荣耀9一个月销量突破100万,互联网NO.1品牌毫无疑问
普渡科技宣布完成B轮融资,融资金额超过亿元
NVIDIA Omniverse平台助力三维重建服务协同发展
后补贴时代下新能源汽车产业新一轮洗牌已不可避免,未来到底该如何发展?
介绍4种最好的火花塞清洗方法