STM32 SVCall

发布者:徽宗古泉最新更新时间:2018-12-26 来源: eefocus关键字:STM32  SVCall 手机看文章 扫描二维码
随时随地手机看文章

一个特殊的中断:SVCall


简述:一种由程序进行触发的中断,默认开启


起源:SVC(系统服务调用,亦简称系统调用)多用于在操作系统之上的软件开发中。SVC 用于产生系统函数的调用请求。例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件。因此,当用户程序想要控制特定的硬件时,它就会产生一个 SVC 异常,然后操作系统提供的 SVC 异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。


用途:可以通过设置,使得一段代码能够被某些中断打断,而不能被另外一些中断打断,比如可用于确保模拟IIC的时序不被打断而造成通信失败


注意:


SVC  异常是必须立即得到响应的(若因优先级不比当前正处理的高,或是其它原因使之无法立即  响应,将引发HardFault)

 

主从优先级等等概念和普通中断相同(且地位相同,即该特殊中断其实也不特殊)//祝:默认情况下,除HardFault和NMI,其它中断的优先级均为0,0(附加提醒,group设置需先于priority设置),!!BUT!!,中断优先级的设置需要这么调用:NVIC_SetPriority(SVCall_IRQn,NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 1, 1));

 在C中使用SVCall


  SVC服务函数使用堆栈进行参数传递,故C语言版的SVC服务函数需要一个汇编操作,用于把堆栈中的参数提取到寄存器中


 



__asm void SVC_Handler(void) //该函数名在Keil中同USART2_IRQHandler等等

{


//  汇编操作,用于提出堆栈帧的起始位置,并放到R0中,然后跳转至实际的SVC服务例程中 

IMPORT svc_handler 

TST LR, #4 

ITE EQ 

MRSEQ R0, MSP 

MRSNE R0, PSP 

B svc_handler 

}


// “真正”的服务函数,接受一个指针参数(pwdSF):堆栈栈的起始地址。 

// pwdSF[0] = R0 , pwdSF[1] = R1 

// pwdSF[2] = R2 , pwdSF[3] = R3 

// pwdSF[4] = R12, pwdSF[5] = LR 

// pwdSF[6] = 返回地址(入栈的PC) 

// pwdSF[7] = xPSR 

unsigned long svc_handler(unsigned int* pwdSF) 

unsigned int svc_number; 

unsigned int svc_r0; 

unsigned int svc_r1; 

unsigned int svc_r2; 

unsigned int svc_r3; 

int retVal; //用于存储返回值 

svc_number = ((char *) pwdSF[6])[-2]; // 没想到吧,C的数组能用得这么绝! 

svc_r0 = ((unsigned long) pwdSF[0]); 

svc_r1 = ((unsigned long) pwdSF[1]); 

svc_r2 = ((unsigned long) pwdSF[2]); 

svc_r3 = ((unsigned long) pwdSF[3]); 

printf (“SVC number = %xn”, svc_number); 

printf (“SVC parameter 0 = %x\n”, svc_r0); 

printf (“SVC parameter 1 = %x\n”, svc_r1); 

printf (“SVC parameter 2 = %x\n”, svc_r2); 

printf (“SVC parameter 3 = %x\n”, svc_r3); 

//做一些工作,并且把返回值存储到retVal中 

pwdSF[0]=retVal; 

return 0; 

}


//注意,这个函数返回的其实不是0!进一步地,灰色的文字只是用于哄编译器开心的,具体参考Cortex-M3权威指南P169


如何触发中断?


step1.  声明函数(__svc会自动生成对应函数)//__svc时keil里的一个宏


unsigned long __svc(0x03) CallSvc3(unsigned long svc_r0, unsigned long 

svc_r1, unsigned long svc_r2, unsigned long svc_r3);

 


step2. 调用函数


unsigned long svcRet; //系统服务的返回值 

svcRet=CallSvc3(p0, p1, p2, p3); // 呼叫3号系统服务,并且传递4个参数,依次为:p1,p2,p3,p4,再接收返回值到svcRet中(别忘了,这个返回值的来历不寻常)


关键字:STM32  SVCall 引用地址:STM32 SVCall

上一篇:STM32之系统中断处理
下一篇:STM32单片机IO中断实现步骤

推荐阅读最新更新时间:2024-03-16 16:21

