单片机RTOS随想曲

发布者:幸福梦想最新更新时间:2012-10-16 来源: 21ic 关键字:单片机  RTOS  C编程 手机看文章 扫描二维码
随时随地手机看文章

    本文标为随想曲,是说明这不是一篇结构严谨的文章,而是想到哪写到哪,希望读者能喜欢这种风格。以下为本文正文:
    对于搞单片机的特别用8051系列工程师来说,谈到单片机的RTOS,很多时候会问一句:“为什么要用RTOS?单片机就这一点资源,使用RTOS能保证效率吗?”
    对于这个问题,我会反问:“你用单片机的目的是什么?是为了用单片机的C编程,单片机的汇编编程甚至于用单片机的二进制指令编程?”上个世纪80年代,工程师用二进制指令给Z80编程,现在还有谁在用?现在还有人死抱着汇编不放,但越来越多的人工程师使用C编程(我起初也是使用汇编的),为什么?因为我们的目的是在有限的时间甚至是不充足的时间内把项目保质保量的完成!使用是么工具和方法是次要的(如果你的项目以成本放在第一位,则另当别论,这时,也是要考虑开发时间的)。时间就是金钱啊,一个产品在单片机上增加些许成本是可以接受的。况且,使用8051系列单片机时,单片机资源也常有富余,CPU一般情况也只是空转,这就为它使用RTOS创造了条件。
    那么,使用RTOS的好处呢?我举一个例子吧。假设我们编一个串行通讯程序,通讯协议如下:
    数据包长度为NBYTE,起始字节为STARTBYTE1,STARTBYTE2,最后一个字节为检验和,中间字节不可能出现连续出现STARTBYTE1,STARTBYTE2。
    第一种方法,在中断中处理协议:

unsigned char Buf[NBYTE-2];
bit GetRight=0;
        void comm(void) interrupt 4
//"串行口中断"
{
    static unsigned char Sum,Flag=0,i;
    unsigned char temp;

    if(RI==1)
    {
        RI=0;
        temp=SBUF;
        switch(Flag)
        {
            case 0:
                if(temp==STARTBYTE1)
                {
                    Flag=1;
                }
                break;
            case 1:
                if(temp==STARTBYTE2)
                {
                    Sum=STARTBYTE1+STARTBYTE2;
                    i=0;
                    Flag=2;
                    break;
                }
                if(temp==STARTBYTE1) break;
                Flag=0;
                break;
            case 2:
                if(temp==STARTBYTE1)
                {
                    Flag=3;
                    break;
                }
                Sum+=temp;
                if((i>=(NBYTE-3))&&Sum==0)
                {
                    GetRight=1;
                    Flag=0;
                    break;
                }
                Buf[i++]=temp;
                break;
            case 3:
                if(temp==STARTBYTE2)
                {
                    Sum=STARTBYTE1+STARTBYTE2;
                    Flag=2;
                    i=0;
                    break;
                }
                Sum+=STARTBYTE1;
                if((i>=(NBYTE-3))&&Sum==0)
                {
                    GetRight=1;
                    Flag=0;
                    break;
                }
                Buf[i++]=STARTBYTE1;
                if(temp==STARTBYTE1)
                {
                    break;
                }
                Sum+=temp;
                if((i>=(NBYTE-3))&&Sum==0)
                {
                    GetRight=1;
                    Flag=0;
                    break;
                }
                Buf[i++]=temp;
                Flag=2;
                break;
        }
    }
}[page]

    第二种方法,使用队列
    中断函数:
        void comm(void) interrupt 4
//"串行口中断"
{
    if(RI==1)
    {
        RI=0;
        SBUF入队;
    }
}

    主程序不断调用的函数:
unsigned char Buf[NBYTE-2];

        unsigned char ReadSerial(unsigned char *cp)
{
    unsigned char i;
    unsigned char temp,Sum;

    temp=队列中数据个数;
    if(temp<(NBYTE)) return 0;
    出队temp;
    if(temp!=STARTBYTE1) return 0;
    temp=队列首字节;
    if(temp!=STARTBYTE2) return 0;
    出队temp;
    sum=STARTBYTE1+STARTBYTE2;
    for(i=0;i    {
        temp=队列首字节;
        if(temp==STARTBYTE1)
        {
             temp=队列次首字节;
             if(temp==STARTBYTE2) return 0;
        }
        出队temp;
        *cp++=temp;
        Sum+=temp;
    }
    temp=队列首字节;
    Sum+=temp;
    if(Sum!=0) return 0;
    出队temp;
    return 1;
}

    第三种方法,使用RTOS
    中断函数:
        void comm(void) interrupt 4
//"串行口中断"
{
    OS_INT_ENTER();
    if(RI==1)
    {
        RI=0;
        OSIntSendSignal(RECIVE_TASK_ID);
    }
    OSIntExit();
}

   ID为RECIVE_TASK_ID的任务
    void Recuve(void)
{
    unsigned char temp,temp1,Sum,i;

    OSWait(K_SIG,0);
    temp=SBUF;
    while(1)
    {
        while(1)
        {
            OSWait(K_SIG,0);
            temp1=SBUF;
            if((temp==STARTBYTE1)&&(temp1==STARTBYTE2)) break;
            temp=temp1;
        }
        Sum=STARTBYTE1+STARTBYTE2;

        OSWait(K_SIG,0);
        temp=SBUF;
        for(i=0;i        {
            OSWait(K_SIG,0);
            temp1=SBUF;
            if((temp==STARTBYTE1)&&(temp1==STARTBYTE2))
            {
                OSWait(K_SIG,0);
                temp=SBUF;
                i=-1;
                Sum=STARTBYTE1+STARTBYTE2;
                continue;
            }
            Buf[i]=temp;
            Sum+=temp;
            temp=temp1;
        }
        Sum+=temp1;
        if(Sum==0) OSSendSignal(命令解释任务ID);
    }
}

    以下为这几种方法的比较
    可读性和编程容易性方面,第三钟方法最好(如果允许使用goto语句,程序更加简单易读),第二种次之(因为要编队列程序),第一种最差。如果协议更加复杂,这方面更加明显。程序简单易读,自然出错机会小了。
    RAM占用方面,第三种方法较少,第二种最多(因为队列占用大量空间),第一种最少。
    中断执行时间方面,第三种方法最长,第二种最短,第一种较长。
    从功能方面,第三种方法最强,它还可以进行超时处理(虽然例子程序没有),其它方法均不行。
    如果数据来的太快,命令处理程序来不及处理,三种方法处理方式不太一样,第一种和第三种方法类似:丢弃以前数据,第二种则是丢弃后到的数据。而且,第二种方法必须等命令处理程序完成后才处理下一个数据包,而第一种和第三种方只需命令处理程序将数据收取后就可处理下一个数据包。也就是说,第一种和第三种与命令处理程序并行处理,第二种方法为串行处理。
    现在,一般情况下,开发的效率第一,执行的效率(包括执行时间和资源占用)第二。在这种情况下,降低些许效率换取开发的效率的较大提高,何乐而不为?何况,单个模块的执行的效率高不等于整个程序执行效率高。例如,如果程序需要等待一段时间,一般用程序延时或定时器延时。无论何种方法,CPU不再处理其它工作,效率很低。而用RTOS,等待的时候CPU可以处理其它工作,效率得到提高。
    以下摘自《uC/OS-II--源码公开的实时嵌入式操作系统》
    “实时内核也称为实时操作系统或RTOS。使用它使得实时应用程序的设计和扩展变得容易。不需要大的改动就可以增加新的功能。通过应用程序分割为若干独立的任务,RTOS使得应用程序的设计过程大为简化。使用可剥夺性的内核时,所有时间要求苛刻的事件都得到了尽可能快捷、有效的处理。通过有效的服务;如信号量、邮箱、队列、延时、超时等;RTOS使得资源得到更好的利用。
    “如果应用项目对额外的需求可以承受,应该考虑使用实时内核。这些额外的需求是:内核的价格,额外ROM/RAM开销,2至4百分点的CPU额外负担。
    “还有没提到的一个因素是使用实时内核增加的价格成本。在一些应用中,价格就是一切,以至于对使用RTOS连想都不敢想。”
    总而言之,适用的就是最好的,不要拒绝RTOS,在它适用的情况下,它工作得很好。

关键字:单片机  RTOS  C编程 引用地址:单片机RTOS随想曲

上一篇:单片机测控系统的抗干扰措施介绍
下一篇:用AT89C2051设计的PC/AT键盘

推荐阅读最新更新时间:2024-03-16 13:10

东芝TLCS-870系列单片机结构与应用
    摘要: 东芝公司的TLCS-870系列单片机是功能很强的一类单片机,可广泛用于工业控制、仪器仪表、办公设备和家用电路等领域。文中介绍了该类单片机的结构特点,并给出了采用该系统列单片机组成的全自动模糊控制洗衣机的控制电路和总线控制的彩色电视机的应用电路框图以及单片机的选型参数。     关键词: 单片机  控制  开发工具  TLCS-870系列 东芝公司的TLCS-870系列单片机为高性能8位单片机系列产品。该系统产品有几十种类型,它们具相同的CPU模块和指令系统,各种类型都有廉价的掩膜ROM和一次性可编程的OTP。 TLCS-870系列产品是功能很强的一类单片机,可广泛应用于工业控制、家用电路、
[单片机]
PIC单片机访问铁电存储器的程序模块
//此子程序用于PIC系列单片机和铁电存储器FM24C04交换数据 #define bitset(var,bitno) ((var)|=(1 (bitno))) #define bitclr(var,bitno) ((var)&=((1 bitno)^0xff)) //定义铁电的写地址和读地址 //用高256字节,则为A2 A3 //用低256字节,则为A0 A1 #define WriteDeviceAdd 0xa2 //用高256字节 #define ReadDeviceAdd 0xa3 //用高256字节 #define SDA RC3 #define SCL RC2 /**********************
[单片机]
最简单的单片机PID控制算法程序
简介:这个程序应用在51单片机上的。 /*************定义全局变量*****************/ uchar Kp,TI,Td int Set_speed; /*************PID初始化函数***************/ void PID_init(void){ Serror=0; FError=0; Kp=30; TI=500; Td=10; } int PID_control(int Now_speed) { int Error,Serror,result; Error=Now_speed-Set_speed; Serror=Ser
[单片机]
基于单片机的智能家居电子密码锁系统电路设计
  电子密码锁是一种以高强度密码序列为基础,在单片机上实现的密码开关。它以无线电作为信息媒体,从而实现了遥控,也可以配备一个结构简单的接触式通讯接口,坚固并且防损。该锁具有使用方便、操作简单、价格低廉等特点。与传统的锁防盗效果相比,它避免了因为机械部分被破坏而导致开锁功能失常,大大增加了密码锁得防盗功能。同时因为电子密码锁不需要携带钥匙,弥补了钥匙极易丢失和仿造的缺陷,方便了锁具的使用特别适用于那些正常人体不宜接近的特殊场合,比如高辐射区、高传染区等。基于单片机的家居电子密码锁设计,不仅可以提高人们的生活效率,节约生活资源,而且十分安全可靠。并将以此为起点,构造一个更加舒适和人性化的生活环境。    电源设计   本系统设计为5
[电源管理]
基于<font color='red'>单片机</font>的智能家居电子密码锁系统电路设计
采用51单片机数字实验室的实验和设计
  一个 单片机 应用系统是由硬件和软件组成的。系统硬件设计包括单片机CPU的选型、接口 电路 的设计、外围器件的选择、试验电路板的设计等内容。   软件设计则包括软件编写和仿真调试。   仿真是单片机开发的一个非常重要的环节,除了一些较简单的任务,一般产品开发过程中都要进行仿真,仿真的主要目的是进行程序调试及硬件排错。现在普遍采用基于 Windows 的单片机集成开发系统( IDE)进行单片机应用程序的开发,它是指将编辑、编译,汇编、连接、调试等开发单片机所要用到的程序集成到一个系统软件中,如德国Keil公司的Keil、南京万利电子公司( Manley)的MedWin等。 iframe id="iframeu216385
[单片机]
采用51<font color='red'>单片机</font>数字实验室的实验和设计
msp430单片机的复位
在学习MSP430单片机的时候,经常会遇到一个问题,那就是单片机上电复位以后它到底是什么样的状态?因为它功能复杂,且资源丰富,IO管脚很多,时钟和低功耗模式配置灵活,那么上电后它们处于什么样的状态? 对于电子开发的工程师而言,芯片手册是最好的文档,而且要学会阅读英文的手册,以下我就通过TI公司的用户指南帮助大家一步一步缕清楚,上电复位。 首先我们要了解430单片机的复位包括POR(power on reset)系统上电复位和PUC(power up clear)上电清除,总的来说poc信号更广泛,暂且不深入讨论,我们只要知道上电后会触发POC和PUC即可。那么POR信号会使系统做什么呢? 请看下图: 打对勾的三条很
[单片机]
msp430<font color='red'>单片机</font>的复位
瑞萨面向电机控制应用推出性能卓越的RA8 MCU
基于Arm® Cortex®-M85处理器的RA8T1 MCU产品群, 为工业、楼宇和家庭自动化应用提供低功耗操作和专用模拟功能 2024 年 1 月 30 日,中国北京讯 - 全球半导体解决方案供应商瑞萨电子今日宣布推出基于Arm® Cortex®-M85处理器的RA8T1微控制器(MCU)产品群,可满足工业、楼宇自动化,以及智能家居等应用中常见的电机、电源和其它产品的实时控制要求。 RA8T1产品群是瑞萨RA8系列的第三款产品。所有RA8系列产品均具备6.39 CoreMark/MHz(注)的突破性性能,并采用高性能Arm Cortex-M85处理器和Arm的Helium™技术,能够在数字信号处理器(DSP)和机器学习
[工业控制]
瑞萨面向电机控制应用推出性能卓越的RA8 <font color='red'>MCU</font>
基于单片机和PWM控制方法调速实现无刷控制器检测设计
引言 伴随着城市化进程,人们生活的交通距离不断扩大,代替燃油汽车和自行车的电动车的普及大幅度的提高了电力资源的利用效率,促进了国民经济的健康发展。电动自行车以电力作动力,骑行中不产生污染,无损于空气质量。从改善人们的出行方式、保护环境和经济条件许可情况等因素综合来看,电动自行车目前乃至今后都有着广阔的发展空间。电动自行车所用直流电机分为有刷电机和无刷电机两种。其中有刷电机控制较简单。但其易磨损的电刷带来维修保养工作量相对较大、使用寿命相对较短等缺点。而直流无刷电机本身没有易磨损部件,电机寿命长,维修保养工作量小。但直流无刷电机采用电子换向原理工作,其控制过程比有刷电机复杂得多,因此对控制器质量的要求也高得多。 目前电动自行车采
[单片机]
基于<font color='red'>单片机</font>和PWM控制方法调速实现无刷控制器检测设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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