C语言进阶-第六讲中断与驱动_第1页
C语言进阶-第六讲中断与驱动_第2页
C语言进阶-第六讲中断与驱动_第3页
C语言进阶-第六讲中断与驱动_第4页
C语言进阶-第六讲中断与驱动_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、12#CNASIC典型的设备(控制器+驱动器)CPU总线r总线接口数据FIFO配置寄存器L状态寄存器控制时序电路I控制器中断信号驱动电路集成为. 模块控制电流/电压硬件系统亠般设备驱动的结构应用应用应用程序1程序2程序n编程接口 API文件系统OS内核H 十 H lai Ml F!设备文件接口 I;= = = ,设备文件接口 T:7L:硬:件:管:理缓冲区管理中断处理硬 件 管 理缓冲区管理FE-驱动中断处理3#设备1设备nCNASIC中断的分类I硬件中断(Hardware Interrupt): 般是由外部(相对 CPU 内核而言)的硬件引起的事件,比如串口来数据,键盘击 键等;I软件中断(

2、Soft Interrupt ):通过在程序中执行的中断指 令引起的中断,又叫软陷;80X86 : int 指令68000 : trap 指令 ARM : SWI 指令软中断指令一般用于操作系统的系统调用入口;I异常(Exception ):由于CPU内部在运行过程中引起的 事件,比如指令预取错,数据中止,未定义指令等等,异 常事件一般由操作系统接管。CNASIC中断的处理过程虽然中断产生的原因不同,但是中断响应的硬件过程基本上是相同的。 拷贝 CPSR 至U SPSR <mode> m设置正确的cpsr位17切换到ARM状态切换到异常模式 禁止中断ITI保存返回地址在LR <

3、;mode>设置PC到异常向量地址原来中断服务 程序完成I -中断服务程序可能保存需要使用的寄存器(堆栈中)用户服务程序可以打开中断,以接受中断嵌套恢复保存的寄存器口通过调用Reti (或其他相应指令)指令将 PSR和PC出栈 的执行流程。CNASIC调用栈和中断栈的不同Last argHighAutomatic or Scratch VarsAutomatic or Scratch VarsFirst argReturn AddressSaved RegsLow调用栈中断栈HighLowCNASICC语言中的中断处理在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供

4、新的关键字用于标 示中断服务程序(ISR),类似于_interrupt >#program in terrupt当一个函数被定义为ISR的时候,编译器会自动 为该函数增加中断服务程序所需要的中断现场入 栈和出栈代码。CNASIC用C编写中断服务程序应该注意的I不能返回值;不能向ISR传递参数;ISR应该尽可能的短小精悍;I printf(char * IpFormatString, 函数会带来重入和性能问 题,不能在ISR中采用。(在ARM平台上由于半主机机 制,该函数的速度更慢!)I其实还包括所有的不可重入的函数都不应该在中断中使用。程序 员应该仔细地评估ANSI C库函数和OS的系统

5、调用 浮点运算以及其他的耗时操作都不应该在中断程序中使用CNASIC加快中断处理程序的方法在中断处理程序中只进行最基本的硬件操作,比如读出硬 件寄存器的数据,或者改变状态寄存器的值I然后通过一定的方法将中断的事件做一个标志,在离开中 断处理程序后,由其他代码根据中断标志进行后续的处理 这样做的好处是大大加快了中断的处理时间 常见的方法:在没有OS的情况下可以使用自定义的队列,在中断处理程序之外 的主循环中对中断的事件进行处理。Linux 下的 Bottom half & Top halfASIX OS中的系统任务CNASIC没有OS的中断服务队列/*存放中断的队列*/While(1)在

