[018] [RT-Thread学习笔记] 上下文切换分析

rt_hw_context_switch_to 函数分析 (1)、将r0寄存器的值,传送到地址值为rt_interrupt_to_thread的内存中,也就是执行线程的堆栈指针。在这个情况下,通过指令序列清除了 CONTROL.FPCA 标志,可能用于关闭浮点运算的自动上下文保存。(4) 将1,传送到地址值为rt_thread_switch_interrupt_flag。(2)、条件判断,如果处理器支持浮点运算(FPU不是软件模拟的),则执行其中的指令块。(3)将0,传送到地址值为rt_interrupt_from_thread的内存中。(8)开异常,开中断。 阅读详情
AI摘要

本文详细解析了RT-Thread操作系统在Cortex-M平台上如何利用PendSV异常完成高效的上下文切换过程,包括相关API介绍及核心代码实现。

RT-Thread
学习笔记
相关API
实现上下文切换
为什么使用`PendSV`
成上下文切换
Cortex-M 的
上下文切换

RT-Thread版本:4.0.5
MCU型号:STM32F103RCT6(ARM Cortex-M3 内核)

1 相关API

函数和变量描述
void rt_hw_context_switch_to(rt_uint32_t to);没有来源线程的上下文切换,在调度器启动第一个线程的时候调用,以及在 signal 里面会调用
void rt_hw_context_switch(rt_uint32_t from, rt_uint32_t to);从 from 线程切换到 to 线程,用于线程和线程之间的切换
void rt_hw_context_switch_interrupt(rt_uint32_t from, rt_uint32_t to);从 from 线程切换到 to 线程,用于中断里面进行切换的时候使用
rt_uint32_t rt_thread_switch_interrupt_flag;表示需要在中断里进行切换的标志
rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread;在线程进行上下文切换时候,用来保存 from 和 to 线程的栈顶指针的指针(即保存&thread->sp)

2 实现上下文切换

2.1 为什么使用PendSV完成上下文切换

Cortex-M的上下文切换由PendSV异常完成,为什么不用systick或其他异常,解释如下:

image-20220325164002026

上图为两个任务轮转调度,但当产生Systick异常时正在响应一个中断,则Systick异常会抢占其中断服务例程IRQ,若在此时OS进行上下文切换,会导致中断请求被延时,这在实时系统是不允许出现的。对于M3/4,当存在活跃的异常时,设计默认不允许返回到线程模式(非基级的线程模式例外),否则触发Usage fault。

PendSV异常会自动延迟上下文切换的请求,直到其它的ISR都完成了处理后才放行(编程为最低优先级的异常)。如果OS检测到某IRQ正在活动并且被SysTick抢占,它将悬起一个PendSV异常,以便缓期执行上下文切换:

image-20220325164645239

  1. 任务A呼叫SVC请求任务切换
  2. OS收到请求做好上下文切换准备,并悬起PendSV异常
  3. 当CPU退出SVC后,立即进入PendSV进行上下文切换
  4. 当PendSV执行完后,然后任务B,切换到线程模式
  5. 中断发生,ISR开始执行
  6. ISR执行过程中,发生systick异常,抢占了该ISR
  7. OS执行必要操作,然后悬起PendSV异常以做好上下文切换的准备
  8. 当systick退出后,被抢占的ISR继续执行
  9. ISR执行完毕,PendSV服务例程开始执行,并在其中进行上下文切换
  10. PendSV执行完毕,回到任务A,切换到线程模式

2.2 Cortex-M 的上下文切换

在 ARM9 等平台,rt_hw_context_switch() 和 rt_hw_context_switch_interrupt() 的实现并不一样,在IRQ里如果触发了线程的调度,调度函数里会调用 rt_hw_context_switch_interrupt() 触发上下文切换。IRQ里处理完中断事务之后,中断退出之前,检查 rt_thread_switch_interrupt_flag 变量,如果该变量的值为 1,就根据 rt_interrupt_from_thread 变量和 rt_interrupt_to_thread 变量,完成线程的上下文切换。

在 Cortex-M 处理器架构里,基于自动部分压栈和 PendSV 的特性,上下文切换可以实现地更加简洁,并且允许中断嵌套。

