μC/OS-Ⅱ在MSP430F149上的移植

发布者:EtherealJourney最新更新时间:2010-03-04 来源: 微计算机信息关键字:嵌入式操作系统  MSP430  移植 手机看文章 扫描二维码
随时随地手机看文章

    μC/OS-Ⅱ是一个源代码公开的嵌入式实时操作系统(RTOS),该操作系统理论上最多可以管理64个任务,一般应用时需要留出8个任务给系统本事使用,因此用户的应用程序最多可以有56个任务,μC/OS-Ⅱ的内核为完全可剥夺型实时内核,即系统总是运行就绪条件下优先级最高的任务,并支持信号量、邮箱、消息队列等多种进程间通讯机制,同时用户可以根据需求通过条件编译实现对内核中的功能模块的裁剪,此外μC/OS-Ⅱ 还具有可固化、中断管理、高稳定性和可靠性等特点,因此将μC/OS-Ⅱ移植到微处理器(MCU)上, 对于缩减产品开发和升级周期,提高可靠性和稳定性,降低成本方面有着重要的意义。以下主要讨论嵌入式实时操作系统μC/OS-Ⅱ在MSP430F149上的移植。

1 基于16位微处理器MSP430F149的硬件应用系统

1.1 MSP430F149的特点与功能结构

    MSP430F149是美国德州仪器(TI)公司推出的16位微处理器,它的低功耗特别低,支持1.8~3.6V电压供电,全速运行时的电流仅为280μA,休眠状态微处理器的电流只有0.1μA;支持五中省电模式,同时具有很快的唤醒速度,唤醒时间只为6μS;片内集成12位A/D转换器,两种定时器(timer_A和timer_B),UART通讯端口2个,比较器等,满足了大多数嵌入式仪器的应用需求。最重要的是MSP430F149程序存储器有60K并支持JTAG仿真,真正实现了在线仿真调试,方便了嵌入式实时操作系统的移植。

1.2 用于移植μC/OS-Ⅱ的硬件电路

图1 微处理器系统硬件原理图

    这里为了方便说明μC/OS-Ⅱ在MSP430F149上的移植,构建了基于微处理器MSP430F149的简单硬件系统,主要由三部分构成:电源,处理器及其JTAG仿真,RS232通讯接口。

    电源部分主要提供稳定电压+5V和+3.3V,+5V用于给RS232串行通讯端口控制电路供电,+3.3V是微处理器MSP430F149的供电电压。用于移植嵌入式实时操作系统μC/OS-Ⅱ 主体硬件部分是由微处理器MSP430F149及其JTAG仿真和RS232通讯接口控制器MAX232构成,其硬件电路原理图如图1所示。    

2 μC/OS-Ⅱ的移植

2.1 嵌入式操作系统μC/OS-Ⅱ的可移植性

     嵌入式实时操作系统μC/OS-Ⅱ绝大部分源代码是用移植性很强的ANSI C写成的,与微处理器硬件相关的部分是用汇编语言写成的。与微处理器硬件相关的汇编语言已经压缩到最低限度,因此μC/OS-Ⅱ可以移植到目前主流的所有微处理器上。

2.2 选择移植所用的编译环境

    移植μC/OS-Ⅱ到MSP430F149上需要一个标准的C交叉编译器,当然该编译器是针对微处理器MSP430F149的,即编译器能够将标准的C代码编译成MSP430F149能够执行的机器码。同时,μC/OS-Ⅱ是完全可剥夺型内核,只能通过C编译器来产生可重入型代码。C编译器还应该支持汇编语言,这是因为一些对CPU寄存器的操作只能通过汇编语言来实现。在微处理器MSP430F149的开发工具中,IAR Embedded Workbench for MSP430能够完全符合这些移植要求,该集成编译环境还具有软件仿真等功能,故选用它作为移植用的编译器。

