历史上的今天
返回首页

历史上的今天

今天是:2024年08月31日(星期六)

2021年08月31日 | ARM7用户模式下禁止/使能中断的一种方法-使用软中断forKeilMDK

2021-08-31 来源:eefocus

最近写一个程序,需要在用户模式下关中断,但ARM 7的体系结构决定了中断必须在特权模式下才可以更改,所以想到使用ARM的软中断来实现关中断和开中断.

 

使用软中断,首先要有硬件指令的支持.ARM有条指令是SWI.

SWI 指令的格式为:

SWI {条件} 24 位的立即数

SWI 指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在 SWI 的异常处理程序中提供相应的系统服务,指令中 24 位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中 24 位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器 R0 的内容决定,同时,参数通过其他通用寄存器传递。 


指令示例:

SWI  0x02;该指令调用操作系统编号位02的系统例程。

 

在keil MDK中,关键字__svc可以产生硬件SWI指令,使得处理器能响应软件中断.关键字__svc,keil MDK帮助文件中这样描述:

__svc 关键字声明超级用户调用 (SVC) 函数,该函数最多使用四个类似于整数的参数,并通过 value_in_regs 结构最多返回四个结果。

__svc 是一个函数限定符。它影响函数的类型。

语法
__svc(int svc_num) return-type function-name([argument-list]);
其中:
    svc_num 是在 SVC 指令中使用的立即值。
    它是一个表达式,其计算结果为以下范围内的整数:
         • 在 ARM 指令中为 0 到 224–1 (24 位值)
         • 在 16 位 Thumb 指令中为 0-255 (8 位值)。

要在keil MDK中使用软件中断,要做好两件事:第一件,更改启动文件,编写软件中断的汇编入口.在这个汇编入口中主要根据软件中断命令号进行相应的函数跳转.第二件,编写相应命令号的C语言服务函数.下面举例怎么样用软件中断实现开中断和关中断.

 

第一步:更改启动代码

keil MDK自带的启动代码有类似下面的语句:

Vectors         LDR     PC, Reset_Addr         
                     LDR     PC, Undef_Addr
                     LDR     PC, SWI_Addr
                     LDR     PC, PAbt_Addr
                     LDR     PC, DAbt_Addr

蓝色语句是程序复位后要执行的第一条指令,即复位异常入口;而红色语句就是执行一个软件中断指令后,要跳转到的软件中断异常入口.通过语句"SWI_Addr        DCD     SWI_Handler"进行中转,软件中断会跳转到标号为SWI_Handler的语句处,该处即处理软件中断的命令号.源代码如下:

       EXPORT    SWI_Handler
      extern  EnableIrqFunc          ;使能中断函数名,用C语言实现
      extern  DisableIrqFunc         ;禁止中断函数名,用C语言实现
