Chinaunix首页 | 论坛 | 博客
  • 博客访问: 699432
  • 博文数量: 255
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 2811
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-09 13:29
个人简介

IT业行者,行者无疆

文章分类

全部博文(255)

文章存档

2011年(121)

2010年(134)

我的朋友

分类: 嵌入式

2010-09-27 09:40:32

UC/OS-II读后感(连载二)

我的嵌入式生涯 2008-07-28 21:41:05 阅读49 评论0   字号: 

下面来讲UC/OS-II的使用吧,看以下的代码:

int main (void)
{
    OSInit();              //初始化OS
    OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], 0);  //(5)
    OSTaskCreate(Task3, (void *)0, &Task3Stk[TASK_STK_SIZE - 1], 5);  //(5)
    OSTaskCreate(Task6, (void *)0, &Task6Stk[TASK_STK_SIZE - 1], 10);  //(5)
    OSTaskCreate(Task7, (void *)0, &Task7Stk[TASK_STK_SIZE - 1], 11);  //(5)

//建立不同四个任务,分配不同的优先级,不同的堆栈空间
 CommMbox1 = OSMboxCreate((void *)0);
 CommMbox2 = OSMboxCreate((void *)0);
 CommMbox3 = OSMboxCreate((void *)0);

//建立三个邮箱


    OSStart();                //操作系统启动,这个函数永远不会返回
    return 0;                  //
}

 

 

下面来介绍以上使用的几个函数

OSInit()函数是多任务启动之前必须调用的函数,主要完成的功能是多任务环境的初始化工作。

OSTaskCreate函数是建立一个任务所调用的函数,操作系统要求在启动多任务之前至少创建一个任务,且最好在第一个建立的任务里启动系统时钟。

OSMboxCreate函数是建立一个邮箱,邮箱是任务与任务或中断和任务之间通讯的桥梁。

OSStart函数是最后启动多任务调用的函数,这个函数调用后永远不会返回。调用这个函数之后,内核会确认当前那个任务的优先级最高,最后把CPU的使用权交给这个任务。

 

下面利用其中的两个任务来说明多任务的使用

任务6的功能很简单,就是让一个LED灯以一定的频率进行闪烁,这个频率是通过邮箱消息1得到的,而任务7的功能则是通过邮箱消息1给任务6发送一个LED的闪烁频率值,这个值每分钟更新一次。每个任务在完成自己的动作之后把CPU的使用权交给操作系统。

//任务6接受任务7通过邮箱消息1发送过来的LED闪烁频率,当接受到有效的消息时,更新LED的闪烁频率
void  Task6(void *pdata)
{
 void *msg;
 static INT16U DelayNum = OS_TICKS_PER_SEC / 20;  //默认的闪烁频率

    pdata = pdata;                             /* 避免编译警告 */

    for (;;)                  //(1)
    {
  msg = OSMboxAccept(CommMbox1);
  if(msg != (void *)0)
  {
   DelayNum = *((INT16U *)msg);   //更新LED刷新频率  
  }


  if((IO1SET & LED3) == 0) IO1SET = LED3;
  else       IO1CLR = LED3; 

        OSTimeDly(DelayNum);        //(3)
    }
}

 

 

 

//任务7通过邮箱消息1给任务6发送LED闪烁的频率,每分钟更新一次LED的闪烁频率
void  Task7(void *pdata)
{
 INT8U err;
 INT16U LedDelay[4] = {OS_TICKS_PER_SEC/10,OS_TICKS_PER_SEC/5,OS_TICKS_PER_SEC,OS_TICKS_PER_SEC*3};//100ms  200ms  1s  3s
 static INT8U i = 0;

    pdata = pdata;                             /* 避免编译警告 */

    for (;;)                  //(1)
    {

  err = OSMboxPost(CommMbox1 , (void *)&LedDelay[i++]);
  i = i & 0x03;
  
  if(err != OS_NO_ERR);       //消息错误进行处理

        OSTimeDly(OS_TICKS_PER_SEC*60);        //延迟一分钟 
    }
}

 

以上的两个任务简单的实现了多任务的环境,操作系统的好处就是每个任务都可以独立的编写,可以同时开发,之间有数据交换的桥梁,当然,如果只是实现以上的功能可以完全不必要使用操作系统,用一段很简单的代码就可以实现了。这只是操作系统的一些使用,希望对入门的人有所帮助。

 

读后感:UC/OS-II是一个健壮、可靠、简单、可移植性高的嵌入式操作系统,目前已经在一个航天项目中使用了,可知,它的性能还是很优越的。在产品开发中使用UC/OS-II可以加快产品的开发,使开发变得更加的简单,当你使用过操作系统来开发产品时,你就再也不会回到那可恶的前后台系统了。代码的可靠性,可阅读性及可修改性一直是评价一段代码的优越与否的其中标准。当一个老的产品开发工程师离开公司,新的工程师来修改以前的代码时,有些人会发现很痛苦,真的还不如从头开始编写呢。使用了UC/OS-II之后你可以简化这个过程,使代码的可修改性更高。嵌入式要求的是硬件中的软件,许多优秀的硬件工程师会发现从汇编到C语言的转变很困难,同时,从前后台系统的结构到操作系统的结构也是很困难的,当你编写过一个大型的前后台系统时,你会发现你很难管理这一大堆的任务之间的关系及执行的逻辑,这些是你必须考虑的,而且很容易再这方面出现错误,当你修改一个地方的时候说不定是牵一发而动全身啊,而且逻辑之间的复杂关系也不便于以后的工程师对代码进行修改。其实,你在编写一个前后台系统的时候已经有了一些操作系统的概念在里面了,至少任务之间的调度程序你已经实现了,呵呵,不过这只是简单的调度而已,当有一个操作系统来为你完成这件事情你何乐而不为呢?来吧,大家一起进入操作系统的世界吧,开发基于操作系统的代码,尽量少用前后台系统,会让你感觉到编程的乐趣,你可以有更多的时间来完成你的功能,

阅读(1360) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~