2.3 μC/OS-Ⅱ移植到MSP430F149上的步骤

    从μC/OS-Ⅱ的软硬件体系结构可以看到,与处理器相关的代码主要是OS_CPU.H、OS_CPU_A.ASM和OS_CPU_C.C这三个文件,移植的过程也就是对这三个文件的编写。

    OS_CPU.H包括了用#define语句定义的、与处理器相关的常数、宏及类型。其中,重点是实现临界段代码保护函数OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),函数OS_ENTER_CRITICAL()实现的是关中断,函数OS_EXIT_CRITICAL()实现的是开中断。和所有的实时内核一样,μC/OS-Ⅱ 需要先关中断再处理临界段代码,并在处理完毕后重新开中断,这就使得μC/OS-Ⅱ 能够保护临界段代码免受多任务或中断服务子程序的破坏。

    OS_CPU_A.ASM文件中需要编写4个简单的汇编语言函数:

    函数OSStartHighRdy()是使就绪态任务中优先级最高的任务开始运行,基于MSP430F149的代码实现如下:

OSStartHighRdy
            call     #OSTaskSwHook
            mov.b    #1, &OSRunning         ; 内核运行
            mov.w    SP, &OSISRStkPtr       ; 保存中断堆栈             
            mov.w    &OSTCBHighRdy, R13     ; 载入优先级最高任务堆栈
            mov.w    @R13, SP
            POPALL                          ; 恢复所有寄存器
             reti                            ; 中断返回

      函数OSCtxSw()是在一般运行情况下实现任务的切换,即,让优先级最高的任务获得CPU控制权,实现代码如下:

           OSCtxSw
            push      sr                    ; 保存中断SR指针   

            PUSHALL                         ; 保存所有寄存器
            mov.w     &OSTCBCur, R13
            mov.w     SP, 0(R13)
            call      #OSTaskSwHook
            mov.b     &OSPrioHighRdy, R13
            mov.b     R13, &OSPrioCur
                         
            mov.w     &OSTCBHighRdy, R13
            mov.w     R13, &OSTCBCur                         
            mov.w     @R13, SP
            POPALL
            reti                            ; 中断返回

    函数OSIntCtxSw()是实现在中断服务子程序中任务切换的功能,具体代码如下:

OSIntCtxSw
            
            call      #OSTaskSwHook
            mov.b     &OSPrioHighRdy, R13
            mov.b     R13, &OSPrioCur                         
            mov.w     &OSTCBHighRdy, R13
            mov.w     R13, &OSTCBCur                          
            mov.w     @R13, SP
            POPALL   ;恢复所有寄存器
            reti

    函数OSTickISR()是系统时钟节拍中断服务程序,其执行频率在10~100Hz,主要功能是检查是否有由于延时而被挂起的任务成为就绪任务, 如果有就调用OSIntCtxSw()进行任务切换, 从而运行高优先级的任务。

    OS_CPU_C.C文件中,需要写10个C语言函数,唯一需要的是编写堆栈初始化函数OSTaskStkInit(),其他的9个函数只要声明,并不一定要包含任何代码。由于MSP430F149的堆栈是从上往下递减的,故堆栈初始化函数OSTaskStkInit()实现代码为:

OS_STK  *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{    INT16U  *top;
    opt    = opt;  /*避免编译器的警告*/
    top    = (INT16U *)ptos;
    top--; 
    *top = (INT16U)task;
    top--;
    *top = (INT16U)task;    /*中断返回向量*/
    top--;
    *top = (INT16U)0x0008;   /* 状态寄存器*/
    top--;
   ......
    *top = (INT16U)pdata;
    top--;
   ......
    return ((OS_STK *)top); /*返回栈顶指针给调用该函数的函数*/
}

    至此,μC/OS-Ⅱ在MSP430F149上的移植就已经完成,可以建立多任务应用程序来测试嵌入式操作系统μC/OS-Ⅱ了。

3 测试移植代码