6、主循环中检查中断并处理之typedef struct taglntQueueIf( !IsIntQueueEmpty()int intType; /* 中断类型 */struct tagIntQueue *next;intType = GetFirstlnt();IntQueue;switch(intType) /*是不是很象 WIN32程序的消息解析函数?*/IntQueue IpIntQueueHead;_interrupt ISRexample()int intType;/*对,我们的中断类型解析很类似于消息驱动*/case xxx: /*我们称其为"中断驱动"吧?

7、*/break;intType = GetSystemType();case xxx:QueueAddTail(lpIntQueueHead, intType); /* 在队列尾加入新的中断*/break;1CNASIC有OS的情况下中断将变得更复杂I 一般而言OS将接管中断向量表,中断发生 时,首先由OS接管中断OS将检查真正的中断源是什么,然后才调 用真正的中断处理程序CNASiCASIX OS下的中断初始化./*;file n ame :;descriti on;history:boot.sboot the arm processor2003-1-7 15:59 lc create;*/

8、include hardware_gfd.hexter nmai nAREA BOOT, CODE, READONLYENTRY;Mark first in structi on to execute;vector tablebalRST_DObalEXTENT_INSTRUbalSWI_DObalABORT_PREFETCH_DObalABORT_DATA_DOmovR1,R1;reserved excepti onbalIrq_Domovr0, r0balFiq_Do;the code for the fiqstmfdsp!, r0,r1ldrr0, =IRQ_R1strr1, r0ldm

9、fdsp!, r0ldrr1, =IRQ_R0strr0, r1addr13, r13, #4 ;/restore the sp_irq top to original irq topsubr14, r14, #4movr0, r14mrsr1, spsrorrr1, r1, #0x80msrcpsr_cxsf , r1;/change irq mode into svcbicr1, r1, #0x80;/clear the irq maskstmfdsp!, r0stmfdsp!, r14stmfdsp!, r1ldrr0, =IRQ_R1ldrr1, r0stmfdsp!, r1ldrr1

10、, =IRQ_R0ldrr0, r1stmfdsp!, r0ldmfdsp!, r0,r1stmfdsp!, r0 -r12;/save the registers r0 -r12IMPORTint vector handlerblint vector handler1314void (*I ntHa ndler32)(void)=/*interrupt number and description, .NULL, EXT0, EXT1, EXT2, EXT3, EXT4, EXT5, EXT6, EXT7, EXT8, EXT9, EXT1( EXT1-/* 00/* 01/* 02/* 0

11、3/* 04/* 05/* 06/* 07/* 08/* 09/* 10/* 11/* 12/* 13/* 14/* 15/* 16/* 17/* 18/* 19/* 20/* 21/* 22/* 23/* 24/* 25/* 26/* 27/* 28/* 29/* 30/* 31INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT*/ (PE0) (PE1) (PE2) (PE3) (PE4)

12、 (PE5) (PE6) (PE7)*/*/*/*/*/*/*/*/han dler */ ENT_INT_EMPTY ENT_INT_RING1 NULL,NULL,ENT_INT_RING2 NULL,NULL,ENT_INT_RING3 NULL,(PEd8 _vector_h_ _butTon ,QPE1d) */NULL,(PE$1gned long IFSTATe=*(RP)(IN1TC_IFSTAT);*/ t_vector_h*/EXT1;| (PHFSTAT <1)IFSTAT=L(RP)(INTC_ISTAT) & (*(RP)(INTC_IMSK) &

13、; *(RP)(INTC_IEXT13EXT1I (P H2).f/NONE*/.;EXT1fI (PH3)"extkI -EXT17lcdcAC97,PWM,UARTUARTMMC,SPI,USB,GPT,EMI,DMA,RTC,,(PHFSTat >1)稠 il*/(IFSTAT ) (ph4)fstat>>=1;7, (PH5i+;*/elSe i=0;*/if(ln*Ha ndleri else *ent_int ();pfin tf("Noret_i nt (); */*/*/ENT_INT_SSRT NULL,NULL,NULL,NULL,NU

14、LL,NULL,NULL,NULL,ndleri ')();)(*NULL,NULL,interriJEN TrINT_USBNT ,ENT_INT_GPT ,ENT_INT_EMI ,ENT_INT_DMA ,ENT_INT_RTC ;NO.%d n",i );EN);#CNASiC通知内核!为了通知内核中断的发生,往往需要在用 户的中断服务程序中显示地调用 OS提供的 系统调用I Ent_int()通知内核我们现在中断中Ret_int()通知内河我们离开中断了,如果系统 允许则进行调度,否则按照中断的方式离开一 返回Samplesaving current enviunm

15、entinto, stackmnicjtAr intern mt n<itinn S *W I V «. V I! ! B B V I S F 严 « S ! V «.S S !ISRretjnt() Mrestore environmentjno nMgftarhinn nax十 taitk tn ri jnv v y、i e f J b i *w r < « b'W" j | | 材 | |Get this task'sLet it run!创刃PRE聞仃曲SI3GKCNASICASIX OS中用户ISR的一般格

16、式void ENT_INT_RTC( void )int_vector_handler ()函数调用ent_int();告诉内核,中断发生了rtc_isr();/用户真正的中断服务程序ret_int();我们要返回了,或者我们要切换任务了CNASIC函数的可重入问题CNASIC什么是函数的重入由中断调用引起的函数重入由另一个任务调用引起的函数重入还有其他原因吗?是的!函数递归也会引起函数的重入!19函数的可重入问题什么是函数的重入12中断服务程序Task函数的重入调用函数A中断发生Taskl中断服务程序函数的重入中断发生Task2调用函数A#函数A中断返回 并进行任务调度中断返回函数A13#由

17、中断调用引起的函数重入由另一个任务调用引起的函数重入#还有其他原因吗?是的!函数递归也会引起函数的重入!14CNASJC重入函数的伪问题(pseudo Problem ) 虽然有些函数不能安全重入,但是也许这个函数根本就 没有重入的可能性,那么对于这个函数的重入保护就是 多余的,这就是所谓重入的伪问题.这个函数是一个非递归函数,并且,这个函数不会被中断服务程序调用,并且,这个函数只会在一个任务中被调用,其他任务中不会调用这个 函数。Disable_IRQ(); /* 关中断 */DoSomthing ;Sleep(1000);/* 挂起任务 1000 毫秒 */DoSomthing else;Sleep(1000);/* 挂起任务 1000 毫秒

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论