0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SVC_Handler

分享:

好的!在 ARM Cortex-M 系列微控制器 (MCU) 的编程中,SVC_Handler 是指 Supervisor Call Handler,通常翻译为 监管调用处理程序 或简称 SVC 服务处理程序

核心作用:

它是系统代码中定义的一个异常处理函数。当 CPU 在执行用户(应用程序)代码时,遇到一条 SVC (Supervisor Call) 指令时,就会触发SVC异常,CPU 会自动查找并跳转到 SVC_Handler 函数来执行相应的处理。

关键点解析:

  1. SVC 指令是什么?

    • 它是一条 ARM 汇编指令。
    • 应用程序(通常在用户模式/线程模式,权限较低)通过执行这条指令,主动请求进入更高特权级别(通常是处理程序模式)。
    • 这是应用程序请求操作系统服务(内核服务)的标准机制之一。例如,当应用程序想要访问硬件(如文件读写、网络通信)、创建线程、申请内存 (malloc 背后可能用到 SVC) 时,通常会调用库函数,而这些库函数的底层实现最终会执行一条 SVC 指令。
  2. SVC_Handler 做了什么?

    • 异常入口:SVC 指令执行时,CPU 硬件会自动进行上下文保存(将关键寄存器压入堆栈),然后将 SVC_Handler 的地址加载到程序计数器 (PC)。
    • 确定请求的服务号: SVC 指令通常带有一个立即数参数(通常称为 SVC 号系统调用号)。例如:SVC 0x01。处理程序的首要任务是从触发异常的 SVC 指令中提取出这个号码。
      • 这通常需要通过检查堆栈上保存的返回地址,然后读出该地址前 2 个字节(Thumb 模式下的 SVC 指令是 16 位的)来获取 SVC 指令本身的二进制码,从中解析出立即数。
    • 根据 SVC 号分发请求: 处理程序根据解析出的 SVC 号,使用 switch-case 语句或函数指针跳转表,跳转到对应的具体服务函数
    • 执行服务: 处理程序在特权模式下执行具体的服务函数代码(如打开文件、分配内存)。这些服务通常能访问硬件和操作系统内核的所有资源。
    • 退出并返回结果: 服务执行完成后,处理程序准备好返回值和任何需要传递回应用程序的信息。
    • 异常返回: 处理程序执行一条特殊的异常返回指令(例如在 Cortex-M 中的 BX LR 或使用汇编编写的退出序列)。CPU 硬件自动恢复之前保存的上下文(寄存器),并跳转回用户应用程序中紧跟在 SVC 指令之后的那条指令继续执行。如果有返回值,会通过约定的寄存器(如 R0)或内存位置传递给应用程序。

类比理解:

想象应用程序是公司员工,操作系统内核是公司管理层/资源控制中心(有更高权限)。

  • SVC 指令: 员工填写的申请单(上面写着需要的服务编号,比如“申请办公用品 001”)。
  • 触发 SVC 异常: 员工把申请单投入一个特定的投递箱,这个动作会立即触发一个通知给管理部门的流程。
  • SVC_Handler 管理部门负责处理申请单的前台人员。
    • 前台人员收到通知(异常发生),取出申请单(从堆栈和指令中提取 SVC 号)。
    • 查看申请单上的编号(解析 SVC 号)。
    • 根据编号,找到对应的内部流程或负责人(服务分发)。
    • 由相应的流程或负责人执行申请(如发放办公用品)(执行服务)。
    • 处理完成后,前台人员把结果(物品或批复)准备好(设置返回值)。
    • 通知员工处理完毕(异常返回),员工拿到结果继续工作(应用程序继续执行)。

为什么需要 SVC_Handler?

  • 权限隔离: 强制应用程序通过一个明确定义的、受控的接口来请求特权操作和访问资源,防止用户程序直接乱动硬件或内核数据,提高系统安全性、稳定性和可移植性。
  • 提供标准接口: 操作系统通过一组预定义的 SVC 号提供服务,应用程序只需要知道调用哪个库函数(库函数隐藏了 SVC 指令的细节)。

在哪里定义?

SVC_Handler 通常在以下几种地方定义:

  1. RTOS (实时操作系统) 内核代码: 操作系统自身需要提供这个处理程序作为核心机制。
  2. 启动文件 (Startup File): 在嵌入式裸机 (Bare-Metal) 开发或简单 RTOS 中,SVC_Handler 的向量表入口通常在芯片厂商提供的启动文件 (如 startup_stm32fxxx.s) 中预先声明为一个名为 SVC_Handler 的弱符号 (Weak)。这意味着:
    • 开发者可以在自己的应用代码中重新定义一个名为 SVC_Handler 的函数,它就会覆盖启动文件中的弱定义,成为实际的处理程序。
    • 如果开发者没有定义自己的 SVC_Handler,那么链接器会使用启动文件中默认的(可能是一个死循环或空函数)。
  3. 向量表: 无论在启动文件还是链接脚本中,都确保 SVC 异常向量(在向量表中通常位于固定偏移位置)指向了 SVC_Handler 函数的入口地址。对于 Cortex-M3/M4,SVC 异常号是 11。