因此,在线程和中断里进行上下文切换没有区别, rt_hw_context_switch() 和 rt_hw_context_switch_interrupt() 实现一致。

  • 线程环境下的上下文切换

image-20220325173011380

  • 中断环境下的上下文切换
    image-20220325173449183

硬件在进入 PendSV 中断之前自动保存了 from 线程的 PSR、PC、LR、R12、R3-R0 寄存器,然后 PendSV 里保存 from 线程的 R11~R4 寄存器,以及恢复 to 线程的 R4~R11 寄存器,最后硬件在退出 PendSV 中断之后,自动恢复 to 线程的 R0~R3、R12、LR、PC、PSR 寄存器。

2.2.1 rt_hw_context_switch_to()

rt_hw_context_switch_to() 只有目标线程,没有来源线程。只在第一次启动时在rt_system_scheduler_start()中调用。

image-20220325174053008

;/*
; * void rt_hw_context_switch_to(rt_uint32 to);
; * r0 --> to
; * 该函数用于开启第一次线程切换
; */
rt_hw_context_switch_to    PROC
    EXPORT rt_hw_context_switch_to
    ; set to thread
    LDR     r1, =rt_interrupt_to_thread     ; 设置目的线程栈顶地址
    STR     r0, [r1]                        ; rt_interrupt_to_thread = &to_thread->sp 即线程栈顶地址sp的指针

    ; 设置 from 线程为0,表示不需要从保存 from 的上下文
    LDR     r1, =rt_interrupt_from_thread   ; 第一次启动没有源线程,栈顶地址的指针初始化为0
    MOV     r0, #0x0
    STR     r0, [r1]                        ; rt_interrupt_from_thread = 0

    ; 设置标志为 1,表示需要切换,这个变量将在 PendSV 异常处理函数里切换的时被清零
    LDR     r1, =rt_thread_switch_interrupt_flag
    MOV     r0, #1
    STR     r0, [r1]                        ; rt_thread_switch_interrupt_flag = 1

    ; 设置 PendSV 异常优先级为最低优先级
    LDR     r0, =NVIC_SYSPRI2
    LDR     r1, =NVIC_PENDSV_PRI  
    LDR.W   r2, [r0,#0x00]       ; r2 = *NVIC_SYSPRI2
    ORR     r1,r1,r2             ; r1 |= r2
    STR     r1, [r0]             ; *r0 = *NVIC_SYSPRI2 = r1

    ; 触发 PendSV 异常 (将执行 PendSV 异常处理程序)
    LDR     r0, =NVIC_INT_CTRL
    LDR     r1, =NVIC_PENDSVSET     
    STR     r1, [r0]            ; SCB_ICSR寄存器写0无效, 因为可以直接赋值

    ; 放弃芯片启动到第一次上下文切换之前的栈内容,将 MSP 设置启动时的值
    ; LDR     r0, =SCB_VTOR     ; 读取向量表相对基址的偏移字节
    ; LDR     r0, [r0]
    ; LDR     r0, [r0]
    ; MSR     msp, r0

    ; 使能全局中断和全局异常,使能之后将进入 PendSV 异常处理函数
    CPSIE   F
    CPSIE   I

    ; 不会执行到这里
    ENDP

rt_hw_context_switch_to函数主要功能:

  • 获取to线程栈顶指针的指针,以便直接修改它们的值
  • 将rt_interrupt_from_thread 置 0,表示不需要从保存 from 线程的上下文
  • rt_thread_switch_interrupt_flag 置 1
  • 设置 PendSV 异常优先级为最低优先级
  • 触发 PendSV 异常

注意:rt_interrupt_to_thread/rt_interrupt_from_thread的的值是一个指针(地址),即&thread->sp。

2.2.2 rt_hw_context_switch()/ rt_hw_context_switch_interrupt()

实现从 from 线程切换到 to 线程的功能。
image-20220325174325605

;/*
; * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
; * r0 --> from
; * r1 --> to
; */
rt_hw_context_switch_interrupt
    EXPORT rt_hw_context_switch_interrupt
rt_hw_context_switch    PROC
    EXPORT rt_hw_context_switch

    ; 检查 rt_thread_switch_interrupt_flag 变量是否为 1
    LDR     r2, =rt_thread_switch_interrupt_flag
    LDR     r3, [r2]
    CMP     r3, #1      
    BEQ     _reswitch   ; rt_thread_switch_interrupt_flag为1 则跳转
    MOV     r3, #1      
    STR     r3, [r2]    ; rt_thread_switch_interrupt_flag = 1

    LDR     r2, =rt_interrupt_from_thread   ; set rt_interrupt_from_thread
    STR     r0, [r2]                        ; rt_interrupt_from_thread = &from_thread->sp

_reswitch
    LDR     r2, =rt_interrupt_to_thread     ; set rt_interrupt_to_thread
    STR     r1, [r2]                        ; rt_interrupt_to_thread = &to_thread->sp

    ; 触发 PendSV 异常,将进入 PendSV 异常处理函数里完成上下文切换
    LDR     r0, =NVIC_INT_CTRL              ; 触发PendSV 异常,实现上下文切换
    LDR     r1, =NVIC_PENDSVSET
    STR     r1, [r0]
    BX      LR
    ENDP

rt_hw_context_switch/rt_hw_context_switch_interrupt函数主要功能:

  • 更新from/to线程栈顶指针的指针,以便直接修改它们的值(rt_thread_switch_interrupt_flag 为0,则不会更新from线程)
  • rt_thread_switch_interrupt_flag = 1
  • 触发 PendSV 异常

注意:在调用rt_hw_context_switch_xx时要用中断锁保护,以防被打断。

2.2.3 PendSV服务例程中实现真正的上下文切换

image-20220325174851339

; r0 --> switch from thread stack
; r1 --> switch to thread stack
; psr, pc, lr, r12, r3, r2, r1, r0 are pushed into [from] stack
PendSV_Handler   PROC
    EXPORT PendSV_Handler

    ; 关闭全局中断保护上下文切换
    MRS     r2, PRIMASK
    CPSID   I

    ; 判断r1是否为0,为0则跳转到pendsv_exit, 表示PendSV已处理
    LDR     r0, =rt_thread_switch_interrupt_flag
    LDR     r1, [r0]
    CBZ     r1, pendsv_exit

    ; 清零 rt_thread_switch_interrupt_flag 变量
    MOV     r1, #0x00
    STR     r1, [r0]
     ; 如果rt_interrupt_from_thread为 0,就不进行 from 线程的上下文保存
    LDR     r0, =rt_interrupt_from_thread
    LDR     r1, [r0]
    CBZ     r1, switch_to_thread    ; 源线程sp的指针若为0(第一次启动为0),则跳过寄存器第一次保存现场
    ; 保存from源线程的现场: r4 - r11
    MRS     r1, psp                 ; get from thread stack pointer
    STMFD   r1!, {r4 - r11}         ; push r4 - r11 register
    LDR     r0, [r0]                ; r0 = &rt_interrupt_from_thread
    STR     r1, [r0]                ; update from thread stack pointer
; 恢复to目标线程的现场,并更新当前psp为目标线程的栈指针
switch_to_thread    
    LDR     r1, =rt_interrupt_to_thread ; rt_interrupt_to_thread全局变量保存的是thread sp的地址
    LDR     r1, [r1]
    LDR     r1, [r1]                ; load thread stack pointer

    LDMFD   r1!, {r4 - r11}         ; pop r4 - r11 register
    MSR     psp, r1                 ; update stack pointer

pendsv_exit
    ; 恢复全局中断状态
    MSR     PRIMASK, r2

    ; 修改 lr 寄存器的 bit2,确保进程使用 PSP 堆栈指针
    ORR     lr, lr, #0x04   ; lr = EXC_RETURN, 第二位置1表示返回线程模式后使用PSP
    BX      lr              ; psr, pc, lr, r12, r3, r2, r1, r0 will pop from [to_thread_stack] 
    ENDP

PendSV_Handler主要功能:

  • 进入ESR前,硬件将psr, pc, lr, r12, r3, r2, r1, r0 压入 [from] 线程栈中
  • 进入ESR中,若rt_thread_switch_interrupt_flag为0则退出,反之将其清零
  • 进入ESR中,软件将r4 - r11 压入 [from] 线程栈中
  • 进入ESR中,更新当前psp为to线程的栈指针
  • 进入ESR中,软件将 [to] 线程栈中的保存的r4 - r11 弹出给寄存器
  • 进入ESR中,将lr = EXC_RETURN的 第二位置1表示返回线程模式后使用PSP
  • 退出ESR,硬件将[to] 线程栈中的保存的psr, pc, lr, r12, r3, r2, r1, r0弹出给寄存器,跳转到pc所在地址继续取指执行。

关于rt_thread_switch_interrupt_flag的作用:

  • 线程环境中,主动进行任务调度,在rt_schedule中调用rt_hw_context_switch()函数后,此时已经将from/to线程的栈顶指针地址保存到rt_interrupt_from_thread/rt_interrupt_to_thread变量中,并且将rt_thread_switch_interrupt_flag置1,然后触发PendSV异常。

    但在中断屏蔽期间,若又悬起了systick异常,中断使能后,会先跳转到systick的ESR中执行。在systick中会检查当前线程的时间片与系统定时器,若当前线程时间片已用完或线程定时器超时,则会调用rt_schedule从优先级链表中获取当前最高优先级的线程,此时to_thread可能会改变,但是from_thread不会改变,最后调用rt_hw_context_switch_interrupt()函数(两者实现一样),此时rt_thread_switch_interrupt_flag已为1,故不会更新rt_interrupt_from_thread,同时也不会再次将rt_thread_switch_interrupt_flag置1。

  • PendSV_Handler中的rt_thread_switch_interrupt_flag作用个人猜测,可能是在没有调用rt_hw_context_switch/rt_hw_context_switch_interrupt时,但意外触发了PendSV,此时会退出,无需切换。

END

RT-Thread移植(二):CPU架构 在嵌入式领域有多种不同 CPU 架构,例如 Cortex-M、ARM920T、MIPS32、RISC-V 等等。为了使 RT-Thread 能够在不同 CPU 架构的芯片上运行,RT-Thread 提供了一个 libcpu 抽象层来适配不同的 CPU 架构。libcpu 层向上对内核提供统一的接口,包括全局中断的开关,线程栈的初始化,上下文切换等。 阅读详情

相关推荐

RT-Thread任务切换原理和堆栈的具体实现

rt thread

m0_72905370的博客 1624

RT-Thread内核移植关键代码解析(3) ---- 实现 rt_hw_context_switch_to()

一、源码 rt_hw_context_switch_to()没有来源线程,切换到目标线程,在调度器启动第一个线程的时候被调用。只使用一次。其执行逻辑流程图如下所示: 其采用汇编语言来实现,如下所示: ;/* ; * void rt_hw_context_switch_to(rt_uint32 to); ; * r0 --> to ; * this fucntion is used...

Eureka1024的博客 3314

Cortex-M3 SysTick深度解析:为什么它是RTOS的心跳?

本文深入解析Cortex-M3内核中的SysTick定时器,探讨其作为RTOS核心心跳的关键作用。通过分析SysTick的硬件架构、时钟源选择策略及在任务调度中的应用,揭示其在实时操作系统中的重要性。文章还提供了性能优化技巧和常见问题解决方案,帮助开发者充分利用SysTick提升RTOS性能。

weixin_30505225的博客 572

xos详解5:PendSV_Handler

; PendSV_Handler PendSV_Handler LDR R2, =OSTcbCurr ; 不必关中断。嵌套中断发生时会自动保存 R0~R3 到 MSP 并恢复 LDR R0, [R2] ; 如果发生咬尾的多个 PendSV,上半段相当...

uunubt的专栏 2979

JVM监控Agent工程实践:JVM TI+JNI+Spring AI Alibaba融合架构

JVM监控是Java应用可观测性的核心能力,传统方案依赖JConsole、Arthas或Prometheus等工具采集指标,但面临诊断深度不足、根因定位依赖人工经验等瓶颈。随着AIOps与智能运维演进,将JVM运行时数据(如GC事件、线程状态、类加载信息)转化为可推理的语义化上下文,成为提升故障自愈能力的关键路径。JVM TI接口提供毫秒级、零干扰的底层事件捕获能力,结合JNI实现低开销数据采集;Spring AI Alibaba则承担自然语言理解与决策生成角色,支撑从‘看数’到‘懂因’的跃迁。本文聚焦真实

bangtuo9862的博客 371

ARM嵌入式固件启动流程与OTA故障定位实战手册

嵌入式固件启动流程是ARM架构下从上电复位到用户代码执行的确定性序列,其本质由向量表布局、异常模式切换、内存初始化等底层硬件契约所约束;理解该流程需深入BootROM行为、SPL跳转条件与U-Boot阶段依赖等关键机制,技术价值在于构建可预测、可观测、可诊断的固件运行基线;典型应用场景覆盖消费电子产线调试、工业网关OTA升级、车载T-Box崩溃分析等真实工程现场;本文聚焦ARM平台下启动流程、固件、OTA三者深度耦合的故障根因与定位路径,融合向量表重定位、HAB签名验签、IVT结构解析等硬核实践。

weixin_33816300的博客 325

GD32H759+RT-Thread下ADC/DAC高精度驱动实战

ADC和DAC是嵌入式系统中连接物理世界与数字处理的核心模拟接口,其性能直接决定工控、传感与电机控制系统的精度与实时性。在高性能MCU如GD32H759上,ADC/DAC的精度不仅取决于寄存器配置,更受时钟树稳定性、DMA传输时序、RTOS中断调度及硬件滤波协同等多重因素制约。本文聚焦GD32H759芯片特性与RT-Thread设备驱动框架深度耦合场景,解析采样率漂移、输出抖动、缓冲区错位等典型问题的技术成因,提供基于寄存器级配置、DMA原子操作、信号量同步与软硬协同滤波的工程化解决方案,覆盖从时钟校准、D

weixin_29182481的博客 227

【信息科学与工程学】计算机科学与技术——第二百二十五篇 架构设计 01 RTOS架构01

好的,根据您的要求,我将为您构建一个关于“实时系统设计方案中的知识体系”的详细纵向输出。内容将严格遵循您提供的格式,并重点扩展“核心知识点/其他知识点列表”和“数学表达式与方程式列表及详细数学建模与数值设计”这两个部分,确保其内容均超过1000字。本知识模块是实时系统设计的基石。它确保了系统能够在严格的时间约束内完成指定计算任务,是保障系统和的核心。在航空航天、自动驾驶、工业控制、金融交易等对时间敏感的应用中,正确的调度策略与分析是避免灾难性后果(如错过截止时间导致系统失效)的关键。

weixin_49199313的博客 190

TM4C123 UART中断与DMA寄存器精讲:从原理到稳定通信实战

在嵌入式系统开发中,UART(通用异步收发器)是实现微控制器与外部设备串行通信的基础接口。其工作原理基于异步串行协议,通过起始位、数据位和停止位的组合完成数据传输。为了提升系统效率,中断机制允许CPU在外设事件发生时才被唤醒处理,而DMA(直接内存访问)技术则能在外设与内存间直接搬运数据,进一步解放CPU。这些技术的核心价值在于实现高效、实时的数据交换,是工业控制、传感器网络和固件升级等场景的基石。本文以TI TM4C123系列MCU为例,深入剖析UART中断清除寄存器(UARTICR)的位域功能与“写1清

weixin_33695082的博客 426

【信息科学与工程学】【解决方案体系】第三十篇 在线游戏及游戏云系统模型与方程式01

本表格旨在系统化地描述在线游戏及其云系统所涉及的各类数学模型、算法和定理。以下为前8个核心模型的详细示例,展示了从用户请求建模到资源规划的完整链条。编号规则为D(设计)、P(性能)、R(资源)、C(成本)、A(算法)。编号类别领域模型配方定理/算法/模型/方法名称定理/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化精度/密度/误差/强度底层规律/理论定理典型应用场景和各类特征变量/常量/参数列表及说明数学特征。

weixin_49199313的博客 2291

【信息科学与工程学】【广告科学】第四十四篇 广告平台投放和广告计费类算法01

全行业的中国企业广告投放模型总表。行业分类依据《国民经济行业分类》(GB/T 4754—2017)的门类/大类 ,产品层参考"主营产品统计代码"行业—产品映射 ,平台算法以巨量引擎、腾讯广告等官方文档为硬支撑 ,合规部分严格对齐《互联网广告管理办法》以及2026年市场监管部门最新合规提示 。编号类型(门类)行业(大类)企业及产品内容列表投放模型投放平台投放人群欲望激发维度面向人群模式(地域/文化/年龄/角色)001A 农林牧渔01 农业北大荒/中粮:五常大米、面粉、食用油、杂粮品牌曝光 + 电商转化双轨(C

weixin_49199313的博客 1641

PendSV中断服务函数

之前在系统滴答定时器中断服务函数中调用API函数xPortSysTickHandler(),xPortSysTickHandler()函数中通过向中断和状态寄存器的bit28写入1来启动PendSV中断,具体PendSV中断服务函数是 PendSV_Handler,并且任务切换的具体任务是在PendSV中断服务函数中完成的,都是拿汇编写的,简单看一下。 PendSV中断服务函数 #define x...

sayhi 3805

【信息科学与工程学】【制造工程】第八十四篇 Nvidia Rubin GPU 芯片加工工艺——分层拆解表01

属性内容编号​⑮字段​N3P 节点几何尺度锚定(CPP / MxP / SRAM bit-cell area)— 用来把"3nm"从营销词翻译成可算的面积/电容/电阻预算类型​制程标尺(Scaling metrology)— FEOL+局部互连领域​工艺节点定义 · 尺度律(Dennard/ITRS-style 但不迷信"nm=physical gate length")GPU芯片​模块​整个逻辑阵列的"最小重复尺":栅方向(poly/metal-x)与鳍方向(active/OD)子模块​。

weixin_49199313的博客 795

内核移植(六)--中断处理

中断处理 PendSV_Handler 函数 PendSV_Handler() 函数是真正实现线程上下文切换的地方 PendSV_Handler PROC ;PROC 定义子程序的开始 EXPORT PendSV_Handler ;声明一个标号具有全局属性 ;失能中断,为了保护上下文切换不被中断 MRS r2, PRIMASK

tyustli 1058

电化学阻抗谱(EIS)在锂离子电池中的应用

摘要电化学阻抗谱(electrochemical impedance spectroscopy, EIS)是一种重要的电化学测试方法,在锂离子电池动力学反应机理研究及动力学参数测量等方面具有广泛的应用。在锂离子电池运行过程中,各反应步骤的动力学参数及时间常数不同,而EIS可以在较宽的频率范围内对体系施加小幅正弦激励信号,使得在特定频率下突出特定时间常数的电极过程,从而将复杂的电极过程分离,实现单一电极过程动力学的分析。通过对交流阻抗信息的研究,也可以为锂离子电池及其他电池的应用与管理、电化学过程设计及电极材

qiushireader的博客 2648

【Matlab/simulink/carsim】再生制动

【Matlab/simulink/carsim】再生制动

weixin_62311849的博客 618

uCOS-II中PendSV_Handler和SysTick_Handler

在uCOS的移植中有两个函数是移植工作的核心,相当于将裸机程序与操作系统的“神经”搭在一起,使得操作系统得以运行,这两个系统中断分别为: 1.SysTick_Handler:滴答定时器中断,这个中断相当于操作系统的心脏,给操作系统提供心跳,滴答定时器会一直不停的不断触发中断,在它的中断服务函数中,提供进程/任务的上下文切换,和任务调度的工作,简单描述如下图: 这是最简单的调度模式,如果在滴

猪哥的专栏 1万+

ATM火控电容改造实战:提升速凌无刷电机动力与系统稳定性

在嵌入式系统与电机驱动领域,电源完整性是保障电路稳定运行的核心基础。其核心原理在于通过合理的电容网络设计,为负载提供瞬时大电流并滤除高频噪声,从而维持电压稳定。这项技术的核心价值在于能显著提升系统的动态响应能力与可靠性,避免因电压跌落导致微控制器复位或功率器件过应力。典型的应用场景包括无人机电调、机器人关节驱动以及各类需要快速响应的伺服系统。本文聚焦于水弹发射器ATM火控系统的硬件迭代,通过详解电容的选型、布局与焊接流程,特别是针对速凌五代无刷电机的高启动电流特性,系统性地阐述了如何通过强化电源储能与芯片去

weixin_33868027的博客 553

RT-Thread学习笔记【内核移植】

RTT的内核与内核移植 内核移植:将操作系统的内核在不同CPU架构和不同外围硬件环境下运行,能够具有线程管理和调度、内存管理、线程间同步与通信、定时器管理等基本功能的过程 内核移植可以分为CPU架构移植和BSP(Board Support Package板级支持包)移植两部分 CPU架构移植 RTT提供了libcpu抽象层来适配不同的CPU架构 可支持arm系、mips系、RISC-V、avr系、xilinx系等多种流行的嵌入式cpu架构 libcpu抽象层 libcpu的上层对内核提供运行接口,下层对CP

qq_40500005的博客 1081

薛定谔 | 先导化合物优化与相互作用可视化

当获得针对某个靶点的先导分子后,想要在此基础上进行化学结构修饰。为了提升化学改造的成功率可以采用本教程方法进行结构虚拟改造/优化。每用薛定谔处理一个新任务,第一步必须创建新的project以方便日后管理。选项卡中修改工作路径(可以方便地找到输出文件)

药研猿的博客 2143

Android Profiler 帧率优化实战与性能调优

本文详细介绍了使用Android Profiler进行帧率优化与性能调优的实战方法。通过分析主线程状态、FPS曲线和渲染阶段耗时,精准定位卡顿根源,并提供减少过度绘制、优化绘制命令及改善资源使用的具体策略。文章结合电商、游戏等真实案例,帮助开发者有效解决卡顿问题,提升应用流畅度。

palm99的专栏 536

rt_hw_context_switch 函数分析

(1)设置 rt_thread_switch_interrupt_flag 为1。(2)设置rt_interrupt_from_thread。(3)设置rt_interrupt_to_thread。(4)触发PendSV异常。

qq_43710899的博客 402

鸿蒙子系统解读-分布式软总线子系统初步研究(下)

鸿蒙子系统解读-分布式软总线子系统初步研究(下) 本文作者:江苏润和软件股份有限公司 郎建中 3.2. 数据传输 上一节我们看了PublishService()函数的代码实现过程。被发现端发布服务后,软总线回调发布成功的函数中,被发现端需要使用CreateSessionServer()来创建会话的服务器等待发现端的连接创建会话。下面我们就来分析CreateSessionServer()函数的实现过程。 数据传输部分的代码位于foundation/communication/services/softbus

weixin_47070198的博客 3088

RT-Thread线程创建和切换分析

提出问题:什么叫线程?思考这个问题之前,先想想怎么切换线程?怎么保存线程?想要回答以上的问题,需要了解一些微机原理和ARM架构及汇编的知识。

qq_43460068的博客 2908

在Simulink中构建永磁同步电机的网络化控制模型,并分析通信网络对系统性能的影响

核心优势通过仿真验证了网络延迟和丢包对PMSM控制性能的影响。提供了改进PI参数或引入自适应控制的解决方案。扩展方向抗干扰控制:结合卡尔曼滤波或滑模控制抑制网络噪声。时间敏感网络(TSN)建模:参考知识库[2]的中断触发方式,实现确定性通信。网络安全仿真:模拟恶意攻击(如数据篡改)对控制系统的威胁。

xiaoheshang_123的博客 167

华为OD机试真题 新系统 2026-09-06 Python&JS【仓储货物有序出库】

某仓储中心有一个货物堆放区,货物编号按乱序堆叠存放,只能从顶部取货,管理员需要将货物按编号从小到大取出。

MISAYAONE的博客 113
上一篇: [019] [ARM-Cortex-M3/4] 中断等待和异常处理优化
下一篇: [019] [RT-Thread学习笔记] 线程位图调度算法
柯西的彷徨
博客等级 码龄8年 790粉丝 86原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

柯西的彷徨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值