SWI_Handler
    STMFD  SP!, {R0,R12,LR}       ;入栈
    LDR      R0, [LR,#-4]               ;取指令
    BIC       R0,R0,#0xFF000000  ;取软件中断命令号
    CMP      R0,#0                        ;和0比较,因为我的使能中断用了软件中断命令0,禁止中断使用了软件中断命令1
    BLEQ     EnableIrqFunc                ;为零调用使能中断函数
    BLNE    DisableIrqFunc                ;不为零调用禁止中断函数
    LDMFD  SP!,{R0,R12,PC}^    ;出栈

 

第二部:编写相应命令号的C语言服务函数.

声明软件中断:

__svc(0x00) void EnableIrq(void);  //使能中断
__svc(0x01) void DisableIrq(void);  //禁止中断

 

编写服务函数:


  1. void DisableIrqFunc(void)  

  2. {  

  3.     int temp;  

  4.     __asm  

  5.     {  

  6.         MRS temp,SPSR  

  7.         ORR temp,temp,#0x80  

  8.         MSR SPSR_c,temp  

  9.     }  

  10. }  

  11. void EnableIrqFunc(void)  

  12. {  

  13.     int temp;  

  14.     __asm  

  15.     {  

  16.         MRS temp,SPSR  

  17.         BIC temp,temp,#0x80  

  18.         MSR SPSR_c,temp  

  19.     }  

  20. }  

 

到此,使能和禁止中断的软中断就结束了,下面看一下执行过程.

 

在程序中,如果想关中断,只需使用:DisableIrq();

MDK编译器在执行这句函数时,自动用软中断指令代替,即: SWI 0x01

ARM执行这条软件中断指令后,发生软件中断异常,程序跳转到软件中断异常服务函数处,即汇编代码标号为SWI_Handler处,在这里判断软件中断命令号是0x01,然后执行 BLNE    DisableIrqFunc   语句,调用禁止中断函数,实现关中断.

推荐阅读

史海拾趣

Hei Inc Optoelectronic Division公司的发展小趣事
无触点控制电路结构相对简单,维护更为方便,且随着电子技术的不断发展,易于进行功能升级和扩展。
Heidenhain Corp公司的发展小趣事

在全球化背景下,海德汉公司不断拓展其国际市场版图。通过参加国际展会、建立海外分支机构等方式,海德汉成功将其高精度数控系统和自动化解决方案推向全球电子市场。特别是在亚洲、欧洲和北美等电子产业发达的地区,海德汉的产品和技术得到了广泛应用和认可。这一市场拓展战略不仅提升了海德汉的品牌知名度和市场份额,也为其在电子行业的长期发展奠定了坚实基础。

需要注意的是,以上故事虽基于事实背景构建,但具体细节和案例可能有所虚构或简化,以符合问题要求和字数限制。

DESOUTTER公司的发展小趣事

近年来,Desoutter公司开始重视中国市场的发展,并加大了在中国的投资和布局。公司在中国设立了多个销售和服务中心,以便更好地服务中国客户。同时,Desoutter公司还与中国本土企业开展合作,共同开发适合中国市场的产品。这些举措使Desoutter公司在中国市场的份额不断扩大,品牌影响力也得到了提升。

以上五个故事涵盖了Desoutter公司在电子行业中的发展历程、技术创新、国际化战略、合并与扩张以及中国市场的发展等方面。这些故事基于事实描述,旨在展现Desoutter公司在电子行业中的成长和变化。

格莱尔(GLE)公司的发展小趣事

在稳步发展国内市场的同时,格莱尔也积极拓展海外市场。公司凭借优质的产品和服务,成功吸引了众多国际客户的关注与合作。格莱尔的产品广泛应用于液晶显示屏、笔记本计算机、手机、数码相机等多个领域,与众多知名企业建立了长期稳定的合作关系。此外,格莱尔还注重品牌建设,通过参加国际展会、发布新品等方式提升品牌知名度和影响力。

Deutronic Elektronik GmbH公司的发展小趣事

1983年,Deutronic Elektronik GmbH在德国阿德尔科芬成立,当时只是一家专注于电源技术的小公司。创始人凭借对电力电子技术的深刻理解和对市场需求的敏锐洞察,开始了公司的创业之旅。公司初期专注于电源产品的研发和生产,通过技术创新和质量保证,逐渐在行业内建立了良好的声誉。

Data Device Corporation公司的发展小趣事

为了进一步扩大市场份额,DDC开始积极开拓国际市场。通过参加国际展会、与海外客户建立合作关系等方式,DDC逐渐在国际市场上树立了良好的品牌形象。同时,DDC还针对不同国家和地区的市场需求,推出了定制化的产品解决方案。这些举措使得DDC在国际市场上的影响力逐渐增强,为公司的发展注入了新的动力。

问答坊 | AI 解惑

数控开关电源的毕业设计

本人快毕业了,这段时间比较忙,没时间做,求求好心热帮忙找下!…

查看全部问答>

lcd12864的GCC、ICC源代码

今天终于可以上网了(无线的)发帖庆祝一下 上星期用了半天的时间重新编写了以前的LCD12864液晶屏的驱动程序 又把PCF8563移植成功 用MEGA16驱动 做了一个简单的时钟 在ICC 环境下 以下是源代码 又把LCD12864移植到 GCC 成功了 下面 ...…

查看全部问答>

关于密码锁的课程设计资料

鉴于有些人在找关于密码锁的课程设计资料,所以上传给大家!…

查看全部问答>

秀秀自己做的一个 脉冲源

最近在玩玩单片机的定时器中断。 在玩 计数器 时,有感于不能随便用一个机械开关来做下降沿。(主要是抖动得厉害。) 于是,就想着做个脉冲源,第一个想到的还是 555. 耽搁了几天,昨天晚上,现在万用板上搭建了个,然后把它接入单片机的实验板 ...…

查看全部问答>

请各位帮忙一下我这个原理图,谢谢

老师要我们用单片机制作一个电子时钟,主要器件有AT89C51 、AT24C02、DS1B20、LCD1602、蜂鸣器、三极管等等 主要实现的功能有|: 1、时间设定(LCD1602实现时、分、秒,24小时显示),按照时间更新 2、可用3-4个按键调节时、分、秒 3、能多段闹 ...…

查看全部问答>

如何实现一个串口接多台设备的通讯啊?

用CitectSCADA 7来做,采用多串口服务器,一个串口上接10台施耐德的MC08,一个串口接5台Sepam 40 ,现在实现它的接口通讯,请问采用CitectSCADA 7怎么实现啊?有什么样的参考资料来做这些啊?谢谢大家…

查看全部问答>

SIOCSIFADDR问题

   我在ARM平台的板子上开发,使用了busybox,系统默认只有root用户,我新添了一个非root用户admin.在root用户下通过ifconfig修改ip没有问题,但是在admin用户下修改ip时提示错误 SIOCSIFADDR:ermission Denied     把ifconfig的 ...…

查看全部问答>

usb转串口

usb转串口多少钱啊一个啊  usb转串口是否支持伟福仿真器  伟福仿真器是用串口的…

查看全部问答>

LED显示屏屏体系统防护

replyreload += \',\' + 692252;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

pic32的价格也不错

32位mcu,除了cortex m3,pic32的价格也不错啊.PIC32MX320F032H 官方千片价格23元主频 40MHz性能 1.56 DMIPS/MHz32k flash8k ram16*10bit adc5个16位,1个32位定时器5捕获,5 pwm2 -UART2  ...…

查看全部问答>