示例 (简化的 C 语言片段 - 概念性):

// 在您的应用程序代码中定义 SVC_Handler
void SVC_Handler(void) {
    // 1. 从堆栈上保存的 PC 指向的 SVC 指令中提取立即数 (SVC Number)
    uint8_t svc_number;
    // ... (需要内联汇编或特定技巧获取,具体实现依赖编译器和架构)

    // 2. 根据 SVC 号调用具体的服务函数
    switch(svc_number) {
        case 0:
            svc_service_0(); // 例如:初始化某个硬件
            break;
        case 1:
            svc_service_1(); // 例如:申请内存
            break;
        case 2:
            svc_service_2(); // 例如:释放内存
            break;
        // ... 其他服务
        default:
            // 处理未知的 SVC 号
            break;
    }
    // 3. 异常返回由硬件机制处理,通常在函数退出时通过 LR 的值触发
}

// 某个库函数 (提供给应用程序调用的 API)
void my_system_function(void) {
    // ... 其他可能的操作
    __asm__ volatile("SVC #1"); // 执行 SVC 1 请求服务
    // ... 可能会有处理返回值的操作
}

总结:

SVC_Handler 是 ARM Cortex-M 系统中处理 Supervisor Call (SVC) 异常关键中断服务程序。它负责在用户应用程序通过 SVC 指令请求特权服务时,提取服务号,分派到具体的服务函数执行,并在完成后返回应用程序。它是实现操作系统系统调用接口的基础机制之一,对保证系统的安全性和稳定性至关重要。

你需要关于如何在特定开发环境 (如 Keil, IAR, GCC) 或特定芯片 (如 STM32) 上实现 SVC_Handler 的具体代码示例吗?

在调试模式下,FreeRTOS在prvPortStartFirstTask函数中停留在“svc 0”是怎么回事?

prvPortStartFirstTask 函数中的“svc 0”它与 PME 工具。 经过一些探索,SVC_Handler 中断似乎有问题。我尝试了不同的优化和调试级别,但它不起作用。3 个中

阿什顿信道 2023-04-27 08:01:38

FreeRTOS源码移植点灯不亮的原因

#define vPortSVCHandlerSVC_Handler并在#include "stm32f10x_it.h" 中注释掉//void PendSV_Handler(void)和//void SVC_Handler(void),成功点亮LED。

心神辰巍 2021-08-23 08:48:32

CH579M运行一段时间后出现死机现象怎么解决?

CH579M+UDP SERVER+usart1+IO输入输出控制 。调试通过,各个功能正常,运行一段时间后出现死机现象。正常运行闪烁的指示灯,都不闪了。经调试发现进入SVC_Handler。将芯片

香奈儿苦苦奶茶 2022-10-12 08:02:41

STM32F103移植FreeRTOS 时port.c出现的错误的解决办法?

:port.c错误位置:开始怀疑跟void SVC_Handler(void)void PendSV_Handler(void) void SysTick_Handler(void)这三个中断有关,但是按照

jsjdfsdf 2020-07-24 07:28:26

请问程序死在了SVC_Handler是什么原因造成的

请问FreeRTOS在FreeRTOSConfig.h中怎么配置中断?只配置了#define configPRIO_BITS 4#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0x0f#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 0x01#define configKERNEL_INTERRUPT_PRIORITY (configLIBRARY_LOWEST_INTERRUPT_PRIORITY

davidliu9518 2020-06-18 04:35:31

MounRiver调试进HardFault_Handler老是进硬件故障中断是为什么?

