ucos II 学习笔记

来源:互联网 发布:zigbee网络层的特点 编辑:程序博客网 时间:2024/04/30 07:53


    之前有较多的接触Linux下的学习,ucos II 接触的比较少;在没有真正学习的时候,我觉得嵌入式操作系统从大的原理上讲都应该差不多,但是在真正接触并阅读了部分ucos的源代码后,就觉得这两者确实有些大的不同。

对新知识的学习,通过比较的方法可以有较深的理解,也可以更好的掌握它的特点,下面提出一些我学习的心得:

1. 嵌入式比较注重实践,所以上手ucos时多做实验必不可少,我用的是LPC1768的开发板,找了一些例程,根据自己的理解改了改代码;软件入门就是Hello world, 固件入门就是点亮Led了, 看着代码按照自己的意图控制着硬件运行,这感觉只有程序员自己才理解。

2. ucos II 优点是 可裁剪可定制, 生成的代码仅占15~20K,源代码公开,容易掌握和使用,如果有Linux多进程通信的知识,那么学起来应该比较简单。相对于裸机开发,ucos II将系统分为多个相对独立的任务,降低了系统的复杂度,增加了系统的可扩展性;可剥夺型内核提高了系统的实时性,可以按照优先级对事件作出合理的响应。

3. ucos II的缺点是功能比较弱,比较适合较低端的芯片,自身不支持TCP/IP协议栈,没有文件系统,不支持CPU时间片轮循;只适合做底层的、较简单的、对实时性要求较高的一些应用;相对裸机开发需要合理的划分系统的任务,需要开发人员同时熟悉系统的应用和系统自身的特点。

4.有一点不是很理解, 在使用ucos II 提供的任何功能之前,必须先调用OSInit()函数进行初始化。在main主函数中调用OSStart()启动多任务之前,至少要先建立一个任务。否则应用程序会崩溃,难道系统不能空转,这一点觉得不太合理。

    5. 典型的应用程序main函数如下所示:

void main(void)

/*-----硬件初始化,等用户代码初始化-----*/

    init_mcu();

    init_myInit();    

 

OSInit(); /* 初始化ucos II */

/*通过调用OSTaskCreate ( ) 或OSTaskCreateExt ( )创建至少一个任务;*/

OSTaskCreate(sample_Task, (void*)0, &sample_TaskStk[TASK_STK_SIZE - 1], 2 );

/*通过调用OSSemCreate() 创建信号量等任务通信方式;*/

CalcSem     = OSSemCreate(0);

OSStart(); /* 开始多任务调度!OSStart()永远不会返回 */

上例中如果创建了多个(n个)任务,在main函数调用OSStart()后,操作系统就启动了多任务调度,接管了CPU和其他资源的使用权,负责为每个任务分配CPU使用权和使用时间,同时对共享资源进行管理。从宏观上看,整个系统就象有多个执行的程序并行运行,每个程序都是无限循环的main函数。

在任一给定的时刻,ucos II的任务状态只能是以下5种之一:

 睡眠态:指任务驻留在程序空间(ROMRAM),还没有交给ucos II来管理。通过创建任务将任务交给ucos II。任务被删除后就进入睡眠态。

 就绪态:任务创建后就进入就绪态。任务的建立可以在多任务运行之前,也可以动态的由一个运行的任务建立。

 运行态:占用CPU资源运行的任务,该任务为进入就绪态的优先级最高的任务。任何时刻只能有一个任务处于运行态。

 等待状态:由于某种原因处于等待状态的任务。例如,任务自身延时一段时间,或者等待某一事件的发生。

 中断服务态:任务运行时被中断打断,进入中断服务态。正在执行的任务被挂起,中断服务子程序控制了CPU的使用权。


这时候我有一个疑问,每一个任务都是一个无线的循环,什么时候进行状态的切换,体现在代码的什么地方,进一步了解后了解到这个切换应该是通过时钟节拍和进程间的通信来实现的。

6. 时钟节拍,ucos II要求用户提供一个周期性的时钟源,来实现时间的延迟和超时功能,时钟节拍应该每秒发生10~100/秒。时钟节拍率越高,系统的额外负荷就越重;这个时钟让我想到了FPGA的系统时钟,是内部各种信号时序的依据。

    7.任务间的通信,如果对Linux接触较多,这点应该比较容易,包括信号量,互斥锁,消息队列等,消息邮箱在Linux中没有,但都大同小异。


对于应用上的学习就总结这几点,ucos II 不区分内核空间和应用空间,内存管理采用固定内存大小分配的方法避免了内存碎片的产生,其他的像任务调度,优先级判断之类的系统调用通过源代码的阅读可以更深入的了解,由于中断的存在,共享资源的原子操作应该多加注意,尤其是涉及硬件的操作,保证操作的过程不被打断。





0 0