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

相关推荐
驱动探索者21 小时前
RISC-V 指令集深度解析:从 ISA 到 Zephyr
网络·计算机·操作系统·os
TechEdu2026062 天前
[操作系统]操作系统文件系统与输入输出:架构、行为与调优
操作系统·计算机科学·os
haoly19894 天前
xv6-examples-输出helloworld
os·fork·xv6·文件描述符·dup
无小道7 天前
深入理解 Linux 异步 I/O:从 epoll 到 io_uring
os
wunaiqiezixin8 天前
MIT 6.S081 syscall 实验篇(lab2):System call tracing (moderate)
linux·unix·os·xv6·mit6.s081
^yi17 天前
【Linux系统编程】对操作系统的理解
linux·运维·服务器·操作系统·系统调用·os
星马梦缘1 个月前
操作系统计算题专项练习(15题)
操作系统·os·银行家算法·段页式
ScilogyHunter1 个月前
NuttX MPU 保护模式完全指南
nuttx
ScilogyHunter1 个月前
NuttX 扁平嵌入式模式完全指南
nuttx
___波子 Pro Max.3 个月前
从 `dd` 命令到 NuttX 伪设备:`/dev/zero` 与 `/dev/null` 的实现剖析
nuttx