历史上的今天
返回首页

历史上的今天

今天是:2024年12月26日(星期四)

正在发生

2018年12月26日 | STM32 SVCall

2018-12-26 来源:eefocus

一个特殊的中断: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中(别忘了,这个返回值的来历不寻常)


推荐阅读

史海拾趣

Ford Aerospace & Communications Corp公司的发展小趣事

随着航空业的逐渐发展,福特汽车公司意识到航空通信技术的重要性。在20世纪30年代,福特开始投资研发航空无线电通信系统,旨在提高飞行中的通信效率和安全性。这一举措不仅促进了福特在航空技术领域的进一步拓展,也为后来的航空通信标准制定提供了参考。

Agilent Technologies公司的发展小趣事

在20世纪20年代,亨利·福特不仅专注于汽车制造业,还展现了对航空技术的浓厚兴趣。他资助了威廉·布什纳尔·斯道特(Willam Bushnell Stout)的飞机研发项目,这标志着福特向航空领域的初步探索。斯道特设计的福特三发飞机(后被称为“铁皮鹅”)虽未直接成为商业成功的典范,但它为福特汽车公司积累了宝贵的航空技术经验,也为后续可能的航空通信项目奠定了基础。

Base Two (2) Systems公司的发展小趣事

Base Two (2) Systems深知技术创新的重要性,因此不断加大对研发的投入。公司引进了一批高端研发人才和先进设备,为研发团队提供了强有力的支持。在研发团队的努力下,公司不断推出新产品,并对现有产品进行升级改进,以满足市场的不断变化和客户的多样化需求。

AITSEMI公司的发展小趣事

随着产品线的不断完善,AITSEMI公司开始积极寻求市场机会,并逐步在全球范围内建立销售网络。通过与各大消费电子品牌的紧密合作,AITSEMI的芯片产品成功应用于音频功放和电源管理等领域,为全球消费者提供了更优质的产品体验。同时,公司还积极拓展医疗、工业控制、照明等新兴市场,为公司的持续增长提供了强大的动力。

振宝佳(DMBJ)公司的发展小趣事

作为一家具有国际视野的企业,振宝佳公司始终坚持以质量为核心的发展理念。为了满足出口欧盟的质量要求,公司不断提升产品的品质和性能,加强质量控制和检验。经过多年的努力,公司终于成功获得了出口欧盟的资格认证。这一成就的取得不仅证明了公司的实力和能力,也为其在国际市场上赢得了更多的机会和声誉。

以上五个故事框架均基于振宝佳(DMBJ)公司在电子行业发展的实际情况进行编写,旨在展示公司在技术、市场、生产、质量等方面的努力和成就。请注意,这些故事仅为概述,具体细节和数据可能需要根据实际情况进行补充和完善。

EasySync公司的发展小趣事

经过几年的努力,EasySync公司在同步技术领域取得了重大突破,成功研发出一款高效、稳定的同步芯片。这款芯片不仅性能卓越,而且成本较低,受到了广大客户的青睐。随着产品销量的不断增加,公司开始拓展市场,将产品销售到全球各地,逐渐树立了品牌形象。

问答坊 | AI 解惑

新新新!!!多功能超级键盘

本帖最后由 paulhyde 于 2014-9-15 09:41 编辑 我们的键盘是4*4超级键盘,只用三个io口就可以控制16个键盘,最重要的是还带cpu中断,不但节约了端口,而且实现了cpu资源的节省,功能强大,使用方便,功能超级强大啊!!!!!!!!! 呵呵是有点 ...…

查看全部问答>

基于FPGA的键盘控制器的设计

引 言  由于CPLD的可再编程性质,可以将同一装置用于不同的键盘和产品,而收到高产量、低成本的效果,同时也节约了单片机的资源以做它用。可再编程的特点辅之简便易用的设计工具,使设计可以进行晚期更改,提高了产品设计的灵活性,降低了风险。 ...…

查看全部问答>

基于Windows CE的嵌入式操作系统实时性分析.pdf

基于Windows CE的嵌入式操作系统实时性分析.pdf…

查看全部问答>

LPC2210调试成功愿把心得与大家分享

来自:http://www.embedinfo.com/wen-list.asp?id=381   我不是最优秀的嵌入式开发人员,但我是优秀的,至少我每天都在不懈努力着……     以前是用51做东西的,虽然没有大的研究成果但自己研究的小产品也在被使用着,谈不上 ...…

查看全部问答>

系统定时的问题

*********************************************************************************************************** Function name:       InitSysTick** Descriptions:        ...…

查看全部问答>

关于wdm的菜鸟问题

我用向导生成的东西 直接编译怎么会有错呢 说:cannot open input file \'ntstrsafe.lib\' WDM入门怎么这么难呢?…

查看全部问答>

求教 linux设备usb驱动中的中断信号问题

近日在看linux下的嵌入式平台下的usb设备驱动,苦读代码之后始终没找到写入中断信号的地方,我在想中断信号是不是自己由usb控制器对控制数据解码后产生的呢? 问题: 中断信号是USB控制器的硬件产生的,还是由软件读取那8个字节的控制数据产生的? ...…

查看全部问答>

IO作为输入时,检测外管脚电平必须要将输出置高吗??

                                 我有两块板,程序一样,初始化时将输入管脚都通过GPIOWRITE(GPIOG,0X0000)输出0,结果一块板在可以检测到输入管 ...…

查看全部问答>

等离子清洗

LED封装工艺过程中,芯片表面的氧化物及颗粒污染物会降低产品质量,如果在封装工艺过程中的点胶前、引线键合前及封装固化前进行等离子清洗,则可有效去除这些污染物。…

查看全部问答>

国赛c题倒立摆的转轴选择

本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 国赛c题的倒立摆题目,大家是选什么材料当转轴D的?滑轮?滑轮会不会太滑,不好控制?还有什么其他好的材料用转轴的?    …

查看全部问答>