stm32之TFT触摸屏:通过LCD_ShowChar显示的过程分析
使用TFT触摸屏时,想要对字符串,图形或者数字进行显示时,发现他们的库函数中都有一个最重要的函数LCD_ShowChar,貌似目前很少有人分析这个函数,虽然简单但是还是有点绕的。 先贴一下这个函数的代码,由于函数显示分为叠加显示和非叠加显示,原理类似,所以只分析非叠加方式的部分应该就都懂了。 void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode) { u8 temp,t1,t; u16 y0=y; u16 colortemp=POINT_COLOR; num=num-' ';//得到偏移后的值 if(!mode) //非叠加方式 {
[单片机]
<font color='red'>stm32</font>之TFT触摸屏:通过LCD_ShowChar显示的过程分析
STM32自动量程电压表设计方案
0 引言 在智能仪器中,常常用到自动量程转换技术,这使得仪器在很短的时间内自动选取最合适的量程实现高精度的测量。自动量程的实现一般通过控制输入信号的衰减放大倍数实现,就电压表来说其输入测量电压会大于其AD 转换器的输入范围,所以它的量程切换基本上是信号衰减倍数切换的过程。 1.系统整体方案与工作原理 系统功能框图如图1所示。STM32F103ZET6处理器是本系统的核心器件,负责控制整个系统的正常工作,包括读取AD 转换后的结果及200mV 与2V 档位的控制;按键输入动作响应;段式液晶的驱动;量程自动转换控制等。 系统功能框图 输入的电压信号经过量程转换模块,变成可供ADC模拟输入端能正常进行采样的电压。交流电压测量
[单片机]
<font color='red'>STM32</font>自动量程电压表设计方案
STM32学习之串口的使用
串口的使用 1、为什么要用串口? 自上一篇写的时间是1月20号,今6月7号了,半年没更新了。 这半年发生了什么?过完年就去找公司实习,在那里自我感觉进步很大。其实在公司大多都是自学,师傅基本不会给你说什么。但这并不能说明你的师傅对你不好,带我的那个师傅只比我高一届,但他的水平比我高的好多届。他也是自学,也没人告诉他该怎么做,因为老板也不太懂。所以自学能力很重要,当然有人带你的话,这样会更好。 不说这些了,串口在调试的时候作用非常大。也学我们在学51的时候,只是将程序下载到开发板,看看是否能运行起来,通过数码管将结果显示出来,从而就知道程序设计的正确性。以前我也是这样做的,没什么不好。 在公司实习的时候,他们调试都是使用
[单片机]
<font color='red'>STM32</font>学习之串口的使用
STM32意外复位问题调试
最近在使用STM32座项目时遇到一个奇怪的问题。系统一开始运行很正常但是在长时间运行之后会随机的出现STM2单片机无故产生复位的问题。因为在调试的过程中收获颇多,所以打算记录一下这一次的调试过程。 首先做问题分析,既然单片机在运行一段时间之后会产生复位。那具体是什么原因引起的单片机复位呢?拍脑子一想会不会是没有及时喂狗导致看门狗溢出引起的复位。为了证明这一点我们查询了stm32的数据手册有关于复位源的介绍 由上面的描述我们可以知道在RCC_CSR中记录了单片机复位的类型。因此我们只要在单片机启动时去读取该寄存器中的对应状态位即可判断出单片机上一次是因为何种原因产生复位的。注意:RCC_CSR寄存器是需要软件清除的。如
[单片机]
<font color='red'>STM32</font>意外复位问题调试
stm32单片机进入休眠(STOP)模式后无法下载程序等问题解决
利用stm32单片机的休眠模式,使单片机间歇的休眠从而实现低功耗的目的。往往会出现进入休眠后无法唤醒,导致下一次程序烧不进去。通常的解决办法是:一般的开发板或单片机最小系统都会有复位键,按住复位键,点下载,然后松开复位键即可。 我遇到的问题是:误入了stm32(STM32L051C6T6)的STOP模式,又没有写入相应的唤醒方法,导致后续的程序不能下载。使用MDK5 点击load时总会出现No target connected。自己设计的最小系统又没有加入复位键。。。 有以下几种解决办法: 1、可以将单片机的NRST引脚引出来,外接复位键。(关于引脚查看可用ST官方软件STM32cubeMX,很方便) 2、通过IS
[单片机]
<font color='red'>stm32</font>单片机进入休眠(STOP)模式后无法下载程序等问题解决
STM32】5分钟了解STM32的串口通信
一、串口通信简介 1.1 百度百科解释 来源百度百科 串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。 1.2 通信接口 1.3 串口通信分类 ▲ 全双工、半双工和单工 1.4 STM32串行通信的通信方式 插播一条反爬虫信息,读者可以忽略: 二、STM32的串口通信 ▲ USART 功能框图 2.1 功能引脚 TX: 发送数据输出引
[单片机]
【<font color='red'>STM32</font>】5分钟了解<font color='red'>STM32</font>的串口通信
STM32-GPIO的配置和使用
1.寄存器介绍 STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 个 32 位的端口配置寄存器CRL 和 CRH;2 个 32 位的数据寄存器IDR 和 ODR;1 个 32 位的置位/复位寄存器BSRR;一个 16 位的复位寄存器 BRR;1 个 32 位的锁存寄存器LCKR;这里我们仅介绍常用 的几个寄存器,我们常用的 IO 端口寄存器只有 4 个:CRL、CRH、IDR、ODR,即端口配置寄存器和数据寄存器。 1.1端口配置寄存器(CRL和CRH) CRL:每个 IO 端口的位占用 CRL 的 4 个位,高两位为 CNF,用来配置端口的模式,低两位为 MODE,用来配置端口的最大输出速度
[单片机]
STM32-GPIO的配置和使用
基于STM32物联网开发板(4)--LCD屏
1.概述 屏幕尺寸为1.3寸,分辨率240*240,颜色格式RGB565,驱动IC:ST7789VW; 超大可视角度:大于160°(显示屏中可视角度最大的一种屏幕); 宽电压供电(3V~5V),兼容3.3V和5V电平逻辑,无需电平转换芯片; 采用7线制SPI接口; 工作温度范围为工业级(-20℃~60℃); 军工级工艺标准,长期稳定工作; 硬件接口: 引脚 说明 LEDK PB0背光 CS PA4片选 SCL PA5时钟 SDA PA7主机输出 RES PB1复位脚(电平复位) D/C PC4数据命令选择脚 2.通讯协议 ST7789VW是一款用于262K彩色图形型TFT-LCD的单片
[单片机]
基于<font color='red'>STM32</font>物联网开发板(4)--LCD屏
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved