3.uCOSIII中断管理

来源:互联网 发布:sql 求平均值 编辑:程序博客网 时间:2024/05/01 07:48

这是学习中断管理时Onenote的笔记:

  • 概述:
    • 关中断后中断控制器会锁存中断请求,重新开中断后CPU会响应中断;
    • 实时系统中应尽可能减少关中断的时间;

 

  • 中断服务函数的一般操作:
    • 中断预处理:
      • 进入中断时先关中断,之后将CPU寄存器保存到任务堆栈内,这些对C程序员是透明的;
      • 递增OSIntNestingCtr值,可通过OSIntEnter()函数,表示多一层嵌套的中断;
      • 若此中断为第一层中断,还应保存此时的堆栈指针值;
      • 清除中断请求标志位;
    • 中断服务:
      • 重新开中断(根据实际需要来选择)
      • 进行相关的处理,但原则上应该尽量精简,最好只是发布信息,实际工作由相关任务来做;
    • 中断后处理:
      • 调用OSIntExit()函数:递减OSIntNestingCtr,若退为0时,系统内核判断是否使某个高优先级任务就绪;
      • 若有高优先级任务就绪,此时中断不会返回之前任务,而是直接执行高优先级任务;?????????
      • 恢复之前寄存器,从中断中返回;

 

  • 无内核中断服务程序:
    • 简介:
      • 通常只是用来处理非常简单的事件,内容短小精悍;
      • ISR_Func内不重新开中断,防止中断被打断,且此种中断优先级较高,而OS内核也不可以关闭此中层次中断;
      • 不记录中断嵌套级数,故而内核不知此中断发生;
      • 此种中断只保护该中断所要用到的寄存器,而其他不会保护;

 

  • 多优先级中断(中断管理)

  • 16级优先级中断为例,所有中断优先级都高于任务优先级;
  • 级别12~15不使用任何Kernel的函数,Kernel也无法关闭这些中断(会打断临界区操作,不过其不使用Kernel函数,所以通常没问题)

 

  • 两种中断服务程序:
    • 所有中断源共用ISR_Func:
      • 所有中断源共用一个ISR_Func,中断时中断控制器会根据优先级对中断源进行排序;
      • ISR_Func内根据中断源选择对应处理函数;
      • 循环处理完所有中断请求后才退出中断,关中断时间长;
    • 每个中断源专用ISR_Func:
      • 主要使用的一种方式,前面讨论的方式,不详述;

 

  • 直接发布、延迟发布:
    • OS_CFG_ISR_POST_DEFERRED_EN0时是直接发布,否则为延迟发布;
    • 直接发布:
      • 通过关中断的方式保护临界代码;
      • 此时仅在处理定时器时对任务调度器上锁;
    • 延迟发布:
      • 通过给任务调度器上锁方式保护临界区,而很少存在关闭中断的情况;
      • 对于信号量等内核对象,在ISR_Func内先存入缓冲队列/中断队列,之后通过中断队列处理任务进行发布;
      • 中断队列处理函数访问中断队列时应关闭中断;
      • 推荐使用延迟发布,此时关中断时间会很短;

1 0
原创粉丝点击