171、【OS】【Nuttx】【ARMV7M】任务跳转(上下文切换)(二)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【OS】【Nuttx】【ARMV7M】任务跳转(上下文切换)(一)

分析完了 xPSR 寄存器的剩余设置,并回顾了之前 blog 【OS】【Nuttx】【最小系统】任务跳转 在 SIM 仿真环境下的任务跳转,然后开始分析 up_switch_context,分析了其函数名意义,注释相关,以及两个参数 rtcb(当前正在运行的任务)和 tcb(指向下一个即将运行的任务),然后分析了 up_switch_context 完成任务切换的核心操作,下面继续

栈溢出检测

之前介绍了 Nuttx 平台的上下文切换函数 up_switch_context,然后在 SIM 仿真环境中,真正的切换动作在 sim_fullcontextrestore 里面

下面来看 ARMV7M 的上下文切换,和 SIM 仿真环境不同,ARM 架构下的上下文切换,是通过宏实现的(SIM 环境是函数调用)

下面来详细看下,首先是宏定义的整体结构

  • #ifndef up_switch_context:检查是否已经定义过 up_switch_context 的宏或函数,如果已经定义过(比如在某个架构相关的文件中,已经提供了汇编实现),就跳过这个宏定义,比如下面这个 tlsr82 的芯片架构,这是一种可选默认实现的常见技巧,优先使用底层的特殊版本,如果没有,就用 ARM 下面的通用版本
  • define up_switch_context(tcb, rtcb) ...:定义参数的宏,该宏接受两个参数 tcb(下一个要运行的任务)和 rtcb(当前运行的任务)
  • do { ... } while (0):C 语言函数式宏的经典写法,确保宏在任何上下文中都能安全使用,避免语法错误

OK,接下来是 up_interrupt_context() 函数,该函数返回

  • true:当前处于中断上下文(比如正在处理硬件中断)
  • false:当前处于任务,线程上下文

在 ARMV7M 架构中,up_interrupt_context 实现如下

这里关于 IPSR 寄存器,之前 blog 【OS】【Nuttx】【栈溢出】up_initial_state(IPSR&EPSR) 已经介绍过,当 IPSR 为 0 时,表示 Thread mode,非异常状态,也就是普通任务模式,而非 0 时,则表示中断模式

所以 !up_interrupt_context() 表示只有在非中断上下文(也就是普通任务重),才允许切换任务,而在中断服务程序 ISR 中,则不能直接进行任务切换,因为 ISR 可能会破坏调度器状态,或导致栈混乱,所以任务切换必须由调度器在安全的上下文中触发(比如从中断退出时再请求切换)

OK,然后是 sys_call0(SYS_switch_context),表示的是系统调用,其中

  • sys_call0:表示该系统调用不需要参数(0 个参数)
  • SYS_switch_context:系统调用编号,代表请求操作系统执行上下文切换

注意,这里没有像 SIM 环境那样直接操作寄存器,而是通过系统调用通知内核去完成切换,适用于用户态和内核态分离的系统

最后的 UNUSED(rtcb) 是一个常见的宏,一般定义为 (void)(x)用来消除编译器中未使用参数的告警 ,这里其实除了 rtcbtcb 参数也没用到,所以还应该加上 UNUSED(tcb)

OK,系统调用触发之后,之前说过,系统调用也属于一种异常类型

然后在之前 blog 【OS】【Nuttx】【构建】向量表 里分析过最开始的向量映射

在 PendSV 之前的异常处理,都统一映射到 exception_common 函数,exception_common 函数的定义如下,是用汇编语言编写的


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog

相关推荐
Charlie__ZS2 天前
Ubuntu 22.04新建用户,并赋予管理权限
linux·os·ubuntn
ErizJ2 天前
面试 | 操作系统
linux·面试·职场和发展·操作系统·os
HIT_Weston3 天前
169、【OS】【Nuttx】【栈溢出】up_initial_state(IPSR&EPSR)
os·栈溢出·nuttx
HIT_Weston19 天前
162、【OS】【Nuttx】【栈溢出】中断栈行为(双栈模型)
os·栈溢出·nuttx
HIT_Weston22 天前
158、【OS】【Nuttx】【栈溢出】中断栈不检查(一)
os·栈溢出·nuttx
HIT_Weston23 天前
155、【OS】【Nuttx】【栈溢出】安全边距(二)
os·nuttx·栈监控
HIT_Weston25 天前
154、【Nuttx】【OS】【启动】栈溢出检测(一)
os·nuttx·栈监控
HIT_Weston1 个月前
153、【Nuttx】【OS】【启动】回归!继续 Nuttx 探索(Stack Monitor)
os·nuttx·栈监控
啊阿狸不会拉杆2 个月前
《计算机操作系统》第十章 - 多处理机操作系统
c++·算法·计算机组成原理·os·计算机操作系统