Ucos-2学习笔记

  现在公司做项目用的是ucos系统,之前都在裸奔,现在从零开始,想把学习笔录记录下来。以供日后翻阅。眼前有本书是邵贝贝的,可是一看就有点头大,还是从零开始吧!

为什么要用操作系统?

裸奔程序是由先后顺序的,比如执行程序a时,程序B在等待,等a执行完后才允许B执行。而在操作系统上我们可以理解为多个任务都在执行,两个人物之间可以通过操作系统来协调,当优先级高的紧急任务可以抢占内核优先执行任务。Ucos2适用于小系统小规模的项目,可以提高执行效率。严格地说,uc/OS-II只是一个实时操作系统内核

它仅仅包含了任 调度、任务管理、时间管理、内存管理和任务间的通信和同步等基本功能,没有提供输入输出管理、文件系统、网络等额外的服务,我想后者可能是区别于linux的区别吧。但由于uc/OS-II良好的可扩展性和源码开放,这些非必需的功能完全可以由用户自己根据需要分别实现。

几个概念

什么是抢占式任务?

简单地说就是谁的优先级高谁就可以抢占内核或者空间来执行优先级高的任务。

或者这么说,高优先级任务可以在某些时刻抢占了正在CPU上运行的低优先级任务的CPU执行权限。根据抢占时机又可以分为用户空间抢占和内核抢占。

什么是任务调度机制?

首先要创建任务,创建任务的数目有限制,56个以内,创建任务也有优先级,优先级别为0时,优先级最高。系统初始化完毕后,外设驱动初始化完毕后,建立任务,任务中含有一些参数,包括返回值,优先级别,堆栈大小等,然后开始任务调度,也就是程序运行。

Ucos2的运行步骤?(工作原理)

首先进行操作系统初始化,主要完成任务控制块(tcb)初始化,然后开始创建新任务、初始化任务堆栈区,最后调用OSSTART()函数,开始任务调度。主函数如下:

int main(void) 

    INT8U ret = 0; 

    BspInit();      //外设功能初始化

RestoreConfigData();

OSInit();       //uCOS-II系统初始化 

/************************/

  /* 建立起始任务 */

    ret = OSTaskCreate(      Start_Task, //初始化任务

                               (void*)0, //无参数

    &Start_TaskStk[APP_TASK_STK_SIZE-1], //任务堆栈大小为128*4Byte

                       PRIO_START_TASK); //优先级最高2

    if (ret != OS_ERR_NONE)

    {

        DebugOut(0, "Start_Task 任务建立失败! error = %d\r\n", ret);

    }

OSStart();      //开始任务调度

return 0; 

}

在多任务调度开始后,启动时钟源开始计数,时钟的中断信号,延时,超时都是由此产生。  

当时钟中断来临时,系统把当前正在执行的任务挂起,保护现场,进行中断处理,判断有无任务延时到期。若有,则使该任务进入就绪态,并对所有进入就绪态的任务的优先级进行比较,通过任务切换去执行最高优先级的任务。若没有别的任务进入就绪态,则恢复现场继续执行原任务。另一种调度方式是任务级的调度,即通过发软中断命令或依靠处理器在任务执行中调度。如任务要等待信号量或一个正在执行的任务被挂起时,就需要在此任务中调度,找出目前处于就绪态的优先级最高的任务去执行。当没有任何任务进入就绪态时,就去执行空任务。

如图

参考资料

http://wenku.baidu.com/view/948dad0303d8ce2f00662300.html 

sitemap