嵌入式RTOS在MSP430单片机上的实现

2019-08-02 16:45发布

随着信息社会的发展,信息家电、智能仪表和智能安保系统等产品已经越来越多地出现在人们的生活中。可以预见,为了满足人们对舒适、便捷、安全生活环境的需求,嵌入式信息产品的设计、应用将得到快速发展。
  单片机作为嵌入式信息产品的一个重要应用方面,其使用、设计面临着全新的挑战。一方面,人们对嵌入式产品的要求越来越高,稳定可靠、功能丰富、物美价廉的信息产品将成为人们的首选。另一方面,随着微电子工艺水平的发展,单片机处理器的能力不断提高,从最初的8位单片机到16位,进而32位单片机,功能越来越强大,执行速度越来越快,集成度、精确度也越来越高,应用领域进一步拓宽。可以说,单片机芯片的性能已经能够满足现代人们对嵌入式信息产品的更高要求。为了能将二者有效地结合起来,嵌入式RTOS的软件设计方法也取代了以前的前后台(超循环)设计方法,越来越受到重视和应用。
  正如分时操作系统中Linux的出现打破了Windows一统天下的局面一样,由美国Jean J.Labrosse先生设计和编写的uC/OS-II(Micro C OS 2)的出现也给国内的RTOS应用者带来了惊喜。uC/OS-II的最大优点与Linux相同,即其源代码全部公开,使人们在应用它的同时能清楚地了解内部的实现细节,并且能够根据自己的需求进行移植和修改。特别重要的是uC/OS-II经过8年的发展,已经成功地在多个行业得到应用,保证了实用性和可靠性。它的出现改变了以前人们在使用RTOS时的态度,减少了经济上的顾虑,对于国内RTOS的研究、推广、应用将起到重要的推动作用。uC/OS-II采用微内核设计,使用C语言编写,追求灵活性,可配置、可裁剪、可扩充、移植性强。需要强调的是 uC/OS-II严格采用优先级抢占式调度方案。在创建任务时,根据任务的重要性给每个任务分配不同的优先级。任务调度时,先执行高优先级的任务,然后按照优先级由高到低执行任务。如果在某个任务执行中,激发了一个优先级更高的任务,那么在该任务执行结束后,将由任务调度器调度去执行所激发的高优先级任务,而不是顺序执行。
  下面就uC/OS-II在TI公司生产的MSP430F148芯片上的移植和应用来探讨在单片机上实现RTOS可能遇到的一些问题。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
houjiakai
1楼-- · 2019-08-02 22:12
 1 MSP430系列单片机简介

  MSP430系列单片机是由TI公司开发的16位单片机。其突出特点是超低功耗,非常适合于各种功率要求低的场合。有多个系列和型号,分别由一些基本功能模块按不同的应用目标组合而成。典型应用是流量计、智能仪表、医疗设备和保安系统等方面。由于其较高的性能价格比,应用已日趋广泛。

  MSP430F148是TI新近推出的MSP430F14x/13x系列单片机中的一款。相对MSP430系列的其它芯片,主要特点如下:

  超低功耗。由于内置了功耗极低的快速闪存,因此,MSP430F14x/13x系列在待机模式下所消耗的电能还少于电池未使用时的自然损耗。在正常的工作状态下,如果工作电压为2.2 V,其典型消耗电流仅为250uA/MIPS,而待机模式下工作电流降至仅1uA以下。

  执行速度快。MSP430F13x/14x系列的工作电压范围为1.8~3.6 V,性能可达8 MIPS。

  存储容量大。MSP430F148片内内置了48 KB Flash ROM和2 KB RAM。RAM空间是MSP430系列中最大的,基本符合运行RTOS的需要。

  高性能A/D。包含了1个具有8个外部通道的12位高性能A/D转换器。利用芯片内置的自动扫描功能,A/D转换器可以不需要中央处理器的协助而独立工作。

  集成度高。该器件还包括1个独立的看门狗、2个脉宽调制定时器(PWM)、1个比较器、2个USART口以及48个输入/输出引脚等部件。

  在线支持强。MSP430F13x/14x系列均可由MSP-FET430P140闪速仿真工具(FET)提供支持。该FET是一种完整的集成开发环境,包括源代码级调试器、仿真器、汇编/连接器、C编译器、2种评估芯片、目标板、JTAG接口以及编程单元等。

  由以上介绍可以看出,MSP430F148属于一种中低端的单片机,只具备运行RTOS的基本条件,所以在它上面运行RTOS所遇见的一些问题,对于一般的单片机而言是具有代表性的。
houjiakai
2楼-- · 2019-08-02 23:12
 2 中断堆栈的结构设计
  在uC/OS-II中,任务切换分为任务级切换和中断级切换。其中任务级切换是通过发软中断指令或依靠处理器执行陷阱指令来完成的。软中断指令会强制将一些处理器寄存器保存到当前任务的堆栈中,并执行任务调度。其目的是使处于就绪态的任务的堆栈结构看起来就像刚发生过中断并将全部寄存器保存在堆栈的情形一样。如MCS-5l以及x86芯片都有类似的指令,但问题出在有一些单片机芯片中没有软中断指令,并且在发生中断时保存寄存器的情况根据单片机芯片和所使用的编译器的不同而有很大区别。


  MSP430F148中就没有软中断指令,所使用的IAR编译器在发生中断时也不保存所有的寄存器,而是只保存几个在中断中使用到的寄存器。所有这些都是不符合uC/OS-II的移植条件的。我们的解决方法是根据具体情况来自己定义一个中断结构,不论是在任务级调度还是中断发生或调度以及任务堆栈的初始化时,都要按照这个结构来执行。代价是必须对所编写的中断程序的汇编代码进行人工修改,使之符合这个中断结构。
  为设计一个符合要求的中断堆栈结构,首先必须清楚所使用的单片机在发生中断时执行了哪些操作,即向堆栈中保存了哪些寄存器以及它们的顺序。当MSP430单片机发生中断时,只进行2条基本操作,先将SR(状态寄存器)压入堆栈中保存,然后将中断发生时要执行的下一条指令的PC值压入堆栈保存。其次,要清楚所使用的C编译器在编译C语言编写的中断程序时,进行了哪些默认的操作。通过对所使用的IAR V2.13编译器编译产生的汇编程序进行分析,可以发现,除了以上的2条基本操作以外,在中断程序的开头,还自动保存了 R12~R15四个寄存器,余下的R4~Rll八个寄存器中只保存在中断程序中用到的个别寄存器,而不是全部保存。但在RTOS中必须保存所有的寄存器,这样才能正确保存该任务的状态。通过以上分析,我们定义了MSP430运行uC/OS-II时的中断堆栈结构,如图1所示。

