ARM的SWI异常中断处理程序设计.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ARM的SWI异常中断处理程序设计

ARM的SWI异常中断处理程序设计 通过SWI异常中断指令,在用户模式下应用程序可以调用系统模式下的代码。在实时操作系统中,通常使用SWI异常中断为用户应用程序提供系统功能的调用。 一.SWI异常中断处理程序的实现 在SWI指令中包括一个24位的立即数(中断调用号),该立即数指示了用户要请求的特定功能,所以需要在SWI的异常中断中读取这个中断号,然后根据中断号,来调用相应的处理程序。 处理过程:(1)SWI中断处理程序为汇编程序,用于确定SWI指令中的24位的立即数。 (2)SWI异常中断处理的功能服务程序是具体实现SWI的各个功能,既可用汇编语言,也可用C语言编程。 1.用汇编语言编写的SWI异常中断处理程序 由于SWI异常中断处理程序属于底层操作,所以必须用汇编语言编写。如下例所示:SWI异常中断处理程序中的 bl swi_service_func指令用于调用第2步的SWI异常中断处理的功能服务程序,此函数用于实现SWI的各个功能。 汇编语言编写的第1步SWI异常中断处理程序 2.SWI异常中断处理的中断服务程序 (用汇编写的) 为了具体实现SWI的各个功能,须编写SWI异常中断处理的功能服务程序,它既可以是汇编语言又可以是C语言。 用C语言编写的第2步SWI异常中断处理的中断服务程序。用C语言编写的第2步SWI异常中断处理的中断服务程序的函数原型如下: void swi_service_func(unsigned int number,unsigned int *reg) 注:参数number是SWI的中断调用号,是利用从中断处理函数获得的中断调用号。 参数reg是SWI 异常中断第1步中中断处理程序传递来的数据栈指针。 在第1步的SWI异常中断处理程序调用第2步中断处理程序的操作如下: mov r1,sp ;根据ATPCS将r1中的值作为第二参数传入 bl swi_service_func ;调用功能服务函数,中断调用号通 过r0传入,参数通过r1传入 第2步SWI异常中断处理的中断服务程序代码如下: void swi_service_func(unsigned int number,unsiged int *reg) { unsigned int reg1,reg2,reg3,reg4; //获取 SWI传入的参数 reg1=reg[0]; reg2=reg[1]; reg3=reg[2]; reg4=reg[3]; switch(number) { case 0: //do something break; 二、SWI异常中断调用 1.特权模式下调用SWI 执行SWI指令后,系统将会把CPSR寄存器的内容保存在寄存器SPSR_svc中,将返回地址保存在寄存器LR_svc中。如果在执行的SWI指令已经在svc模式下时,这时SPSR_svc和LR_svc中的内容就会被破坏。因此在特权模式下调用SWI功能(执行SWI指令),就必须将原始的寄存器SPSR_svc和LR_svc的值保存在数据栈中。 二、SWI异常中断调用 2.从应用程序中调用SWI (1)使用汇编指令调用特定的SWI功能 (2)用C程序调用特定的SWI功能 注意:汇编指令调用特定的SWI功能只要将所需的参数按ATPCS要求放置在相应的寄存器中,然后在指令SWI中指定相应24位立即数即可。 例:用汇编指令实现SWI的调用。SWI中断处理程序所需的参数放在寄存器r0中,然后调用功能号0x0的SWI功能调用。 MOV r0,#100 SWI 0x0 二、SWI异常中断调用 2.从应用程序中调用SWI C程序中调用特定的SWI功能比汇编语言调用要复杂一些,因为C语言中调用特定的SWI 特定功能需将C程序的子程序调用映射到一个SWI异常中断处理程序。这些被映射的C语言子程序使用编译器伪操作_ _SWI来声明。该子程序所需的参数和返回的结果放在R0~R3中,则该SWI可以被视为inline,不需要使用子程序调用过程;否则必须告诉编译器通过结构数据类型来返回参数,这时需要使用编译器伪操作_value_in_reg声明该C语言子程序。 例:提供4个SWI功能调用,功能号分别为0x00,0x01,0x02,0x03。其中SWI 0x0和SWI0x1使用两个整型的输入参数,并返回一个结果值;SWI 0x2使用4个输入参数,并返回一个结果值;SWI0x3使用4个输入参数,并返回4个结果。 C程序中调用特定的SWI功能程序代

文档评论(0)

didala + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档