3.1 测试内核自身的运行状况

     通过测试内核自身的运行状况来验证移植的成功与否,可以避免把应用软件和内核的问题混在一起,使问题更加复杂化。如果在测试内核自身运行状况时有问题,就是内核的问题,排除了应用软件代码的问题。这里通过依此验证OSTaskStkInit()和文件OS_CPU_A.ASM中的OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()四个函数来证明内核是移植成功的。

3.2 建立多任务应用程序验证系统的移植成功

    本系统建立了两个任务来测试μC/OS-Ⅱ是否成功移植到MSP430F149,它们是:

    任务一:从MSP430F149 A/D采样通道0采样

    OSTaskCreate(ADTask, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 1);

    任务二:RS232串口与上位机通讯

    OSTaskCreate(UartTask, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 2);

    测试主要实现功能是将的A/D采样任务得到的数据通过RS232串口发送给上位机,实验证明,利用精密可调电阻改变MSP430F149 A/D采样通道0的模拟输入电压量,上位机端收到的数据也做相应的变化,证明嵌入式实时操作系统μC/OS-Ⅱ在MSP430F149移植是成功的。

4 结论

    μC/OS-Ⅱ是比较小而完善的嵌入式实时操作系统,本文成功将μC/OS-Ⅱ移植到微处理器MSP430F149上,并实现了多任务运行,这对在中低档微处理器、单片机上构建和应用嵌入式实时操作系统有着一定的意义,同时让基于这些微处理器开发的嵌入式系统具有运用嵌入式实时操作系统所带来的不可替代的优势。

    本文作者创新点: 实现了实时嵌入式操作系统μC/OS-Ⅱ在中低档单片机上的成功移植和应用。为在中低档单片机系统中应用实时嵌入式操作系统提出了思路和实例。

关键字:嵌入式操作系统  MSP430  移植 引用地址:μC/OS-Ⅱ在MSP430F149上的移植

上一篇:QNX 发布智能家用能源管理系统的参考设计
下一篇:嵌入式实时操作系统μCOS-Ⅱ的移植

推荐阅读最新更新时间:2024-05-02 21:01

基于MIPS32平台的Linux操作系统移植
  引 言   目前,Linux作为仅次于微软Windows的操作系统已经在PC和嵌入式领域得到了广泛应用。尤其是在嵌入式开发领域,由于Linux操作系统具有成本低、可靠性高,源码开放等显著的优点,已经成为受众多嵌入式开发者青睐的操作系统之一。目前,Linux操作系统所支持的包括X86、ARM、MIPS、MIPS64、Sun SPARC、POWER PC、MOtorola 68k、IBM S/390、A1pha、IA64、cris、parisc、sh等主要的体系结构。本文以实际项目中一个MIPS32构架的CPU和板级系统为例,阐述如何将Linux操作系统移植到目标平台上。   1 目标平台概述   本文所讨论的开发平台采用的
