7.0-uC/OS-III中断管理
1.CPU的中断处理
理器通常有多个中断源。 例如, UART中断、 DMA中断、 ADC中断、定时器中断等。
2.中断器件标志中断处理器,然后中断处理器将优先级最高的中断
提交给CPU。
现在的中断控制器都是智能的,允许定义中断优先级,记住哪些中断还处于挂起状态。在大多数情况下,中断控制器会直接提供对应ISR的向量地址给CPU 。
如果全局中断被关闭,CPU就会忽视来自于中断控制器的中断请求,但这些请求会在中断控制器中被挂起直到CPU重新开启中断。
3. CPU处理中断有两种模式:
(1).所有的中断指向同一个ISR
(2).每个中断指向各自的ISR
4.典型的中断服务程序
进入中断时 CPU需执行的一些步骤。其中( 2)( 3)( 10)( 11)
是处理器自动完成的。( 4) ~( 9)需用户在ISR中编写。
( 9).ISR的工作完成后,用户必须调用OSIntExit()告诉uC/OS-III
中断服务程序已经完成。 OSIntExit()中将OSIntNestingCtr递减, 如果其值变为0,就意味着ISR将会返回到任务级代码(否则返回前一层的中断)。
中断服务中可能使能了比原任务更高优先级的任务。这时uC/OS-III选择优先级最高的就绪任务或返回原任务。
( 10).如果ISR使能了一个更低优先级的任务, OSIntExit()返回
原任务。
5.短中断服务程序( ISR)
上述顺序的代码是假定ISR会发送信号量或消息给任务。然而,
在很多情况下, ISR不需要发送通知任务, 而是在ISR中直接完成需要的工作(假定需要完成的工作代码较短)。在这种情况下, ISR的结构如下所示:
短ISR程序, 如上所定义, 是一个例外。 它不遵循uC/OS-III的规则,所有uC/OS-III不知道ISR中发生了什么。
6.每个中断向量指向不同的地址
中断向量控制器中的中断向量都指向对应的ISR地址。 ISR中的程序尽可能用汇编写(如章节9-2所示)。当然,这样会导致编程的复杂化。
然而,其中大部分的代码都是从另一个ISR中复制和黏贴的。
除了一些用户要改变的代码。
7.直接提交和延迟提交
uC/OS-III有两种方法处理来自于中断的时间; 直接提交和延迟提交。通过OS_CFH.H中的OS_CFG_ISR_POST_DEFERRED_EN来选
择。当设置为0时, uC/OS-III使用直接提交方法。 当设置为1时,
使用推迟提交方法。
(1).直接提交
( 3)若ISR使能了低于或等于原任务优先级的任务, ISR
结束时, uC/OS-III返回原任务并从被中断处继续执行。
( 4)若ISR使能了高于原任务优先级的任务, ISR结束
后,进入调度。 uC/OS-III切换到高优先级任务。
(2).延迟提交方式
延迟提交方式(通过设置OS_CFG_ISR_POST_DEFERRED_EN为1),代替了关中断方式用于处理临界段。 uC/OS-III锁住调度器,
这可以避免其它任务访问临界段代码。 延迟提交方式中, 中断几乎没被关闭。然而,该方式有点复杂。
( 3) ISR中调用"post"函数发送信号量或消息给任务。然而, 它不是直接发送给任务, 而是先发送到中断队列。 然后中断处理函数被就绪。这是uC/OS-III的内部任务且具有最高优先级(优先级为0)。
( 4) ISR的最后, uC/OS-III会切换到中断处理任务,它将中断队列中消息发送给任务。 在此, 我们关闭中断防止在处理中断队列时被另外的中断程序打断。 最后,
该任务使能中断, 锁住调度器, 提交信息。 信息是在任务级被提交的。 这样, 就是在任务级完成临界段的处理了。
( 5)当中断处理任务清空中断队列时,它就会将自己停止,重
新开启调度器,调用调度器选择下一个任务运行。
( 6)如果优先级更高的任务被使能, uC/OS-III会上换到该任务。
8.直接提交VS延迟提交
在直接提交方式中, uC/OS-III访问临界段时关中断。 然而, 在延
迟提交方式中, uC/OS-III访问临界段时锁调度器。
在延迟提交方式中,访问中断队列时uC/OS-III需要关中断。然而,
这段关中断时间是非常短的且是相当固定的。
如果在应用中关中断时间是关键性的,因为应用中有非常频繁的中断源, 且应用不能接受直接提交方式那样较长的关中断时间。 推荐使用延迟提交方式。
如果多个任务具有相同的优先级或者多个任务等待不同的事件,遍历这些等待的事件任务需要很长的处理时间意味着产生长临界段、挂起多个对象,
它需要很长的临界段、使用广播消息(uC/OS-III在处理广播消息时通过关调度器保护临界段),等这些情况可以使用延迟提交方式。
9.系统时基
uC/OS-III需要一个能提供周期性时间的时基源,叫做系统时基。硬件定时器可以被设置为每秒产生10到1000Hz的中断提供系统时基。也可以从交流电中获得50Hz到60Hz的时基源。
事实上,也可以从交流电中获得100Hz到120Hz的过零点作为时基。
时基可以看做是系统的心跳。它的速率决定于时基源。然而,时基速率越快,系统的额外支出就越大。
时基中断程序必须调用OSTimeTick()。 OSTimeTick() 。