DSPBIOS软件中断(SWI)

合集下载

__swi软中断分析

__swi软中断分析

一.软中断SWI(software interrupt)软件中断,由用户定义的中断指令.可以用于用户模式下的程序调用特权操作指令.在实时操作系统中可以通过该机制实现系统调用.一个SWI 所做的一切就是把模式改变成超级用户并设置PC 来执行在地址&08 处的下一个指令!编程异常通常叫做软中断.软中断是通讯进程之间用来模拟硬中断的一种信号通讯方式。

中断源发中断请求或软中断信号后,CPU或接收进程在适当的时机自动进行中断处理或完成软中断信号对应的功能.软中断是软件实现的中断,也就是程序运行时其他程序对它的中断;而硬中断是硬件实现的中断,是程序运行时设备对它的中断。

1.软中断发生的时间是由程序控制的,而硬中断发生的时间是随机的。

2.软中断是由程序调用发生的,而硬中断是由外设引发的。

3.硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等待较长时间。

二.swi的使用1.SWI指令SWI{cond} immed_24其中,immed_24位24位立即数2.ADS编译器中软中断的规定ADS编译器规定,用户可使用关键字__swi作为前缀来声明一个利用软中断的调用,其格式如下:__swi(功能号) 返回值类型名称(参数列表);其中关键字__swi后面的括号中的字段叫做软中断的功能编号。

系统是根据这个编号在软中断服务程序户中来确定应执行的程序段的。

用户可以在用户程序中像调用一个普通函数那样实现软中断的调用。

只是该“函数”没有普通函数那样明显的函数实现体。

至于软件中断具体的函数实体后面会讲到。

利用软中断服务程序可以规避由于ARM处在不同工作模式时所造成的访问限制(如资源的访问限制)。

3 在Uc/OS-II中软中断来实现的函数的声明函数注册软中断号__swi(0x00) void OS_TASK_SW(void);__swi(0x01) void __OSStartHighRdy(void);__swi(0x02) void OS_ENTER_CRITICAL(void);__swi(0x03) void OS_EXIT_CRITICAL(void);__swi(0x40) void *GetOSFunctionAddr(int Index);__swi(0x41) void *GetUsrFunctionAddr(int Index);__swi(0x42) void OSISRBegin(void);__swi(0x43) int OSISRNeedSwap(void);__swi(0x80) void ChangeToSYSMode(void);__swi(0x81) void ChangeToUSRMode(void);__swi(0x82) void TaskIsARM(INT8U prio);__swi(0x83) void TaskIsTHUMB(INT8U prio);这些函数不是通常意义上的函数,只是可以让用户在应用程序中使用这些“函数名”去引发一个携带功能号的软中断SWI,即ADS编译器在编译这些函数时,把他们编译成SWI指令的二进制代码。

第二十六篇 SWI软件中断

第二十六篇 SWI软件中断

第二十六篇 SWI软件中断1.SWI修改CPSR前面学中断的时候曾经说过,如果CPSR得I位为1,则中断被禁止,如果CPSR 得F位为1,则快速中断被禁止,还好利用KEIL的启动代码进入main函数后,CPSR的I和F都为0。

但是有的启动代码不这样,或者我们就是要去修改CPSR该怎么办。

进入main函数中,由于处于用户模式下,CPSR是不允许修改的,只能利用SWI 来解决这个问题。

运行指令SWI后,系统进入管理模式,这时候就有修改CPSR和SPSR的特权了,注意我们要修改的是SPSR而不是CPSR,这是因为:进入管理模式后,CPSR的值被系统自动拷贝到管理模式的SPSR(即SPSR_svc),离开管理模式后,我们会用SPSR_svc去还原CPSR,所以对CPSR的修改时无效的(当然我们可以修改CPSR 而不去使它还原,不过这样有悖原则),如果修改SPSR,然后还原给CPSR,这样就行了。