[单片机]
基于MIPS32平台的Linux操作系统<font color='red'>移植</font>
MSP430F5529定时器中断
计时器中断控制LED灯亮灭 void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 // get_clk(); P1DIR |= 0x01; // 将P1.0设为输出 TA0CCTL0 = CCIE; // CCR0中断允许 TA0CCR0 = 50000; TA0CTL = TASSEL_2 + MC_1 + TACLR; // 参考时钟选择SMCLK, 增计数模式, 清除TAR计数器 __bis_SR_register(LPM0_bits + GIE); // 进入LPM0并使能全局中断 } //TA0中断服务程序 #pragma vector=TIMER0_A0_VECTOR
[单片机]
MSP430省电方式的两种唤醒方法
1MSP430省电方式简介 MSP430以其低功耗著称于世,它可以外接2个时钟源——XIN、XT2IN,内部还有1个DC0振荡器,可以产生高达8 MHz的内部时钟。一般XT2IN的频率为高频,按实际应用时的要求来选用;XIN为低频,可以是32 768Hz。XIN的用途主要是在低功耗时使系统保持“活着”。MSP430共有5种省电方式,即LPM0~4。其中, LPM0:CPU、MCLK关闭,SMCLK、ACLK打开,功耗79uA; LPM1:CPU、MCLK、DCO关闭,SMCLK、ACLK打开,功耗4luA; LPM2:CPU、MCLK、SMCLK、DC0关闭,DC产生器、ACLK打开,功耗17uA; LPM3:CPU、MC
[单片机]
<font color='red'>MSP430</font>省电方式的两种唤醒方法
基于GPSOne模块DTGS-800和MSP430F147的设计
  GPSOne综合了GPS、CDMAlX(码分多址分组数据交换网络)、GIS(地理信息系统)和互联网技术,是美国高通公司为基于位置业务而开发的定位技术,采用Client/Server方式。它将无线辅助A-GPS和高级前向链路AFLT三角定位技术有机结合,实现高精度、高可用性和较高速度的定位。在A-GPS定位技术无法使用的环境中,会自动切换到AFLT三角定位技术,确保定位的成功率和精确度。这里基于GPSOne模块DTGS-800和低功耗单片机MSP430设计并实现了具有定位、监控和报警功能的个人定位终端。   1 系统硬件设计      个人定位终端的硬件组成如图1所示。为了解决GPS在室内和高层建筑密集区难以定位的问题
[单片机]
基于GPSOne模块DTGS-800和<font color='red'>MSP430</font>F147的设计
MSP430另一种UART实现
1 #include msp430g2553.h 2 3 typedef unsigned char uchar; 4 typedef unsigned int uint; 5 6 #define LED BIT0 7 #define TXD BIT1 // TXD on P1.1 8 #define RXD BIT2 // RXD on P1.2 9 #define POUT P1OUT 10 11 #define BITTIME_1b 13*4 //1bit宽度 12 #define BITTIME_1b5 13*6
[单片机]
linux +qt4.7+opencv2.2移植到tq2440开发板
以下操作在Fedora下使用超级用户进行 我已经安装了交叉编译器arm-linux-gcc 4.3.3和qt4.5的x86和arm版本 在目录/opt/EmbedSky下。 修改配置文件/etc/profile 添加 pathmunge /opt/EmbedSky/4.3.3/bin 安装CMake OpenCV 2.1的版本,必须使用CMake创建Makefile。我使用的CMake版本是2.6-Linux-i386的,是fedora通过软件添加和载卸功能添加的(这个cmake要重新安装,而且要添加bin进去路径) 编译OpenCV: 1、解压OpenCV 2.1到/opt/EmbedSky/OpenCV-2.1.0目录下
[单片机]
MSP430单片机对AT24C64的读写操作子程序
/*----------------------------------- MSP430单片机对AT24C64的读写操作子程序 来源:晖创电子网www.schuitron.comMSP430程序 ---------------------------------------*/ #ifndef_I2C_H #define_I2C_H #defineSDA_1P4OUT|=0x02//SDA=1 #defineSDA_0P4OUT&=~0x02//SDA=0 #defineSCL_1P4OUT|=0x01//SCL=1 #defineSCL_0P4OUT&=~0x01//SCL=0 #defineSDA_INP4
[单片机]
基于mini2440的uboot移植(一)
一.移植环境 虚拟机:ubuntu12.04 uboot源码:u-boot-2008.10.tar.bz2 交叉编译:arm-linux-gcc-4.4.3 简单的记录下编译uboot的过程,要想具体了解uboot的工作原理,可以查看韦东山对uboot这部分的讲解,红色部分为修改部分 二.移植步骤 1.将uboot源码复制到ubuntu下的自己定义的文件夹,并解压tar jxvf u-boot-2008.10.tar.bz2 2.选择要移植的开发板,我们要准备将uboot移植到mini2440上,s3c2440开发板的cpu为arm920t,smdk2410开发板的cpu也为arm920t,所以我们选择
[单片机]
基于mini2440的uboot<font color='red'>移植</font>(一)
小广播
热门活动
换一批
更多
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved