资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,嵌入精彩生活,中断与设备驱动,(Interrupt&Driver),罗海波,robhappy,目录,设备驱动简介,中断与中断处理,函数的可重入问题,实例分析(自学),设备驱动、,Bootloader,与,BSP,典型的设备(控制器,+,驱动器),一般设备驱动的组成,设备的缓冲区管理,P183,图,6-5,示例,UART,的,FIFO,缓冲区,P6-6,环形缓冲区,如何用,C,代码实现一个环形缓冲区?,中断,中断的分类,硬件中断,来自外部(针对,CPU,内核),如串口收到数据、击键等。,软件中断,通过在程序中执行的中断指令来实现,又称,软陷,。,80X86,:,int,68000,:,trap,ARM,:,SWI,异常,CPU,在运行过程中引起的事件,如数据中止、未定义指令等,中断的处理过程,一般由硬件、软件两部分共同完成。,调用栈帧和中断栈帧的区别,最后一个参数,入口参数,函数返回地址,局部变量,局部变量,保存的调用函数的寄存器值,中断返回地址,程序状态字,局部变量,保存的中断前所用到的寄存器,调用栈帧结构,中断栈帧结构,Q,:,如何理解这两个栈帧结构?,调用子函数时,子函数内部如何访问局部变量和入口参数?,函数调用返回时,,SP,指针会发生什么?,为何中断栈帧没有参数传递?,C,中的中断处理,C,中的中断处理,处理器为何能异步响应中断?,中断何时可能会延迟或者丢失?,CPU,指令周期使然,不支持中断嵌套(默认),临界资源访问时,为了保护,关中断。,如何加快中断的响应?,ISR,分上下部分,避免调用耗时的函数,避免浮点运算,避免不必要的函数调用,用,C,编写中断服务程序应该注意的,不能返回值,不能向,ISR,传递参数,ISR,应该尽可能的短小精悍,printf(char,*,ipFormatString,),函数会带来重入和性能的问题,不能在,ISR,中使用。(在,ARM,平台上由于半主机机制,速度会更慢!),其他不可能重入的函数不可使用,耗时的函数避免调用,大量的运算尽量避免,没有,OS,的中断服务队列,自己编写一个该队列的分配和释放函数,函数的可重入问题,都是“,并发访问,”惹得祸!,函数如何可重入?,局部变量的访问在重入时不会引起冲突,全局数据的访问在重入时往往容易引起冲突,临界资源的访问在重入时往往容易引起冲突,不可重入函数的互斥保护,关中断,关调度(禁止做任务切换),利用信号量,重入函数的伪问题,有的函数,虽然不可重入,但是根本不会重入,,故,没必要保护。,此函数是一个非递归函数,且:,这个函数不会被,ISR,调用,且:,这个函数只会在一个任务中被调用,其他任务不会调用此函数。,
展开阅读全文