当前位置: 首页 > news >正文

ARM RFEIA指令作用

FreeRTOS第一个任务如何run起来的

在给ARM cortex R5适配FreeRTOS的过程中,在执行第一个task时,都是使用vTaskStartScheduler()函数,把第一个task运行起来的,其中比较关键在port.c实现的xPortStartScheduler()函数中,在这个函数,会调用vPortRestoreTaskContext()函数,把第一个task给运行起来。主要流程如下:

vTaskStartScheduler()xPortStartScheduler()vPortRestoreTaskContext()

在vPortRestoreTaskContext()的实现主要如下:

portRESTORE_CONTEXT MACRO/* Set the SP to point to the stack of the task being restored. */LDR		R0, pxCurrentTCBConstLDR		R1, [R0]LDR		SP, [R1]/* Is there a floating point context to restore?  If the restoredulPortTaskHasFPUContext is zero then no. */LDR		R0, ulPortTaskHasFPUContextConstPOP		{R1}STR		R1, [R0]CMP		R1, #0/* Restore the floating point context, if any. */POPNE 	{R0}/*VPOPNE	{D16-D31}*/VPOPNE	{D0-D15}VMSRNE  FPSCR, R0/* Restore the critical section nesting depth. */LDR		R0, ulCriticalNestingConstPOP		{R1}STR		R1, [R0]/* Ensure the priority mask is correct for the critical nesting depth. */CMP		R1, #0MOVEQ	R0, #255LDRNE	R0, ulMaxAPIPriorityConstLDRNE	R0, [R0]LDR		R4, vPortSetInterruptMaskAsmConstBLX		R4/* Restore all system mode registers other than the SP (which is alreadybeing used). */POP		{R0-R12, R14}/* Return to the task code, loading CPSR on the way. */RFEIA	sp!ENDMvPortRestoreTaskContext:/* Switch to system mode. */CPS		#SYS_MODEportRESTORE_CONTEXT

从portRESTORE_CONTEXT宏的实现来看,代码非常简单,就是从当前任务中获取到栈指针,然后赋值给sp,然后就把该task的stack内容给恢复出来。获取栈指针如下图所示:

未获取栈指针之前,系统使用的sp如下:
在这里插入图片描述
获取task栈指针之后,系统使用的sp如下:
在这里插入图片描述
恢复了task的cpu context后,没有看到给PC指针赋值的情况,依赖RFEIA sp!这条指令,就可以把pc赋值了,如下所示:
在这里插入图片描述
可以看出,RFEIA sp!这条指令是从栈里把pc恢复了,pc就会往0x0040f160这个地址跳转过去,这个地址刚好是当前运行任务的入口地址,如下所示:
在这里插入图片描述
ARM技术手册对RFE指令说明如下:
在这里插入图片描述

http://www.lryc.cn/news/534389.html

相关文章:

  • 【Kubernetes】常用命令全解析:从入门到实战(上)
  • 项目实战(11)-双通道气体压力计V1.0
  • Node.js怎么调用到打包的python文件呢
  • Transformer 详解:了解 GPT、BERT 和 T5 背后的模型
  • 利用二分法进行 SQL 盲注
  • 如何通过 bugreport 分析 Android 系统日志?
  • 安防机器人电源解决方案
  • 内网穿透的应用-Ubuntu本地Docker搭建pichome文件管理系统打造个人云相册
  • 力扣-栈与队列-1047 删除字符串中的所有相邻重复项
  • 旅客服务系统(PSS, Passenger Service System)
  • Linux路径中的‘~‘
  • 认识网络安全
  • 信息科技伦理与道德3-3:智能决策
  • 以 Python 为工具搭建的热门旅游景点数据分析系统
  • ZooKeeper 技术全解:概念、功能、文件系统与主从同步
  • Visual Studio Code 的 AI 编程助手
  • Kafka的ISR是什么,HW是什么,怎么保证可靠性,Kafka怎么实现顺序消息?为什么Kafka的broker上的topic越多,效率越慢?
  • Ollama系列---【ollama使用gpu运行大模型】
  • 使用C语言实现MySQL数据库的增删改查操作指南
  • 【Golang学习之旅】Go + Redis 缓存设计与优化(项目实战)
  • 2、k8s 二进制安装(详细)
  • 安卓开发,底部导航栏
  • CWOI-N RER 1 > 2 Solution
  • 字节跳动后端一面
  • Dify 框架连接 PGSQL 数据库与 Sandbox 环境下的 Linux 系统调用权限问题
  • ModuleJS 与 CommonJS 混用的两种解决方案
  • 代码随想录--977有序数组的平方
  • Win11下搭建Kafka环境
  • MacBook Pro M2安装deepseek
  • springboot的http请求不通原因