houjiakai
3楼-- · 2019-08-03 00:13
 精彩回答 2  元偷偷看……
houjiakai
4楼-- · 2019-08-03 05:51
4 如何减少RTOS在运行中占用的RAM空间

  影响RTOS在单片机上应用的主要原因是由于在单片机上运行RTOS需要占用一定的系统资源,如系统时钟、RAM、FLASH或ROM等,从而减少了应用系统对资源的利用。特别是对RAM的占用。一般而言,单片机上的内部RAM数量都很少(如MSP430F148是整个MSP430中RAM最多的,也只有2 KB),虽然可以通过外部扩展来增加RAM数量,但这样不仅增加了设计的难度和产品成本,而且有时还使系统应用无法进行扩展。所以,最好的方法是能够充分利用单片机的内部RAM来运行RTOS。

  通过分析uC/OS-II对RAM的使用情况可知,占用RAM空间最多的原因,是由于在设计uC/OS-II时,要给每个任务都分配一个单独的任务堆栈。特别在单片机的硬件设计没有将中断堆栈与任务堆栈分开时,计算任务堆栈的大小时不仅要计算任务中变量和函数嵌套所使用的RAM大小,还必须计算该任务在运行时发生中断和中断嵌套所需要的RAM空间的大小。由于每一个任务均需预留中断和中断嵌套所需要的RAM空间的大小,所以使得大量RAM空间被浪费。最直接的解决方法就是利用软件来将任务堆栈和中断堆栈分离,使得在计算任务堆栈的大小时,只需计算任务本身所需的RAM空间大小,从而提高了RAM的使用效率,增加了更多的应用任务。

  所谓将中断堆栈与任务堆栈分离,就是在内存中专门开辟出一块区域作为中断堆栈使用,任何一个任务运行时发生中断都只使用它。设计的原则:一是要尽量将中断任务与普通任务分开;二是模拟的中断堆栈指针必须一直保持在中断堆栈的顶部,即中断时中断堆栈指针要时刻保持与SP的同步变化。
houjiakai
5楼-- · 2019-08-03 07:45
 为了达到这个目的,单片机芯片必须具备以下2个条件。

  首先,单片机芯片必须有一个通用寄存器和相应的指令能够模仿堆栈指针SP的功能,即能实现软堆栈。在MSP430系列单片机中有以下指令可以仿真SP的功能(把R4作为中断堆栈指针使用):

  MOV @R4+,SP ;将R4所指向地址中的内容存入SP;中,同时R4中内容加2

  MOV SP,0(R4) ;将SP中的内容存入R4所指向的地址中

  MOV @R4+,PC ;将R4所指向地址中的内容存入PC;中,同时R4中内容加2

  其次,作为模拟中断堆栈指针的寄存器R4,必须在中断之外的任何情况下不被使用。因为,此时的R4必须时刻保持在中断堆栈的顶部,如果改变它的值,就会改变中断堆栈的结构。一般这个要求是由所使用的编译器来保证的,在我们所使用的IAR编译器中,有一个选项可以避免使用R4和/或R5。

  具体设计时,我们在uC/OS-II每个任务的TCB(任务控制块)结构中加入以下几项:

  TSP--任务堆栈指针。发生中断后,指向该任务的任务堆栈的顶部。

  ISP--中断堆栈指针。如果在中断中发生任务切换,指向该任务在中断堆栈所保存状态的顶部。

  FromInt标志--是否来自中断标志。用来判断该任务的状态是保存在中断堆栈中(为1),还是保存在任务堆栈中(为0)。
houjiakai
6楼-- · 2019-08-03 10:12
 下面假设一个普通任务1在执行过程发生中断,对它在中断执行过程中可能出现的几种情况进行分析。
  (1)在普通任务1运行时引发中断,在中断中没有激活更高优先级的任务,而是正常结束中断,继续执行任务1,如图2所示。

  开始中断:将在中断发生时保存在当前任务堆栈的SR和PC移到中断堆栈中保存,同时 SP回到中断前的位置并将它保存到该任务TCB中的TSP中(这是为了在中断结束后,保持任务堆栈的连续性),然后将SP指到目前中断堆栈的顶部,按照自定义堆栈结构的顺序依次将所有寄存器都保存到中断堆栈中。保存的过程中R4必须与SP保持同步变化,同时将FromInt标志置l。
  退出中断:由于没有激活更高优先级的任务,所以在中断任务完成后,将按正常的顺序退出中断,即将保存在中断堆栈中的寄存器推出堆栈,将FromInt标志置0,SP重新指向该任务的任务堆栈中,最后,将PC指针指向中断前的返回地址,继续程序运行。

一周热门 更多>