下面做个程序,在用户模式下使I=1,F=0:主函数这样写,很简单://******************************************************************* //软件中断修改CPSR#include<LPC2103.H>int main(void){__asm{SWI 0} //内嵌汇编,调用SWI,这里立即数任意取while(1);}//*******************************************************************然后在启动代码中写该SWI的例程将SWI_Handler B SWI_Handler该为:SWI_HandlerMRS R0,SPSR ;SPSR的值为SWI之前的CPSR的值,将其取出BIC R0,#0X40 ;F位清零,允许fiqORR R0,#0X80 ;I位置一,禁止irqMSR SPSR_C,R0 ;修改过的值给SPSR的c域MOVS PC,LR ;返回,S表示用SPSR恢复CPSR仿真如下图:可见CPSR的I和F位被顺利修改2.SWI立即数作为参数使用上例中用的是SWI 0,立即数为0,这个立即数可以设定为24位任意值,这个立即数就会存在于这条指令之中,提取出这个立即数即可以实现不同功能的调用。

dsp原理与应用技术中的中断

dsp原理与应用技术中的中断

DSP原理与应用技术中的中断什么是中断中断是指当处理器执行某个任务时,受到一个信号或事件的触发而暂停当前任务,跳转到指定的中断处理程序执行,处理完成后再返回原来的任务。

在DSP(数字信号处理)领域中,中断机制起着重要的作用。

中断可以分为硬件中断和软件中断两种。

硬件中断是由外部设备或芯片发出的中断信号触发,如计时器中断、外部设备输入中断等。

而软件中断是由程序的执行过程中的特殊指令或软件的调用而产生的中断。

DSP中的中断在DSP中,中断主要用于处理实时要求较高的应用,如音频处理、实时图像处理等。

中断的出现可以有效地降低系统的响应时间,提高系统的实时性。

DSP芯片通常提供多个中断向量,每个中断向量对应一个特定的中断源。

中断向量用来指示中断处理程序的入口地址,当中断发生时,处理器会根据中断向量跳转到相应的中断处理程序。

DSP中的中断优先级在DSP中,不同的中断有不同的优先级。

当多个中断同时发生时,处理器会根据中断优先级决定响应哪个中断。

中断优先级通常通过特定的寄存器配置。

处理器会根据中断触发的先后顺序以及中断优先级来决定响应的中断。

DSP中的中断处理过程中断处理过程通常包括以下几个步骤:1.中断触发:当中断源产生中断信号时,处理器会检测中断信号,并做出响应。

2.中断优先级判断:处理器会根据中断优先级判断是否响应当前中断请求。

3.中断向量跳转:如果中断请求被接受,处理器会根据中断向量找到相应的中断处理程序的入口地址,并跳转到该地址处执行中断处理程序。

4.中断处理程序:中断处理程序是中断的实际执行部分,它会处理中断所需的任务,如保存寄存器状态、处理中断源的数据等。

5.中断结束:当中断处理程序执行完成后,处理器会返回到原来的任务继续执行,完成中断的处理过程。

DSP中的中断应用技术中断在DSP应用中有广泛的应用,如音频处理、图像处理、通信等方面。

下面列举几个常见的DSP中的中断应用技术:1.实时音频处理:中断机制可以使得DSP实时响应音频输入信号,实现实时的音频处理,如音效处理、语音识别、语音合成等。

DSPBIOS_例程分析_不同优先级软中断任务切换

