嵌入式RTOS在MSP430单片机上的实现
时间:06-28
来源:互联网
点击:
Int标志置l。
退出中断:由于没有激活更高优先级的任务,所以在中断任务完成后,将按正常的顺序退出中断,即将保存在中断堆栈中的寄存器推出堆栈,将FromInt标志置0,SP重新指向该任务的任务堆栈中,最后,将PC指针指向中断前的返回地址,继续程序运行。
(2)在普通任务1运行时引发中断,在中断中激活更高优先级的任务2。中断结束时由任务调度器调度去执行更高优先级的任务2,没有返回普通任务1。
当执行任务2时,任务调度器会将任务2保存在自己任务堆栈中的状态恢复并执行任务2。执行完后,如果没有激活更高优先级的任务,那么按照优先级高低的原则,调度器将调度执行任务1。通过判断任务1的TCB中的FromInt标志,可以知道任务1的状态是保存在任务堆栈中还是中断堆栈中,从而可以将其状态恢复,继续运行。
(3)在普通任务1运行时引发中断,在中断中激活更高优先级的任务2,执行任务2时又发生中断。
由于uC/OS-II是严格按照优先级抢占式原则进行任务调度的,所以将任务状态保存在中断堆栈顶部的任务的优先级一定比状态保存在它下面的任务的优先级高。在执行时,是由中断堆栈的顶部向底部顺序执行。在这种假设中,一定先执行任务2,然后执行任务1,如图3所示。
(4)在普通任务1运行时引发中断,在中断中激活更高优先级的任务2。在执行任务2时又发生中断,在中断过程中任务2由于等待信号量而被挂起。
这种情况在系统最初设计时已经被禁止,在中断中不允许使用信号量将中断挂起。
(5) 在普通任务1运行时引发中断,在中断中激活更高优先级的任务2。在执行任务2时又发生中断,中断中激活更高优先级的任务3。中断结束时由任务调度器调度去执行更高优先级的任务3。
这种情况与讨论的情况2是一样的。
(6)高优先级任务2被更高优先级的任务3中止,在任务3运行完后,任务调度器将直接调度执行任务1(按照优先级调度)。
由于各个任务的ISP和TSP在任务切换前都已经保存在该任务的TCB中,任务1的堆栈指针和R4可以回到该任务在其任务堆栈和中断堆栈的正确的位置。
任务2被中止包括两种情况。一是任务2被别的任务删除,此时任务2在中断堆栈中占用的空间会自动释放。二是任务2被别的任务挂起,此时应在将程序挂起的函数TaskSuspend()中添加一段代码,将其保存在中断堆栈中的状态移到自己的任务堆栈中,同时将其TCB中的FromInt标志设为0。这样,在任务2解除挂起后,会去任务堆栈中恢复其状态。
(7)中断中发生中断嵌套。
发生中断嵌套时,要按照中断嵌套的机制进行处理。首先,在中断嵌套中,不允许进行任务调度,这样,即使在中断嵌套中激发了更高优先级的任务,也必须等到最后中断退出前才进行调度执行。这一点是由uC/OS-II系统设计保证的。其次,保存寄存器和函数调用所占用的RAM字节全部在中断嵌套中。在退出中断嵌套时,不必将TCB中的FromInt标志复位。
5 程序设计流程
(1)中断程序结构和设计流程,如图4所示。
(2)普通任务间的任务切换程序流程,如图5所示。
(3)在中断中任务切换程序流程,如图6所示。
我们已经在MSP430F148上成功运行了uC/OS-II,在RAM只有2 KB的情况下,能够运行16个任务,可以满足一些复杂的应用需求,大大扩展了MSP430F148的应用范围,并且提高了应用系统的实时性。为了验证实际效果,在此基础上,我们将几个常用的家庭仪表--水表、暖气表、热水表集成在一起,运行效果良好,达到设计要求。
退出中断:由于没有激活更高优先级的任务,所以在中断任务完成后,将按正常的顺序退出中断,即将保存在中断堆栈中的寄存器推出堆栈,将FromInt标志置0,SP重新指向该任务的任务堆栈中,最后,将PC指针指向中断前的返回地址,继续程序运行。
(2)在普通任务1运行时引发中断,在中断中激活更高优先级的任务2。中断结束时由任务调度器调度去执行更高优先级的任务2,没有返回普通任务1。
当执行任务2时,任务调度器会将任务2保存在自己任务堆栈中的状态恢复并执行任务2。执行完后,如果没有激活更高优先级的任务,那么按照优先级高低的原则,调度器将调度执行任务1。通过判断任务1的TCB中的FromInt标志,可以知道任务1的状态是保存在任务堆栈中还是中断堆栈中,从而可以将其状态恢复,继续运行。
(3)在普通任务1运行时引发中断,在中断中激活更高优先级的任务2,执行任务2时又发生中断。
由于uC/OS-II是严格按照优先级抢占式原则进行任务调度的,所以将任务状态保存在中断堆栈顶部的任务的优先级一定比状态保存在它下面的任务的优先级高。在执行时,是由中断堆栈的顶部向底部顺序执行。在这种假设中,一定先执行任务2,然后执行任务1,如图3所示。
(4)在普通任务1运行时引发中断,在中断中激活更高优先级的任务2。在执行任务2时又发生中断,在中断过程中任务2由于等待信号量而被挂起。
这种情况在系统最初设计时已经被禁止,在中断中不允许使用信号量将中断挂起。
(5) 在普通任务1运行时引发中断,在中断中激活更高优先级的任务2。在执行任务2时又发生中断,中断中激活更高优先级的任务3。中断结束时由任务调度器调度去执行更高优先级的任务3。
这种情况与讨论的情况2是一样的。
(6)高优先级任务2被更高优先级的任务3中止,在任务3运行完后,任务调度器将直接调度执行任务1(按照优先级调度)。
由于各个任务的ISP和TSP在任务切换前都已经保存在该任务的TCB中,任务1的堆栈指针和R4可以回到该任务在其任务堆栈和中断堆栈的正确的位置。
任务2被中止包括两种情况。一是任务2被别的任务删除,此时任务2在中断堆栈中占用的空间会自动释放。二是任务2被别的任务挂起,此时应在将程序挂起的函数TaskSuspend()中添加一段代码,将其保存在中断堆栈中的状态移到自己的任务堆栈中,同时将其TCB中的FromInt标志设为0。这样,在任务2解除挂起后,会去任务堆栈中恢复其状态。
(7)中断中发生中断嵌套。
发生中断嵌套时,要按照中断嵌套的机制进行处理。首先,在中断嵌套中,不允许进行任务调度,这样,即使在中断嵌套中激发了更高优先级的任务,也必须等到最后中断退出前才进行调度执行。这一点是由uC/OS-II系统设计保证的。其次,保存寄存器和函数调用所占用的RAM字节全部在中断嵌套中。在退出中断嵌套时,不必将TCB中的FromInt标志复位。
5 程序设计流程
(1)中断程序结构和设计流程,如图4所示。
(2)普通任务间的任务切换程序流程,如图5所示。
(3)在中断中任务切换程序流程,如图6所示。
我们已经在MSP430F148上成功运行了uC/OS-II,在RAM只有2 KB的情况下,能够运行16个任务,可以满足一些复杂的应用需求,大大扩展了MSP430F148的应用范围,并且提高了应用系统的实时性。为了验证实际效果,在此基础上,我们将几个常用的家庭仪表--水表、暖气表、热水表集成在一起,运行效果良好,达到设计要求。
嵌入式 单片机 电子 Linux C语言 MSP430 电压 电流 MIPS 看门狗 PWM 比较器 仿真 连接器 相关文章:
- 嵌入式系统的定义与发展历史(11-15)
- 嵌入式系统亲密接触(11-22)
- 嵌入式系统设计中的USB OTG方案(02-01)
- 嵌入式线控驾驶系统开发过程中设计和测试考虑(02-02)
- 一个典型的嵌入式系统设计和实现 (02-02)
- DDR SDRAM在嵌入式系统中的应用(02-07)