网站推广做的比较好的公司,用户登录网站开发,房地产市场现状分析2022,重庆楼市最新消息系列一#xff1a;微型操作系统内核源码详解系列一#xff1a;rtos内核源码概论篇#xff08;以freertos为例#xff09;-CSDN博客
系列二#xff1a;微型操作系统内核源码详解系列二#xff1a;数据结构和对象篇#xff08;以freertos为例#xff09;-CSDN博客
系列…系列一微型操作系统内核源码详解系列一rtos内核源码概论篇以freertos为例-CSDN博客
系列二微型操作系统内核源码详解系列二数据结构和对象篇以freertos为例-CSDN博客
系列三微型操作系统内核源码详解系列三0空间存储及内存管理篇前置篇-CSDN博客 微型操作系统内核源码详解系列三1任务及切换篇任务函数定义-CSDN博客 微型操作系统内核源码详解系列三2任务及切换篇任务函数定义-CSDN博客 微型操作系统内核源码详解系列三3任务及切换篇任务函数定义-CSDN博客 微型操作系统内核源码详解系列三4arm架构篇-CSDN博客 微型操作系统内核源码详解系列三5进程与线程-CSDN博客
系列四 微型操作系统内核源码详解系列四1操作系统调度算法linux0.11版本内核-CSDN博客
微型操作系统内核源码详解系列四2操作系统调度算法rt-thread内核-CSDN博客
微型操作系统内核源码详解系列四3操作系统调度算法FreeRTOS内核篇上-CSDN博客
微型操作系统内核源码详解系列四4操作系统调度算法FreeRTOS内核篇下-CSDN博客
系列五
微型操作系统内核源码详解系列五1arm cortex m3架构-CSDN博客
微型操作系统内核源码详解系列五2cm3下栈的初始化-CSDN博客
微型操作系统内核源码详解系列五3cm3下调度的开启-CSDN博客
微型操作系统内核源码详解系列五四cm3下svc启动任务-CSDN博客 经历了前面的文章的铺垫一切都准备就绪接下来我们将会在SVC中断服务函数中开启第一个任务。
让我们看看SVC中断响应 首先看前三行代码 先令r3寄存器的值为pxCurrentTCB的地址再把这个地址指向的内容给r1现在r1存储的就是指针我们知道指针就是地址再把这个指针的值给r0那么r0就会找到任务控制块。
pxCurrentTCB的作用是指向当前运行的任务或即将运行的任务的控制块TCBTCB是一个存储任务各种信息的数据结构。这三行代码的作用是获取pxCurrentTCB指向的任务栈因为TCB的第一个成员就是栈顶指针。
现在重点来了请看下面这行代码 让我们先回顾一下我们在初始化stack时是如何操作的 请读者不要误解图中这些R代表的是这些内存地址的内容要被加载到哪个寄存器不是寄存器在这些地方。
cm3的栈是向下增长所以栈顶在下面。 这行代码的意思就是从r0这个内存地址开始把栈中往上九个地址的内容依次加载到CPU的寄存器r4-r11和r14然后r0自增加载后r0寄存器刚好表示这个栈里面的r0位置也正好把portINITIAL_EXEC_RETURN加载到r14不知道读者对这个定义还有没有印象现在该回收伏笔了 读者发现没有下一行代码使用的是psp而不是msp。看了上面的信息我们可以推断在把portINITIAL_EXEC_RETURN加载到r14后如果我们进行跳转就能成功实现从异常服务模式到线程模式的转换那么程序就会转为使用线程堆栈也就是说在SVC调用结束后我们将使用psp作为堆栈指针。
再看下一句 现在的r0刚好对应这个栈里面的存储形参的位置不得不说笔者还以前怀疑过prvparameter的作用现在发现它真的设置得非常好虽然它并不是什么有特殊含义的参数但是它贯穿了整个rtos架构起到了连接和中继作用执行任务时将会使用psp于是我们更新psp这个栈指针。
isb是等待指令完成防止指令乱序导致缓冲区出现错误。
这里笔者还是简单解释一下处理器在执行指令时会使用流水线和并行这些技术也就是说指令并不是依次执行的可能是同时执行的这种方法提高了效率但是可能导致错误的发生于是指令集被开发时还开发了这些特殊的指令针对那些对内存操作顺序有严格要求的操作 这里就是清零r0寄存器然后设置basepri寄存器为0就是打开所有中断basepri寄存器是一个用来控制屏蔽中断的寄存器我们将会在临界区学习它读者可以看看这些 接下来看最后一行代码 这里的意思就是异常返回时跳转到r14代表的地址那里前文已经提过了在SVC调用结束后我们将使用psp作为堆栈指针r14存储的值的含义就是完成异常服务模式到线程模式的转换这里就是完成转换的具体跳转指令。
这样第一个任务就被执行了。
以上就是SVC调用的内容了接下来笔者将会讲解PendSV中断服务PendSV响应可以说是FreeRTOS调度器的精髓所在。