【Nordic进阶日记】填坑篇④ ARM架构的OS支持

关注 + 星标公众号,不错过精彩内容

作者 | 量子君
微信公众号 | 极客工作室


【Nordic进阶日记】专栏目录
第一章 填坑篇① Nordic计时功能总结
第二章 填坑篇② NRF52xxx内外部时钟设置
第三章 填坑篇③ Nordic RTC 和 FreeRTOS Tick
第三章 填坑篇④ ARM架构的OS支持


前言

Nordic进阶日记系列博文涵盖了使用Nordic工具和框架、理解最佳实践以及解决技巧和窍门的主题。主要内容包括深入解析Nordic SDK的结构和用法、BLE应用开发、NRF52xxx系列硬件介绍与应用案例分析以及FreeRTOS在Nordic平台上的应用实践。

本章详细介绍了ARM架构MCU的堆栈和异常中断,以及中断优先级,并以Nordic为例介绍了在Nordic中使用FreeRTOS时的中断原理。


一、栈指针

物理上存在两个栈指针:
● 主堆栈指针(MSP):OS内核、中断/异常使用。
● 进程栈指针(PSP):用户任务使用。

1.1 特性

  1. 应用任务会遇到栈破坏的情况,比如应用任务栈溢出。这时候OS内核使用的栈和其他任务栈不会受到影响,有利于系统的可靠性。
  2. 每个任务栈的栈大小,只需要满足本任务的最大需求场景 + 一级栈帧的大小(无浮点运算 9 bytes,有浮点运算 27bytes)。 ISR(中断服务程序)和嵌套中断处理的栈空间会分配在主栈空间。这样对于任务堆栈的创建相对简单。

1.2 栈详解

● 栈是一种具有后进先出(Last -In-Fist-Out)特性的线性表。
● 允许数据操作的一端为栈顶,对应的另一端为栈低,栈顶的位置是变化的,当栈中没有元素时,栈顶和栈底重合,当满栈时,栈顶离栈底最远。
● MSP 是在复位时,从地址0处读取赋初值的。中断向量表的首 4 bytes 存放的是MSP栈指针的初始值。系统栈空间在启动文件中分配。PSP 在复位时,没有初始化。带OS的程序中,进程栈主动申请,在任务切换时对PSP赋值对应的任务栈指针。
● 描述栈,根据栈的生长方向和栈指针的指向,有4中不同的栈,因而就有8种操作(每种栈对应一组 PUSH 和 POP操作)。

1.2.1 生长方向

● 地址向高地址方向生长,递增栈:
栈底在低地址,当元素依次入栈时,元素的地址是增加的。
● 地址像低地址方向生产,递减栈:
栈底在高地址,当元素依次入栈时,后入住的元素具有较低的地址。

1.2.2 栈指针的指向

● 如果栈指针指向最后一个入栈的元素位置,则为满栈。
● 如果栈指针指向下一个即将入栈的元素位置,则为空栈。

1.2.3 ARM 为满减栈

二、异常

● 根据Arm 架构,CPU 有处理模式和线程模式两种操作模式。
● 处理模式:执行中断服务程序(ISR)等异常操作,具有特权访问等级。
● 线程模式:执行普通的应用程序代码,处理器可以处在特权访问等级,也可以处在非特权访问等级。软件可以将处理器从特权访问等级切换到非特权访问等级。但无法将自身从非特权等级切换到特权等级,处理器必须借助异常机制才能实现。
在这里插入图片描述

2.1 SVC 异常

● 请求系统管理调用。
● SVC 机制保证应用任务有方法访问系统资源。在Arm架构中,应用任务运行在非特权访问等级,系统级的硬件资源是无法访问的,通过SVC异常,触发Arm 在特权模式下运行用户编写的SVC服务。
● SVC 异常是软件触发的中断,符合标准的传参,有返回值流程。
● 简单理解:SVC 是Arm 架构中的异常,编号11,软件通过 svc#立即数的方式可触发SVC异常。立即数代表服务号,在中断异常处理函数里,根据不同的服务号应用程序可以提供不同的处理。

2.2 Nordic协议栈与SVC

● 如下图,S332 协议栈规格书描述,SVC 服务号 0x00-0xF 留给应用程序;0x10 - 0xFF 协议栈使用。根据Nordic 特性,所有的中断都会通过MBR->SoftDevice->Application 的转发流程,当SVC中断号为 0x10 - 0xFF时,Softdevice 自己处理;当为 0x00 - 0xF时,则通过向量表偏移转发给应用程序中断向量表中对应的中断处理函数执行。
● FreeRRTOS 在 Nordic中,启动调度器后,开启第一个任务的执行,则通过 svc 0 触发,在中断处理函数里,切换栈指针 MSP->PSP,获取第一个执行任务的控制块等开启第一个任务。
在这里插入图片描述

2.3 PendSV异常

● 可挂起的系统调用。

三、中断优先级

● 当启动第一个任务时,防止被打断,SVC的中断优先级最高。SVC 在任务启动流程中,只执行一次,即任务调度启动后,进行第一个启动任务的上下文切换。
● SysTick 异常,为OS提供周期性的时间片,OS在时间片中检测任务是否需要调度。任务可以被应用程序中断打断;Systick 又可以将普通中断打断,形成中断嵌套。这时候如果有任务需要切换并在SysTick里执行,则中断将会被延迟。
在这里插入图片描述
通过上图,设置PendSV异常优先级最低,则在SysTick打断ISR 后,将任务切换的情况触发为PendSV异常,则SysTick 结束后,ISR得以最快恢复。任务切换则没有ISR时完成。


总结

本章详细介绍了ARM架构MCU的堆栈和异常中断,以及中断优先级,并以Nordic为例介绍了在Nordic中使用FreeRTOS时的中断原理。

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子君@极客工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值