HardFault_Handler(void) __attribute__((interrupt(/*"WCH-Interrupt-fast"*/)));void SVC_Handler(void

LEON1985 2022-05-13 06:20:53

中断中的上下文切换详解

状态(比如进行信号量post),一定是走的SVC_Handler入口,RTX的任务上下文中的上下文切换,实际上是在SVC_Handler入口中统一实现的;而systick中断的上下文切换处理,RTX

杀狼000 2023-03-23 17:18:45

「正点原子Linux连载」第十七章GPIO中断试验(二)

*/9ldr pc,=SVC_Handler /* SVC(Supervisor)中断*/10ldr pc,=PrefAbort_Handler/* 预取终止中断 */11ldr pc

正点原子运营官 2019-12-24 15:24:40

FreeRTOSV8.2.3在探索者开发板上的移植怎么实现?

SVC_Handler(void){}void PendSV_Handler(void){}void SysTick_Handler(void){ }3、修改FreeRTOSConfig.h里的相关功能

keith3000 2020-07-30 08:02:36

【 国民技术N32G4FR开发板试用体验】FreeRTOS移植

,PendSV_Handler()与SVC_Handler()这两个很重要的函数都帮我们实现了,在在port.c文件中已经实现xPortPendSVHandler()与vPortSVCHandler()函数,防止

ouxiaolong 2022-12-24 09:08:40

ARM Cortex-M3 NXP LPC1768芯片是怎样启动的呢

HandlerDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD SVC_Handler ; SVCall

熊本熊 2022-06-14 16:01:54

浅析基于GD32F427适配RTX4+调试组件Event Recorder

Tick_Timer,时钟使用systick,主频200000000Hz,Tick 1000us。4.屏蔽gd32f4xx_it.c中void SVC_Handler(void) void

最强海贼王 2022-12-21 09:39:09

编译错误..\Output\BasicTim.axf: Error: L6218E: Undefined symbol time (referred from stm32f10x_it.o).

){}}/*** @briefThis function handles SVCall exception.* @paramNone* @retval : None*/void SVC_Handler(void

mecca7aa 2022-03-01 21:15:40

在GD32F427V-START开发板上如何移植FreeRTOS呢

void SVC_Handler(void)void PendSV_Handler(void)void SysTick_Handler(void)三个函数,然后由于freertos要使用systick

szj0213 2022-12-29 16:01:25

讨论ARM mbed OS(RTX) 的上下文切换

/irq_cm4f.S */SVC_Handler: /* 在 SVC 处理函数入口处,通过 EXC_RETURN(LR) 判断发起 SVC 调用的代码使用的是 MSP 还是 PSP* 《权威指南

shsfsdfsg 2023-02-16 14:26:39

如何通过GCC为ARM构建一个简单的代码?

*/ .long 0 /* 保留 */ .long SVC_Handler /* SVCall 处理程序 * / .long DebugMon_Handler /* 调试监视器处理程序 */ .long

liutiefu 2023-05-24 07:23:48

在GD32F427开发板上移植FreeRTOS并创建任务

SysTick_Handler(void)、void SVC_Handler(void)三个中断处理有重复定义,我是把gd32f4xx_it.c中的文件屏蔽掉,留下FreeRTOS中定义的几个函数

chunhuahua 2022-12-14 16:33:09

「正点原子Linux连载」第七章 ARM汇编基础

,=Undefined_Handler bx r0/* SVC中断 */SVC_Handler: ldr r0,=SVC_Handler bx r0/* 预取终止中断 */PrefAbort_Handler: ldr r0

正点原子运营官 2019-12-14 15:24:44

【国民技术N32项目移植】自行车码表项目 3.系统移植

,这里把 FreeRTOSConfig.h 也添加到组内:5.基本文件已经添加完毕,编译一下。一般会出现SVC_Handler、SysTick_Handler相关错误,这里没有报,检查了下

bukaopudemao 2023-02-15 17:06:44

【CW32饭盒派开发板试用体验】5. 极简方式移植FreeRTOS成功

interrupts_cw32f030.c文件中将函数实现 SVC_Handler, PendSV_Handler注释掉,在 cw32f030_systick.c中将函数 SysTick_Handler注释掉即可。 之后编译不会再报错

hehung 2023-06-02 23:08:21

【正点原子FPGA连载】附录A2 ARM汇编基础-领航者ZYNQ之linux开发指南

, =Undefined_Handlerbx r0/* SVC中断 */SVC_Handler:ldr r0, =SVC_Handlerbx r0/* 预取终止中断 */PrefAbort_Handler:ldr r0

正点原子运营官 2020-09-20 17:18:18

【RA4M2设计挑战赛】+时钟配置与Systick测试

*/ .long 0 /*Reserved */ .long 0 /*Reserved */ .long SVC_Handler/*-5 SVCall Handler */ .long

jf_1137202360 2023-03-05 07:15:44

【RA-Eco-RA4M2-100PIN开发板】程序启动过程,中断,时钟初始化等分析

*/ SVC_Handler,/*SVCall Handler*/ DebugMon_Handler,/*Debug Monitor Handler*/ 0,/*Reserved

jf_1137202360 2022-11-16 18:01:23

在GD32F310开发板上使用六位半万用表测试ADC精度

SVC_Handler(void)// {// }// void PendSV_Handler(void)// {// }// void

liutiefu 2022-11-07 16:25:10

在IAR环境中移植和简单使用RTX5文件

内核使用了SVC_Handler、PendSV_Handler和SysTick_Handler这三个系统中断所以要把gd32f4xx_it.c中的中断函数删掉,需要注意的是开发板中的毫秒延时

牛牛爱吃草 2022-12-01 15:39:47

「正点原子Linux连载」第十七章GPIO中断试验(一)

; Reserved10 DCD 0 ; Reserved11 DCD 0 ; Reserved12 DCD SVC_Handler ; SVCall Handler13 DCD DebugMon_Handler

正点原子运营官 2019-12-24 15:23:24

SVG与SVC无功补偿原理区别

SVG是静止无功发生器的意思,而SVC是无功补偿器的意思,那么SVG与SVC之间的区别是什么呢?

2022-01-01 17:50:00

Trigger Handler

handler

2023-02-23 09:04:12

RT-Thread STM32系统启动文件分析

,Default_Handler.weakUsageFault_Handler.thumb_set UsageFault_Handler,Default_Handler.weakSVC_Handler.thumb_set SVC_Handler

小句句63 2022-05-05 15:54:10

SVC241D-05A

SVC241D-05A - SVC Varistors Type - SAMWHA ELECTRIC

2022-11-04 17:22:44

加载更多
相关标签