DSPBIOS_例程分析_不同优先级软中断任务切换
精品开发资料交流请注册邮箱
精品开发资料交流请注册邮箱
4)处理.pinit 表:.pinit 表包含了初始化函数的指针; 5)调用应用程序主程序 main 函数:在所有 DSP/BIOS 模块初始化之后,调用 main 函数。此 时硬件中断和软件中断都是禁止的,应用程序可以在这里添加自己的初始化代码; 6)调用 BIOS_start 启动 DSP/BIOS:BIOS_start 负责使能 DSP/BIOS 模块并为每一个用到的 模块调用 MOD_startup 宏使其开始工作; 7)执行空闲循环:调用 IDL_loop 引导程序进入 DSP/BIOS 空闲循环,此时硬件和软件中断 可以抢占空闲循环的执行。空闲循环控制着和主机的通信,所以此时主机和目标之间的数据 传输就可以开始了。
Void main(Int argc, Char *argv[]) {
LOG_printf(&trace,"switest started!\n");
LOG_printf(&trace,"Main posts SWI0\n"); SWI_post(&SWI0);
LOG_printf(&trace,"Main done!\n"); }
这程序里主要有三个函数:主函数 main, swiFxn0 ,swiFxn1。 为了分析好这个程序我们先来看一下 DSP/BIOS 启动序列: 1)初始化 DSP:DSP/BIOS 程序从入口点 c_int00 开始运行,复位中断向量指向 c_int00 地 址; 2)用.cinit 段中的记录来初始化.bss 段; 3)调用 BIOS_init 初始化 DSP/BIOS 模块:BIOS_init 执行基本的模块初始化,然后调用 MOD_init 宏分别初始化每个用到的模块;

bios学习总结

bios学习总结
SWI_disable 8、 main函数中自动禁止SWI,main函数结束后自动开启SWI; 9、 某些DSP/BIOS API函数不能再main函数中调用,这是因为此时BIOS_start初始化操作还没执行,BIOS_start
负责使能全局中断、配置和启动定时器、打开线程调度使DSP/BIOS线程开始执行;《TI DSP-BIOS用户手册 与驱动开发》P59 10、 key=SWI_disable();对应的使能函数为:SWI_enable(key);变量key由SWI模块用来判断SWI_disable 是否被多次调用,这样可以实现SWI_disable/SWI_enable的嵌套调用,换句话说,一个任务在禁止或允许 软件中断时,不用去判断SWI_disable是都已在其他地方被调用;详细见 《TI DSP-BIOS用户手册与驱动 开发》P183
9、 任何时候用户都不应该将软件断点防止在不允许发生中断或停止的地方。但是CCS的halt命令或观测点则
能够在CPU处于不可被中断或不可被停止的代码区域使用;如果将INTM和DBGM位一起使用,则可保护此段 代码区域不会受到任何类型中断的打断;详细将《TI DSP-BIOS用户手册与驱动开发》P146 10、 软件中断提供了一个介于HWI和TSK之间的额外的优先级,用于处理那些时间限制比TSK严格单笔HWI 宽松的作业。HWI和SWI线程都会一直运行直到完成。SWI是的HWI可以将一些不太关键的处理委托给一个优 先级比他低的SWI线程,从而减少CPU在中断服务中花费的时间,使其他的HWI可以得到运行; 11、 正在运行的SWI线程在任何时刻都可以被硬件中断抢占,并且SWI线程会在硬件中断执行完毕后才恢 复执行; 12、 如果要在HWI中断服务程序内部调用任何可能触发软件中断的SWI函数,那么调用该函数的代码序列 必须被一堆HWI_enter和HWI_exit调用“包装起来”,要么使用HWI调度程序;详细见《TI DSP-BIOS用户手 册与驱动开发》P166 13、 SWI_create只能在任务级调用,而不能再HWI或其他SWI中调用。 14、 除了任务线程,所有DSP/BIOS中的线程使用同一个系统堆栈,当一个软件中断抢占其他线程时,系 统堆栈会用于保存寄存器现场环境。为了满足同一时刻出现的最大数量的线程抢占,每增加一个软件优先 级别,所需的系统堆栈大小都会随之增加,所以从堆栈大小的角度看,给所有的软件中断对象设置相同的 优先级别相比给每个软件中断对象设置不同优先级别效率会更高;详细见《TI DSP-BIOS用户手册与驱动 开发》P170 所需系统堆栈大小的估计值会显示在配置工具顶部的状态栏上;P170

[参考]swi软中断

[参考]swi软中断

arm 软件中断的方法介绍SWI指令---软件中断实例详解关键字: SWI,指令,软件中断,实例,详解SWI,即software interrupt软件中断。

该指令产生一个SWI异常。

意思就是处理器模式改变为超级用户模式,CPSR寄存器保存到超级用户模式下的SPSR寄存器,并且跳转到SWI向量。

其ARM指令格式如下:SWI{cond} immed_24Cond域:是可选的条件码 (参见 ARM汇编指令条件执行详解).immed_24域:范围从 0 到 224-1 的表达式, (即0-16777215)。

用户程序可以使用该常数来进入不同的处理流程。

一、方法1:获取immed_24操作数。

为了能实现根据指令中immed_24操作数的不同,跳转到不同的处理程序,所以我们往往需要在SWI异常处理子程序中去获得immed_24操作数的实际内容。

获得该操作数内容的方法是在异常处理函数中使用下面指令:LDR R0,[LR,#-4]该指令将链接寄存器LR的内容减去4后所获得的值作为一个地址,然后把该地址的内容装载进R0。

此时再使用下面指令,immed_24操作数的内容就保存到了R0:BIC R0,R0,#0xFF000000该指令将R0的高8位清零,并把结果保存到R0,意思就是取R0的低24位。

可能还是有人会问:为什么在SWI异常处理子程序中执行这两条指令后,immed_24操作数的内容就保存到了R0寄存器呢?之所以会有这样的疑问,基本都是因为对LR寄存器的作用没了解清楚。

下面介绍一下链接寄存器LR(R14)的作用。

寄存器R14(LR寄存器)有两种特殊功能:·在任何一种处理器模式下,该模式对应的R14寄存器用来保存子程序的返回地址。

当执行BL或BLX指令进行子程序调用时,子程序的返回地址被放置在R14中。

这样,只要把R14内容拷贝到PC中,就实现了子程序的返回(具体的子程序返回操作,这里不作详细介绍)。

DSP中断设置简明教程

DSP中断设置简明教程

[DSP+ARM] [转载]DSP中断设置简明教程定时器, 工作, 寄存器, 通用, 程序一、简述本文介绍TMS320C6000系列中断设置的简明方法。

通过示例定时器中断,MCBSP串口接收中断及外部中断这三种中断实现过程,介绍如何实现中断各个寄存器的配置,中断向量表书写以及中断服务函数。

最后提供一个简要的示例程序可供大家下载使用。

此示例在DSK6416的TI官方实验板上通过测试。

由于定时器和串口工作模式较繁,因此对中断无关部分不做介绍。

二、实现DSP中断需要做哪些通用工作设置允许哪些非屏蔽中断设置各个允许的非屏蔽中断的中断来源设置开启总中断设计中断向量表将中断向量表通过cmd文件挂载到指令内存提供中断处理函数如果中断向量表首地址挂载的不是0地址,那么需要设置中断向量表地址寄存器对于不同的中断源,需要做各个自己的工作,比如如果是外部中断,那么需要设置管脚极性,即由高->低产生中断抑或反之。

为了照顾知识较少的读者,下面将从一个新工程出发,引导大家建立一个中断示例程序。

如果您对建立工程很熟悉,可以跳过此步。

三、建立新工程1.点击Project->New,设置Project Name为intexample,Project Type为Executable,Target选择您需要的器件,在此由于本人使用的是DSK6416评估板。

因此选择TMS320C64XX。

2.添加标准库rts6400.lib,以便自动产生c_int00等函数。

右击当前工程,选择“Add Files to Project”,选择库所在路径,一般为CCS安装自带,可参考本CCS3.1版本的路径地址:CCStudio_v3.1C6000cgtoolslibrts6400.lib如果您使用的是其他器件类型,请在lib文件夹内选择其他器件库。

添加源文件,选择File->New->Source File,保存为main.c到工程路径下。

《嵌入式》课后习题答案

《嵌入式》课后习题答案

第一章1. 简述嵌入式的定义以应用为中心、以计算机技术为基础,软件硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

2. 举例说明嵌入式系统的“嵌入性” 、“专用性” 、“计算机系统”的基本特征。

按照嵌入式系统的定义,嵌入式系统有3个基本特点,即“ 嵌入性”、“ 专用性”与“ 计算机”。

“嵌入性”由早期微型机时代的嵌入式计算机应用而来,专指计算机嵌入到对象体系中,实现对象体系的智能控制。

当嵌入式系统变成一个独立应用产品时,可将嵌入性理解为内部嵌有微处理器或计算机。

“计算机”是对象系统智能化控制的根本保证。

随着单片机向MCU SoC发展,片内计算机外围电路、接口电路、控制单元日益增多,“专用计算机系统”演变成为“内含微处理器”的现代电子系统。

与传统的电子系统相比较,现代电子系统由于内含微处理器,能实现对象系统的计算机智能化控制能力。

“专用性”是指在满足对象控制要求及环境要求下的软硬件裁剪性。

嵌入式系统的软、硬件配置必须依据嵌入对象的要求,设计成专用的嵌入式应用系统。

3. 简述嵌入式系统发展各阶段的特点。

(1)无操作系统阶段:使用简便、价格低廉;(2)简单操作系统阶段:初步具有了一定的兼容性和扩展性,内核精巧且效率高,大大缩短了开发周期,提高了开发效率。

(3)实时操作系统阶段:系统能够运行在各种不同类型的微处理器上,具备了文件和目录管理、设备管理、多任务、网络、图形用户界面Graphic User Interface ,GUI )等功能,并提供了大量的应用程序接口Application Programming Interface ,API ),从而使应用软件的开发变得更加简单。

(4)面向Internet 阶段:进入21 世纪,Internet 技术与信息家电、工业控制技术等的结合日益紧密,嵌入式技术与Internet 技术的结合正在推动着嵌入式系统的飞速发展4. 简述嵌入式系统的发展趋势。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DSP/BIOS软件中断(SWI)
一、SWI模块概述
在DSP/BIOS内核中,系统管理并运行的线程分为四个等级:硬件中断服务程序、软件中断服务程序、任务和后台空闲函数,优先级依次降低。

每个软件中断服务程序都对应一个函数,当然,每个软件中断也可以单独设置优先级。

高优先级的软件中断会抢占正在执行的低优先级的软件中断
所有软件中断都是通过DSP/BIOS内核的API调用来启动。

一旦启动了一个SWI 对象,此时,系统将为该SWI对象中的函数创建一个运行时间表。

因此,当一个软件中断被启动后,其对象函数不一定会立即执行,而是会按照时间表在执行队列中根据优先级排队等候运行。

DSP/BIOS根据软件中断优先级来判断是否要暂停当前运行的线程。

中断线程(包括硬件中断和软件中断)都是使用相同的堆栈来执行的。

当中断发生时,新的线程就会添加到栈顶,系统会执行一次任务切换(Context Switch)。

由于高优先级软件中断会打断低优先级的软件中断的运行,所以SWI模块在运行高优先级软件中断前会自动保存寄存器中的内容。

在高优先级软件中断运行完成后,寄存器会恢复原来的内容,以便继续运行原来的低优先级中断。

如果没有启动其他高优先级的软件中断,低优先级的软件中断就会运行。

DSP/BIOS内核虽然具有抢占的特点,但如果没有导致任务切换的API 函数调用,系统则不会主动切换道其他线程去执行的。

(理解这点在实际应用中很重要,即如果现在运行的是低优先级软中断对应的函数,如果你不在函数中调用如SWI_post()启动更高优先级的软件中断或启动了比自身低的优先级中断,则当前软中断就不会被打断,执行直到退出)。

个人经验:尽量不要在一个软中断对应的函数中去启动另一个比其本身优先级高的软件中断,因为根据抢占原则,其本身将被打断,从而CPU转去执行高优先级软中断对应的函数,低优先级的实时性将得不到保证,当有多级优先级及系统复杂情况下甚至引起系统瘫痪。

也不要设置很多的优先级。

当然这也不是绝对的,如果系统规划的好,利用好软中断的基于优先级抢占式的特点会大大简化你的设计。

二、SWI的执行
通过调用SWI_andn,SWI_sec,SWI_inc,SWI_or,SWI_post可以使软件中断被调度执行。

这些函数本身可以在程序的任何地方调用------中断服务程序ISR中,周期函数中,空闲函数中或其他软件中断函数中。

当一个SWI对象被触发时,SWI管理器将该软件中断添加到一个被触发软件中断的列表中等待,然后SWI管理器检查软件中断当前是否被使能。

如果使能,SWI管理器将该SWI对象的优先级和当前运行线程的优先级进行比较。

若当前运行线程是后台空闲循环IDL或是一个更低优先级的SWI,那么SWI管理器将这个SWI对象从被触发SWI对象列表中移除,并将CPU控制权从当前线程交给SWI对象,开始执行SWI函数。

Note:1.当一个SWI开始执行后,必须无阻塞地运行到结束;
2.当在HWI中调用时,调用任何会触发软件中断的SWI函数的代码必须包装在一个HWI_enter/HWI_exit宏调用中,或者由HWI调度程序调用;
3.如果一个软件中断在SWI管理器将其从被触发SWI对象列表中移除之前,被触发多次,其SWI函数只会执行一次。

这个类似硬件中断的特征:即在CPU清除中断标志寄存器中相应的中断标志为之前,如果该硬件中断触发多次,对应的HWI只会执行一次。

三、SWI对象的邮箱
每个SWI对象有一个邮箱,可以决定是否触发该中断。

用于触发SWI的API函数可以对邮箱值作不同的操作,并根据不同的限制条件触发SWI对象。

其中SWI_post,SWI_or,SWI_inc无条件的触发。

表1-1 SWI对象触发函数
动作
将油箱看作位掩模
将油箱看作计数器
不改变油箱值
[attach]6411[/attach]
要访问一个SWI对象的邮箱值,可以在该SWI函数调用SWI_getmbox,这个函数只能在SWI函数中调用,其返回值是该SWI对象从被触发SWI对象队列中移除之前其邮箱的值。

当SWI管理器从被触发对象列表中移除一个SWI对象时,其邮箱值被复位为其初始值。

如果在SWI函数执行的时候该SWI对象又一次被触发,其邮箱值也会被相应的更新,然而这些都不会影响SWI函数执行时调用SWI_getmbox返回的值,该值在SWI 对象被从被触发SWI队列中移除那一刻锁存起来的油箱值。

1.SWI_inc:一个SWI对象在被移除队列之前,如果被多次触发,一般情况下,SWI 管理器只会调度其函数执行一次,然而,如果应用程序需要该SWI函数在这种情况下执行多次,可以利用SWI_inc来触发该SWI对象。

如果使用SWI_inc触发一个SWI对象,一旦SWI管理器调用并执行对应的SWI函数,就可以再函数中访问该对象的油箱值,获知SWI在运行之前被触发了几次,然后可以将相同的一段程序执行同样的次数来满足应用程序的需求。

2.SWI_andn:如果一个软件中断必须在多个事件都发生的条件下才能被触发,应该使用SWI_andn。

例如一个软家中断在执行之前必须等待两个不同设备的输入数据,其邮箱应该配置有两个被置1的比特位。

3.SWI_or:在某些情况下,SWI函数需要根据触发事件的不同来调用不同的函数,这是可以用SWI_or。

4.SWI_dec:如果应用程序需要同一个事件必须发生多次之后才触发一个SWI,可以使用SWI_dec。

相关文档
最新文档