新网站怎样做优化,个人网站域名怎么取,承德北京网站建设,新媒体运营培训1、任务控制块在内存中的布局 RISC-V架构采用的减栈#xff0c;即栈向低地址空间生长#xff1b;在freertos中采用任务控制块#xff08;TCB#xff09;结构来表示一个任务每个任务有自己的任务栈#xff0c;任务栈是紧挨着TCB的#xff0c;且TCB在地址高位#xff0c;任…1、任务控制块在内存中的布局 RISC-V架构采用的减栈即栈向低地址空间生长在freertos中采用任务控制块TCB结构来表示一个任务每个任务有自己的任务栈任务栈是紧挨着TCB的且TCB在地址高位任务栈在地址低位。TCB在地址高位任务栈在地址低位的原因xTaskCreate函数中先申请的任务栈再申请的 2、创建任务时初始化任务栈 线程函数的地址保存在mepc这样在切换线程时就会把mepc寄存器中的值写到pc寄存器中进而执行线程函数线程函数的传参保存在x10寄存器也就是a0寄存器。因为按照RISC-V架构的函数调用规范函数第一个参数是通过a0传递可参考博客《RISC-V架构的函数调用规范和栈布局》xTaskReturnAddress是线程返回地址没有特别需求可以设置成0pxTopOfStack记录栈顶也就是当前栈被使用的最低地址满减栈pxStack记录栈空间的起始地址以后要删除任务时释放栈空间 3、切换任务时保存任务执行现场 保存mepc寄存器值时如果是同步异常中的ecall调用则需要将mepc值4。参考博客《RISC-V架构——中断处理和中断控制器介绍》把sp寄存器的值保存到TCB的第一个成员pxCurrentTCB表示当前正常运行的任务 4、切换任务时恢复任务执行现场 pxCriticalNesting表示xCriticalNesting变量的地址把栈空间中保存的数据恢复到对应的寄存器、变量中在执行mret命令返回后CPU将会从mepc寄存器记录的地址处开始运行 5、为什么栈空间不保存x2、x3、x4寄存器 x2别名是sp栈寄存器sp寄存器保存在TCB的第一个成员里不是保存在栈空间x3别名是gp全局寄存器用于链接器松弛优化不需要保存x4别名是tp线程寄存器在操作系统中保存指向进程控制块linux级别的操作系统才会使用该寄存器freertos没有使用tp寄存器所以不用保存