【12】uC/OS-III应用开发————>异常与中断管理(STM32F767)

  1. 简述
    1. 中断:处理器正在处理某件事的时候,请求处理器迅速处理,中断当前的操作,处理发生的事件,处理完毕,再回到原来被中断的地方继续工作
    2. 异常是指任何打断处理器正常运行,并且迫使处理器进入一个有特权的特殊指令执行的事件
    3. 中断机制避免CPU把大量时间耗费在等待、查询外设状态的操作上,提高系统实时性和执行效率
    4. 快进快出
  2. 异常分类
    1. 同步异常:处理器指令运行产生的事件引起的异常
    2. 异步异常:内外部硬件设备产生的事件引起的异常
  3. 引起中断的硬件
    1. 外设:外接硬件设备
    2. 向量中断控制器:NVIC
      1. 接收其它其它外设中断信号的输入,发出中断信号给CPU
      2. 可设置中断源的优先级、触发方式、打开和关闭中断源等
      3. NVIC最多支持240个中断,每个中断最多256个优先级
    3. CPU本身:响应中断请求,中断当前任务,执行中断程序
  4. 中断运行机制
    1. 产生中断
    2. 保存当前处理器状态信息
    3. 载入异常或者中断处理函数到PC寄存器
    4. 把控制权转交给处理函数并开始执行
    5. 当处理函数执行完毕,恢复处理器状态信息
    6. 从异常或中断中返回前一个程序执行点
  5. 中断延迟时间
    1. 硬件中断发生到开始执行中断处理程序的第一条指令的这段时间
  6. 任务延迟时间
    1. 中断发生到恢复到任务级代码的这段时间
  7. 中断的应用场景
  8. 中断延迟发布
    1. 分类:
      1. 直接发布(或称为释放):
      2. 延迟发布:
      3. 设置OS_CFG_ISR_POST_DEFERRED_EN选择,0:直接发布,1:延迟发布
    2. 使能中断延时发布,可以将中断级发布转换成任务级发布,
    3. 而且在进入临界段时也可以使用锁调度器代替关中断,
    4. 大大减小了关中断时间,有利于提高系统的实时性
  9. 相关函数
    1. os_int_q();  中断队列信息块
    2. OS_InitQTaskInit();  中断延迟发布任务初始化
    3. OS_IntQPost();  中断延迟发布过程
    4. OS_IntQTask();  中断延迟发布任务
  10. 例程
    1. 发布
       /*********************************************************
       * 函数名:EXTI3_IRQHandler()
       * 描述  :按键中断服务函数
       * 输入  :无
       * 输出  :无
       * 返回  :无 
       * 调用  :内部调用 
       **********************************************************/  
      extern OS_TCB   AppTaskKeyTCB;
      
      void EXTI3_IRQHandler(void)
      {
          OS_ERR  err;
          
          OSIntEnter();       //进入中断
          
          if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_3) != RESET)  //确保是否产生了EXTI_Line中断
          {
              //发送任务信号量到任务AppTaskKey
              OSTaskSemPost( (OS_TCB          *)&AppTaskKeyTCB,   //目标任务
                             (OS_OPT           )OS_OPT_POST_NONE, //没选项要求
                             (OS_ERR          *)&err);            //返回错误类型
              
              //清除中断标志位
              __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
          }
          
          OSIntExit();        //退出中断
      }

       

    2. 接收
      /**************************************************
       * 函数名:static void AppTaskKey(void *p_arg)
       * 描述  :按键检测
       * 输入  :无
       * 输出  :无
       * 返回  :无 
       * 调用  :内部调用 
       **************************************************/
      static void AppTaskKey(void *p_arg)
      {
          OS_ERR err;
          
          CPU_TS_TMR  ts_int;
          CPU_INT32U  cpu_clk_freq;
          
          (void)p_arg;
          
          cpu_clk_freq = BSP_CPU_ClkFreq();   //获取系统时钟
      
          for(;;)
          {
              OSTaskSemPend( (OS_TICK         )0,     //阻塞任务,直接按键按下
                             (OS_OPT          )OS_OPT_PEND_BLOCKING,      //如果信号量不可用就等待
                             (CPU_TS         *)0, //获取信号量被发布的时间戳
                             (OS_ERR         *)&err); //返回错误类型
              
              ts_int = CPU_IntDisMeasMaxGet();    //获取最大关中断时间,默认是关闭的
          
      		printf ( "触发按键中断,最大中断时间是%dus\r\n", 
      						ts_int / ( cpu_clk_freq / 1000000 ) );            
          }
      }

       

  11. 下载验证
  12. 总结
    1. uC/OS支持中断嵌套,即当前中断可以被更高优先级中断打断
    2. 在OS中,很多时候我们会主动进入临界段,系统不允许当前状态被中断打断
    3. 进入与退出时需要调用OSIntEnter()和OSIntExit(),方便中断嵌套管理
  13. 参考资料:
    1. 正点原子《STM32F767 UCOS开发手册》
    2. 野火《uC/OS-III内核应用与开发》
    3. 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
    4. 官方源码
  14. 硬件平台:
    1. 正点原子阿波罗F767
  15. 软件平台:
    1. MDK5.2.5
  16. 库版本:
    1. TM32Cube_FW_F7_V1.4.0
  17. uC/OS-III版本
    1. UCOSIII 3.04
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值