简介:
在RTOS 的任务切换的时候,需要切换的两个任务分别用 from 和 to 来表示,from 任务是被切出(switchout)的任务,to 任务是要被切入(switchin)的任务。在任务切换的时候,RISC-V 架构的芯片form 任务需将任务切换相关的CSR 寄存器保存到任务栈中,并从 to 任务中栈中获取到上一次to 任务被打断的现场的CSR寄存器从而完成任务的切换,这个过程中涉及的CSR 寄存器有(mepc,mcause,msubm,mstatus),以下是Freertos 中出栈时将任务栈中的CSR 寄存器数值读加载到CSR寄存器的处理。
以下是保存CSR 寄存器的宏定义处理。
基于此我们逐个了解这些CSR寄存器的作用,首先来看下mepc寄存器,从以下寄存器的描述可知mepc 保存了异常返回地址信息
在FreeRtos 任务切换时定义了traceTASK_SWITCHED_OUT() 和 traceTASK_SWITCHED_IN() HOOK 函数我们在对应的hook函数内读取对应栈帧内的mepc 的值来确认任务返回地址信息。
修改代码添加对应的hook 函数,来hook 函数中打印任务名称和mpec 的值
运行结果如下,获取的mpec 的值和任务对应代码段地址空间和预期的一致,mpec 任务切换PC地址保存寄存器来使用在FreeRtos中。
验证完mpec CSR 寄存器后,我们继续了解mstatus 寄存器。
MIE:
MPIE和MPP:
添加测试代码在任务切换中读取mstatus 寄存器的值打印输出。
对应的打印结果为0x1880
对应mstatus 寄存器在进入异常时,对应MIE =0 MPIE =1(开启总中断)跟预期保持一致。
mcause 寄存器说明如下:
从上述mcause 寄存器的值可与i看出产生异常的原因为中断,对应的中断编码为3.对应3号中断为软中断MSIP
最后一个寄存器msubm 寄存器定义如下
打印结果为0x40,根据寄存器的定义可知TYP = 1 PTYP = 0,进入Trap 类型为中断,进入前为非Trap状态。
至此任务过程硬件自动保存的4个CSR寄存器功能就梳理完成了。