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_EN1),代替了关中断方式用于处理临界段。 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需要一个能提供周期性时间的时基源,叫做系统时基。硬件定时器可以被设置为每秒产生101000Hz的中断提供系统时基。也可以从交流电中获得50Hz60Hz的时基源。

事实上,也可以从交流电中获得100Hz120Hz的过零点作为时基。 

时基可以看做是系统的心跳。它的速率决定于时基源。然而,时基速率越快,系统的额外支出就越大。 

时基中断程序必须调用OSTimeTick() OSTimeTick() 

posted @ 2018-07-31 16:42  西贡小傻  Views(289)  Comments(0Edit  收藏  举报