第六讲 中断控制器(1)_第1页
第六讲 中断控制器(1)_第2页
第六讲 中断控制器(1)_第3页
第六讲 中断控制器(1)_第4页
第六讲 中断控制器(1)_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

第六讲中断控制器及编程 当有事件来临时 必须中断当前cpu运算来响应突发事件 当等待一个事件时 是一直查询还是事件来了告诉我一声 中断是MCU的核心 因为几十个中断要处理 还要做得很好 内容提要 6 1中断的基本概念6 2中断控制器6 3中断实例 6 1基本概念 ARM中断的入口在哪里 中断向量表 S3C2440有60个中断源 怎么分发和处理 当有多个中断同时发生时怎么办 6 1 1中断入口 所有ARM都一样 主要有七个复位 reset0 x0未定义指令 undef0 x4软件中断 swi0 x8指令预取中止 pabort0 xc数据预取中止 dabort0 x10普通中断 irq0 x18快速中断 fiq0 x1c 6 1 2中断分发和处理 所有外围接口的中断是挂到irq或fiq上的用到什么中断你使能什么中断总开关在 CPSR寄存器的I位和F位次开关在INTMASK寄存器还有接口中与中断相关的寄存器还要注意设置 6 1 2中断分发与处理 思路 先登记 pending 按优先级选中 执行的 完了再顺序执行后面的 6 1 2中断分发与处理 登记 rSRCPND寄存器中相关位置位优先级排序规则 设置寄存器或默认的最高的优先级的 rINTPND置位 rINTOFFSET置位产生IRQ或IRQ中断 6 1 2中断分发与处理 以IRQ为例 IRQ中断服务程序该干什么 6 1 2中断分发与处理 首先跳到0 x18 即硬件将程序计数器 R15或PC 设置为0 x18 开始从0 x18这里取指令 大家想下看 0 x18这里放一条什么指令 我们的start s中是怎么做的 6 1 2中断分发与处理 首先0 x18bHandlerIRQ HandlerIRQHANDLERHandleIRQ 等价于 HandlerIRQsubsp sp 4 sp sp 4stmfdsp r0 sp sp 4 sp r0 ldrr0 HandleIRQ r0 HandleIRQ这个标号的地址ldrr0 r0 r0 的值赋给r0 HandleIRQ 存放的值 r0strr0 sp 4 r0的值放到 sp 4 ldmfdsp r0 pc sp r0 sp sp 4 sp pc sp sp 4 HandleIRQ 4 0 x33ffff18 6 1 2中断分发与处理 HandleIRQ 0 x33ffff18 HandleIRQ里面放的是什么 假设 HandleIRQ void isr IRQ 为什么会跳到isr IRQ函数中 6 1 2中断分发与处理 start s中的isr IRQ IsrIRQsubsp sp 4stmfdsp r8 r9 ldrr9 INTOFFSETldrr9 r9 ldrr8 HandleEINT0addr8 r8 r9 lsl 2 ADDR0 R2 R3 LSL 1 R0 R2 R3 1 useradd ldrr8 r8 strr8 sp 8 ldmfdsp r8 r9 pc 6 1 2中断分发与处理 假如我们想挂载isr uart中断服务程序 该怎么做 某一地址 unsignedint void isr uart isr uart就是地址 某一地址我事先定义好 看uart中断在rINTOFFSET第几位 若是第n位 则等于开始地址 n 2 6 1 2中断分发与处理 已经将isr uart放到 某一地址 中了那我只需要当发生uart中断 rINTOFFSET这一位置位 从这个 某一地址 中取到isr uart 跳转到这里便可 rINTOFFSET只有一位置位 因此不同的偏移对应不同的中断 只要在所谓不同中断所谓的 某一地址 中放入isr函数地址 相当于就挂载上去了 6 1 2中断分发与处理 分发完了 处理即中断服务程序要干什么工作 保存现场 关中断 处理事件 打开中断 恢复现场 6 1 2中断分发与处理 为什么要保存现场 怎么保存现场 怎么还原现场 6 1 2中断分发与处理 中断只不过处理一下紧急任务而已 原来的事情还是要做的所以原来的状态寄存器 关键信息要保存的等中断返回时在还原回去 6 1 2中断分发与处理 对于irq来说 主要包括cpsr r0 r8 r9 r12 r14等当中断发生时 跳转到相应中断地址之前 如0 x18之前 硬件会将cpsr spsr irq pc lr lr到底是什么呢 6 1 2中断分发与处理 保存寄存器 spsr irq lr irq是irq自己的物理寄存器 其他的诸如r0 r8等 你用到哪个需要保存哪个需要保存到r13 irq sp 空间中 stmfdsp r0 r2 lr 6 1 2中断分发与处理 还原现场 ldmfdsp r0 r2 lr subspc lr 0 x4 cpsr怎么恢复的 6 1 2中断分发与处理 保存现场 关中断 处理事件 打开中断 恢复现场讲完保存现场 恢复现场 下面讨论打开和关中断一般rINTMASK寄存器全部Mask掉 6 1 2中断分发与处理 处理事件开头或结尾往往要干一件事情 即清中断 对于s3c2440来说 主要是清rINTSRC和rINTPND寄存器相应位若不清中断会发生什么 6 2中断控制器 8 1 2命名规则 1 标识符的名称要简明 能够表达出确切的含义 可以使用完整的单词或通常可以理解的缩写 2 如果在命名中使用特殊约定或缩写 则要进行注释说明 3 对于变量命名 一般不取单个字符 例如i j k 4 函数名一般以大写字母开头 所有常量名字母统一用大写 8 1 3注释说明 注释有助于程序员理解程序的整体结构 也便于以后程序代码的维护与升级 常用的规则如下 1 注释语言必须准确 简洁且容易理解 2 程序代码源文件头部应进行注释说明 3 函数头部应进行注释 4 程序中所用到的特定含义的常量 变量 在声明时都要加以注释 5 对于宏定义 数据结构声明 如果其命名不是充分自注释的 也要加以注释 6 如果注释单独占用一行 与其被注释的内容进行相同的缩进方式 一般将注释与其上面的代码用空行隔开 7 程序代码修改时 其注释也要及时修改 一定要保证代码与注释保持一致 命名规则示例 8 2嵌入式C程序设计中的位运算 在嵌入式程序设计中 位操作是最常用的运算之一 因为在很多情况下要对寄存器中的某位或某个管脚进行操作 这些都需要用位操作来完成 8 2 1按位与操作 按位与运算符 是把参与运算的两个操作数所对应的各个二进制位进行按位相与 只有当对应的两个二进制位全为1时 结果才为1 否则为0 参与运算的两个操作数以补码形式出现 例如7 3 补码分别为00000111与00000011按位与运算后结果为00000011等于十进制的3 按位与操作可以实现将特定的位清零 也可以用于提取出某数的指定位 8 2 2按位或操作 按位或操作运算符 是把参与运算的两个操作数对应的各个二进制位进行按位相或 对应的两个二进制位中只要有一个为1 结果就为1 当两个对应的二进制位都为0时 结果位为0 参与运算的两个操作数均以补码形式出现 例如7 3 7的补码为00000111 3的补码为00000011 结果为00000111 按位与操作可以实现将特定位的置位操作 也可以用于提取出某数的指定位 8 2 3按位异或操作 按位异或运算符 是将参与运算的两个操作数对应的各个二进制位进行相异或 当对应的两个二进制位相异时 结果位为1 相同时为0 参与运算的两个操作数均以补码形式出现 例如7 3 7的补码为00000111 3的补码为00000011 结果为00000100 应用举例 通过3次异或操作将寄存器rPDATAE中的内容与变量tmp的值进行交换 rPDATAE rPDATAE tmptmp tmp rPDATAErPDATAE rPDATAE tmp 8 2 4取反操作 取反运算符 实现对参与运算的操作数对应的各个二进制位按位求反 取反运算符 具有右结合性 所有1变为0 0变为1 例如 01011001 10100110 在程序中主要用于将操作数的某位或某些位取反 为其他操作提供数据准备 8 2 5移位操作 移位操作分为左移操作与右移操作 左移运算符 实现将 左边的操作数的各个二进制位向左移动 右边操作数所指定的位数 高位丢弃 低位补0 其值相当于乘以 2 左移位数 次方 右移运算符 实现将 左边的操作数的各个二进制位向右移动 右边操作数所指定的位数 对于空位的补齐方式 无符号数与有符号数是有区别的 对无符号数进行右移时 低位丢弃 高位用0补齐 其值相当于除以 2 右移位数 次方 8 3嵌入式C程序设计中的几点说明 8 3 1volatile限制符8 3 2地址强制转换与多级指针8 3 3预处理的使用 8 3 1volatile限制符 volatile的本意为 暂态的 或 易变的 该说明符起到抑制编译器优化的作用 如果在声明时用 volatile 关键进行修饰 遇到这个关键字声明的变量 编译器对访问该变量的代码就不再进行优化 从而可以提供特殊地址的稳定访问 特别是存储器映像 memory mapped 外设端口类型 8 3 2地址强制转换与多级指针 地址强制转换在C程序设计中 绝对地址0 x0FA00只是被当成一个整型数 如果要把它当成一个地址来使用就需要进行地址强制转换 如定义一个整形指针int p 然后把绝对地址0 x0FA00转换成一个整形的地址值赋给这个整形指针 p int 0 x0FA00 因此在嵌入式程序设计中 经常可以可以看到寄存器用如下方式进行定义 definerPCONA volatileunsigned 0 x1D20000 definerPDATA volatileunsigned 0 x1D20004 多级指针 8 3 3预处理的使用 在源流程序被编译器处理之前 编译预处理器首先对源程序中的预处理命令进行展开或处理 预处理命令书写格式为以 开头 占单独书写行 语句尾不加分号 宏定义 define 1 不带参数的宏不带参数的宏定义的一般形式为 define宏名 宏体 2 带参数的宏定义带参数的宏定义一般形式为 define宏名 参数表 宏体 3 宏定义与函数 带参宏与函数的区别 文件包含 include 文件包含的功能是使得一个源文件可以将另一个源文件的内容全部包含进来 它的一般形式为 include 文件名 先搜索当前目录 再搜索标准目录 可以指定目录 include 直接按标准目录搜索 头文件test h defineSQR x x x defineCUBE x x x x defineQUAD x x x x x 源文件test c include include e qiutie test h 指定目录 包含头文件 defineMAX POWER10voidmain intn printf number texp2 texp3 texp4 n printf t t t n for n 1 n MAX POWER n printf 2d t 3d t 4d t 5d n n SQR n CUBE n QUAD n 程序运行结果 条件编译 1 形式1 ifdef标识符程序段1 else程序段2 endif 2 形式2 ifndef标识符程序段1 else程序段2 endif 3 形式3 ifdef表达式1程序段1 elif表达式2程序段2 else程序段3 endif 8 4嵌入式C程序设计格式 8 4 1可重入函数8 4 2中断处理程序8 4 3模块化程序设计 8 4 1可重入函数 如果某个函数可以被多个任务并发使用 而不会造成数据错误 我们就说这个函数具有可重入性 reentrant 一个可重入的函数简单来说就是可以被中断的函数 满足下列条件的函数多数是不可重入的 1 函数体内使用了静态的数据结构 2 函数体内调用了malloc 或者free 函数 3 函数体内调用了标准I O函数 可重入函数的编写规则 第一 不要使用全局变量 因为别的代码很可能覆盖这些变量值 第二 在和硬件发生交互的时候 切记执行类似disinterrupt 之类的操作 就是关闭硬件中断 完成交互记得打开中断 在有些系列上 这叫做 进入 退出核心 或者用OS ENTER KERNAL OS EXIT KERNAL来描述 第三 不能调用任何不可重入的函数 第四 谨慎使用堆栈 还有一些规则 都是很好理解的 总之 时刻记住一句话 保证中断是安全的 通俗的来讲吧 由于中断是可能随时发生的 断点位置也是无法预期的 所以必须保证每个函数都具有不被中断发生 压栈 转向ISR 弹栈后继续执行影响的稳定性 也就是说具有不会被中断影响的能力 既然有这个要求 你提供和编写的每个函数就不能拿公共的资源或者是变量来使用 因为该函数使用的同时 ISR 中断服务程序 也可能会去修改或者是获取这个资源 从而有可能使中断返回之后 这部分公用的资源已经面目全非 可重入性中断 如果希望在处理中断时仍能响应其他中断请求以此来缩短中断延时 就必须设计可重人性中断 可重入性中断是处理多个中断的一种方法 但它也同时带来新的问题 在IRQ中断模式中 如果直接重新允许了IRQ中断 此时因为执行一条BL指令而将子程序返回的地址保存在LR irq中 而在此间中断发生了 新来的中断会将其返回地址装入LR irq中 此时旧中断子程序的返回地址必将被覆盖从而导致系统紊乱 但是仍不能排除在保存LR之前中断发生的可能性 要解决LR irq被破坏的问题 就必须切换处理器的模式 常见的是切换到SVC处理模式 在SVC模式中 通过BL调用子程序时会将返回地址保存在LR SVC之中 此时新中断发生 因为它会将返回地址保存到LR irq而不是L

温馨提示

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

评论

0/150

提交评论