uc-OS实时操作系统的应用和学习心得

时间:2019-05-12 14:43:27下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《uc-OS实时操作系统的应用和学习心得》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《uc-OS实时操作系统的应用和学习心得》。

第一篇:uc-OS实时操作系统的应用和学习心得

uc/OS实时操作系统的应用和学习心得

这是小弟我最近的研究成果,跟大家交流一下。目前正在研究嵌入式实时软件系统设计方法,有兴趣的高手交流一下。这里给大家简单剖析一下uCOS吧,希望对大家能有所帮助。不足之处多多指教,有问题可以讨论。一.uC/OS-II的移植

移植uC/OS对目标处理器有一定要求,这个可以参照<>一书中第8章的内容.整个嵌入式系统分为两大层:硬件层和软件层.这里主要研究软件层的架构.软件层主要分为四个部分:实时操作系统内核,与处理器相关部分,与应用相关部分,用户的应用系统.l 实时操作系统内核

实时操作系统对系统资源进行管理。主要包括任务分配和调度、系统时钟服务、内存管理、消息机制、异常处理等等。uC/OS所有系统服务均由内核提供。内核将应用系统和底层硬件结合成一个完整的实时系统。

移植的时候内核是不变的,开发者根据自己应用系统的需要来选择实时操作系统内核,开发者不能对内核随意访问,只能使用内核提供的功能服务来开发自己的应用系统。内核确定,那么所提供的系统管理能力,系统服务也就得到了限定。开发者只能在规定的范围内对系统作些改动.2 与处理器相关的代码

这是移植中最关键的部分.内核将应用系统和底层硬件有机的结合成一个实时系统,要使同一个内核能适用于不同的硬件体系,就需要在内核和硬件之间有一个中间层,这就是与处理器相关的代码.处理器不同,这部分代码也不同.我们在移植时需要自己处理这部分代码,可以自己编写,也可以直接使用已经成功移植的代码.在uC/OS中这一部分代码分成三个文件:OS_CPU.H, OS_CPU_A.ASM, OS_CPU_C.C 1)OS_CPU.H 包括了用#define定义的与处理器相关的常量,宏和类型定义.具体来讲有系统数据类型定义,栈增长方向定义,关中断和开中断定义,系统软中断的定义等等.2)OS_CPU_A.ASM 这部分需要对处理器的寄存器进行操作,所以必须用汇编语言来编写.包括四个子函数:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR().OSStartHighRdy()在多任务系统启动函数OSStart()中调用.完成的功能是:设置系统运行标志位OSRunning = TRUE;将就绪表中最高优先级任务的栈指针Load到SP中,并强制中断返回.这样就绪的最高优先级任务就如同从中断里返回到运行态一样,使得整个系统得以运转.OSCtxSw()在任务级任务切换函数中调用的.任务级切换是通过SWI或者TRAP人为制造的中断来实现的.ISR的向量地址必须指向OSCtxSw().这一中断完成的功能:保存任务的环境变量(主要是寄存器的值,通过入栈来实现),将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回.这样就完成了任务级的切换.OSIntCtxSw()在退出中断服务函数OSIntExit()中调用,实现中断级任务切换.由于是在中断里调用,所以处理器的寄存器入栈工作已经做完,就不用作这部分工作了.具体完成的任务:调整栈指针(因为调用函数会使任务栈结构与系统任务切换时堆栈标准结构不一致),保存当前任务SP,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回.这样就完成了中断级任务切换.OSTickISR()系统时钟节拍中断服务函数,这是一个周期性中断,为内核提供时钟节拍.频率越高系统负荷越重.其周期的大小决定了内核所能给应用系统提供的最小时间间隔服务.一般只限于ms级(跟MCU有关),对于要求更加苛刻的任务需要用户自己建立中断来解决.该函数具体内容:保存寄存器(如果硬件自动完成就可以省略),调用OSIntEnter(),调用OSTimeTick(),调用OSIntExit(),恢复寄存器,中断返回.3)OS_CPU_C.C UC/OS中共定义了6个函数在该文件中.但是最重要的是OSTaskStkInit().其他都是对系统内核的扩展时用的.OSTaskStkInit()是在用户建立任务时系统内部自己调用的,对用户任务的堆栈进行初始化.使建立好的进入就绪态任务的堆栈与系统发生中断并且将环境变量保存完毕时的栈结构一致.这样就可以用中断返回指令使就绪的任务运行起来.具体的入栈方式要根据不同mcu而定.需要参考用户使用的mcu说明书.同时还要考虑mcu的栈生成方式.这需要根据具体问题来分析,在此不做过多论述.3 与应用相关的代码

这一部分是用户根据自己的应用系统来定制合适的内核服务功能.包括两个文件:OS_CFG.H, INCLUDES.H.OS_CFG.H来配置内核,用户根据需要对内核进行定制,留下需要的部分,去掉不需要的部分,设置系统的基本情况.比如系统可提供的最大任务数量,是否定制邮箱服务,是否需要系统提供任务挂起功能,是否提供任务优先级动态改变功能等等.INCLUDES.H系统头文件,整个实时系统程序所需要的文件,包括了内核和用户的头文件.4 用户应用系统

这是整个实时系统的最高层,用户通过利用实时操作系统提供的服务来开发自己的具体程序.二.用户应用系统编写的模式

kernel提供给用户一些功能函数,使得用户的系统建立更加方便,但是kernel内部不会处理用户的工作,对于整个系统的具体应用工作还得需要用户自己去考虑,如何利用好这些功能服务函数就成为一个比较重要的问题.1.main函数的结构 void main(void){ 初始化系统的硬件;OSInit();任务的建立,消息机制的建立;OSStart();} 这里需要的是在OSStart()执行之前不得启动中断,硬件系统还不能工作.必须先让软件系统进入工作状态后才行.2.中断的结构 ISR: { 保存处理器寄存器的值;调用OSIntEnter();执行用户的工作;调用OSIntExit();恢复处理器寄存器的值;RTI;} 用户的中断形式和以前一样,没有什么大的变化,仅仅是在原来用户ISR的基础上在固定的位置加了两个函数:OSIntEnter(), OSIntExit().3.各个任务的结构 void YourTask(void){ for(;;){ 用户代码 调用的系统服务 } } 在任务启动函数执行完后,系统会切换到最高优先级的任务去执行,此时,可以将系统硬件部分的启动放在该任务的最前边,仅仅是启动时执行一次,主要是启动系统的节拍中断,或者一些必须在多任务系统调度后才能初始化的部分,使系统的真正开始工作,达到软件硬件的基本同步.Void HighestPrioTask(void){ OSStartHardware();For(;;){ 用户代码 调用的系统服务 } } 用户可以按照这些格式去编写自己的任务,建立自己的应用系统.

第二篇:UCOS学习心得

ucos学习分析总结

2009-11-08 19:54:0

2此资料由自己学习总结和网上收集整理来的大家相互学习交流

龙心

2009.9.10

1.在uC/OS-II的帮助手册内,作者特地强调绝对不能在OSInit()或者OSStart()内

调用Timer初始化程序,那会破坏系统的可移植性同时带来性能上的损失。

所以,一个折中的办法就是:

在优先级最高的程序内调用,这样可以保证当OSStart()调用系统内部函数

OSStartHighRdy()开始多任务后,首先执行的就是Timer初始化程序。或者

专门开一个优先级最高的任务,只做一件事情,那就是执行 Timer初始化,之后通过调用OSTaskSuspend()将自己挂起来,永远不再执行。不过这样会

浪费一个TCB空间。对于那些RAM吃紧的系统来说,还是不用为好。

2.(三)一些重要的uC/OS-II API介绍

任何一个操作系统都会提供大量的API供程序员使用,uC/OS-II也不例外。由于uC/OS-II面向的是嵌入式开发,并不要求大而全,所以内核提供的API也就大多和多任务息息相关。主要的有以下几类:

1)任务类

2)消息类

3)同步类

4)时间类

5)临界区与事件类

我个人认为对于初级程序员而言,任务类和时间类是必须要首先掌握的两种类型的API。下面我就来介绍比较重要的:

1)OSTaskCreate函数

这个函数应该至少再main函数内调用一次,在OSInit函数调用之后调用。作用就是创建 一个任务。目前有四个参数,分别是任务的入口地址,任务的参数, 任务堆栈的首地址和

任务的优先级。调用本函数后,系统会首先从TCB空闲列表内申请一个空的TCB指针,然后 将会根据用户给出参数初始化任务堆栈,并在内部的任务就绪表内标记该任务为就绪状态。

最后返回,这样一个任务就创建成功了。

2)OSTaskSuspend函数

这个函数很简单,一看名字就该明白它的作用,它可以将指定的任务挂起。如果挂起的是 当前任务的话,那么还会引发系统执行任务切换先导函数OSShed来进行一次任务切换。这个函数只有一个参数,那就是指定任务的优先级。那为什么是优先级呢?事实上在系统 内部,优先级除了表示一个任务执行的先后次序外,还起着分别每一个任务的作用,换句话 说,优先级也就是任务的ID。所以uC/OS-II不允许出现相同优先级的任务。

3)OSTaskResume函数

这个函数和上面的函数正好相反,它用于将指定的已经挂起的函数恢复成就绪状态。如果 恢复任务的优先级高于当前任务,那么还为引发一次任务切换。其参数类似

OSTaskSuspend

函数,为指定任务的优先级。需要特别说明是,本函数并不要求和OSTaskSuspend函数成对使

用。

4)OS_ENTER_CRITICAL宏

很多人都以为它是个函数,其实不然,仔细分析一下OS_CPU.H文件,它和下面马上要谈到的 OS_EXIT_CRITICAL都是宏。他们都是涉及特定 CPU的实现。一般都被替换为一条或者几条

嵌入式汇编代码。由于系统希望向上层程序员隐藏内部实现,故而一般都宣称执行此条指 令后系统进入临界区。其实, 它就是关个中断而已。这样,只要任务不主动放弃CPU使用权, 别的任务就没有占用CPU的机会了,相对这个任务而言,它就是独占了。所以说进入临界区了。

这个宏能少用还是少用,因为它会破坏系统的一些服务,尤其是时间服务。并使系统对外界响 应性能降低。

5)OS_EXIT_CRITICAL宏

这个是和上面介绍的宏配套使用另一个宏,它在系统手册里的说明是退出临界区。其实它就 是重新开中断。需要注意的是,它必须和上面的宏成对出现,否则会带来意想不到的后果。最坏的情况下,系统会崩溃。我们推荐程序员们尽量少使用这两个宏调用,因为他们的确会

破坏系统的多任务性能。

6)OSTimeDly函数

这应该程序员们调用最多的一个函数了,这个函数完成功能很简单,就是先挂起当起当前任务,然后进行任务切换,在指定的时间到来之后,将当前任务恢复为就绪状态,但是并不一定运行, 如果恢复后是优先级最高就绪任务的话,那么运行之。简单点说,就是可以任务延时一定时间 后再次执行它,或者说,暂时放弃CPU的使用权。一个任务可以不显式的调用这些可以导致放弃CPU使用权的API,但那样多任务性能会大大降低,因为此时仅仅依靠时钟机制在进行任务切换。一个好的任务应该在完成一些操作主动放弃使用权,好东西要大家分享嘛!

3.我们推荐程序员们尽量少使用OS_ENTER_CRITICAL宏和 OS_EXIT_CRITICAL宏两个宏调用,因为他们的确会破坏系统的多任务性能。why??

4.在以uC/OS为操作系统的项目中,系统可能要处理各种不同的中断请求,如果某个中断处理

程序需要调用uC/OS的各种Post函数向任务发出消息,那么uC/OS建议中断服务程序的写法是:

1、保存全部CPU寄存器

2、调用OSIntEnter或OSIntNesting直接加

13、执行用户代码做中断服务

4、调用OSIntExit5、恢复所有CPU寄存器

6、执行中断返回指令

暂且称为“标准中断”方式,这种方式实际上是将这个中断处理加入了任务调度系统,也就是 说这个中断可以引起任务的切换。

第三篇:实时操作系统报告

实时操作系统课程实验报告

专业:通信1001 学号:3100601025 姓名:陈治州

完成时间:2013年6月11日

实验 简易电饭煲的模拟

一.实验目的:

掌握在基于嵌入式实时操作系统µC/OS-II的应用中,基于多任务的模式的编程方法。锻炼综合应用多任务机制,任务间的通信机制,内存管理等的能力。

二.实验要求:

1.按“S”开机,系统进入待机状态,时间区域显示当前北京时间,默认模式“煮饭”;2.按“C”选择模式,即在“煮饭”、“煮粥”和“煮面”模式中循环选择;

3.按“B”开始执行模式命令,“开始”状态选中,时间区域开始倒计时,倒计时完成后进入“保温”状态,同时该状态显示选中,时间区域显示保温时间;

4.按“Q”取消当前工作状态,系统进入待机状态,时间区域显示北京时间,模式为当前模式;

5.按“X”退出系统,时间区域不显示。

6.煮饭时长为30,煮粥时长为50,煮面时长为40.三.实验设计:

1.设计思路:

以老师所给的五个程序为基础,看懂每个实验之后,对borlandc的操作有了大概的认识,重点以第五个实验Task_EX为框架,利用其中界面显示与按键扫描以及做出相应的响应,对应实现此次实验所需要的功能。

本次实验分为界面显示、按键查询与响应、切换功能、时钟显示与倒计时模块,综合在一起实验所需功能。2.模块划分图:(1)界面显示:

Main()Taskstart()Taskstartdispinit()在TaskStartDispInit()函数中,使用PC_DispStr()函数画出界面。(2)按键查询与响应:

Main()Taskstart()在TaskStart()函数中,用if(PC_GetKey(&key)== TRUE)判断是否有按键输入。然后根据key的值,判断输入的按键是哪一个;在响应中用switch语句来执行对应按键的响应。(3)切换功能:

l计数“C”按键的次数M=l%3Switch(m)M=0,1,2对应于煮饭,煮粥,煮面,然后使用PC_DispStr()函数在选择的选项前画上“@”指示,同时,在其余两项钱画上“ ”以“擦出”之前画下的“@”,注意l自增。

四.主要代码:

#include “stdio.h” #include “includes.h” #include “time.h” #include “dos.h” #include “sys/types.h” #include “stdlib.h” #define TASK_STK_SIZE

512

#define N_TASKS

OS_STK

TaskStk[N_TASKS][TASK_STK_SIZE];

OS_STK

TaskStartStk[TASK_STK_SIZE];

INT8U

TaskData[N_TASKS];

void Task0(void *pdata);

void TaskStart(void *pdata);

static void TaskStartDispInit(void);

void main(void){

PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);

OSInit();

PC_DOSSaveReturn();

PC_VectSet(uCOS, OSCtxSw);

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

OSStart();

} void TaskStart(void *pdata){ #if OS_CRITICAL_METHOD == 3

OS_CPU_SR cpu_sr;#endif

INT8U l,m;

INT16S key;

l=0;

pdata = pdata;

TaskStartDispInit();

OS_ENTER_CRITICAL();

PC_VectSet(0x08, OSTickISR);

PC_SetTickRate(OS_TICKS_PER_SEC);

OS_EXIT_CRITICAL();

OSStatInit();

for(;;){

if(PC_GetKey(&key)== TRUE)

{

switch(key)

{

case 0x1B:

PC_DOSReturn();

break;

case 0x43:

{ m=(l%3);

switch(m)

{ case 0: {

PC_DispStr(26,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(55,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);} break;

case 1: { PC_DispStr(26,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

PC_DispStr(55,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);} break;case 2: { PC_DispStr(26,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(55,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);}

break;}

l++;} break;

} } OSCtxSwCtr = 0;

OSTimeDlyHMSM(0, 0, 1, 0);

} } static void TaskStartDispInit(void){ PC_DispStr(0, 0, “

uC/OS-II, The Real-Time Kernel

”, DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);PC_DispStr(0, 1, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 2, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 3, “

dianfanbao shiyan

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 4, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 5, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 6, “

kai shi.zhu fan.zhu zhou.zhu mian.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 7, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 8, “

bao wen.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 9, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 10, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 11, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 12, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 13, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 14, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 15, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 16, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 17, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 18, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 19, “ 'S':kai ji.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 20, “ 'C':mo shi qie huan.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 21, “ 'B':kai shi zhi xin.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 22, “ 'Q':qu xiao dang qian gong zuo zhuang tai.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 23, “ 'X':tui chu xi tong.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);

PC_DispStr(0, 24, “

<-PRESS 'ESC' TO QUIT->

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);}

五.运行界面:

(1)主界面:

(2)显示北京时间:

(3)模式切换:

(4)倒计时:

(5)保温执行时间:

六.总结:

本次实验主要以老师所给的实验事例为基础,并结合老师课堂讲的内容,理解编写程序。做实验本实验前,先执行了一下事例程序,以此了解borlandc的一些基本操作;然后就是看懂每个实验的框架和主要部分;接着,将事例程序中的部分思想运用到本次实验中,其中以显示界面的思想运用的最多;除此以外,在模式切换上花了最大的精力,最终的解决方法是以变量l作为一个计数值,并运用switch语句在选择的模式上画上“@”,同时还得注意在未选择的模式上画上空格来“擦除”之前画上的@;在查询按键上,同样运用switch语句......这次实验收获不少,不仅对之前学的C语言有了更进一步的巩固,而且还强化了ucos里面的多任务的一些认识;同时,以前对DOS界面很陌生,但本次实验使用的正是DOS界面,通过几天的经历,对DOS中的编译、“help”等各个方面有了更深入的认识,不再害怕使用DOS了。

对本课程有很大的兴趣,在以后的课余时间里我会不断学习这些知识。

第四篇:基于UCOS嵌入式实时操作系统的单任务和多任务LED显示总结----娄...

基于uCOSII的单任务和多任务LED显示

一、uCOSII简介

uCOS II是一个微型的实时操作系统,包括了一个操作系统最基本的一些特性,如任务调度、任务通信、内存管理、中断管理、定时管理等。而且这是一个代码完全开放的实时操作系统,简单明了的结构和严谨的代码风格,非常适合初涉嵌入式操作系统的人士学习。

二、设计目的

通过实验,学习在uC/OSII操作系统中单任务控制LED闪烁和多个任务控制LED之间的切换和同步,以及多任务控制程序的编写方法。

三、裸机程序和uCOSII 的运行流程对比

3.1 裸机程序的运行流程

裸机主函数的运行流程:

这个是我们写一般的单片机程序的流程,就是在主函数中用死循环执行功能函数,然后加上中断。3.2 uCOSII 的运行流程

uCOSII是一个操作系统,但是说到底也是一个支持任务切换的裸机程序。在初始化变量OSInit函数中,初始化所有全局变量,数据结构,创建最低优先级空闲任务OSTaskIde,并创建6个空数据链表:空任务控制块链表,空事件控制块链表,空列队控制块链表,空标志组链表,空内存控制块链表,空闲定时器控制块链表

创建任务 OSTaskCreate函数,一般创建一个最高优先级任务TaskStart任务,任务调度后,在这个任务中再创建其他的任务,初始化硬件,并打开中断。

进入多任务管理阶段OSStart函数,将就绪表中最高优先级任务的栈指针加载到SP中,并强制中断返回。

任务调度工作就是查找就绪表中优先级最高的任务,实现任务的切换。简单来说,裸机程序在主函数中通过死循环执行各种函数,最终达到实现各种功能函数的目的。而uCOSII系统,通过不断的产生定时中断,或则任务主动放弃CPU,然后进行任务之间的调度,相当于不断循环执行不同的任务,最终实现各种任务。

四、工作原理

4.1uCOSII 的内核管理

4.1.1 ucos的文件结构:

应用软件Ucos(与处理器无关的代码)OS_CORE.COS_FLAG.COS_MBOX.COS_MEM.COS_MUTEX.COS_Q.COS_SEM.COS_TASK.COS_TIME.CUCOS_11.CUCOS_11.HUCOS-11配置(与应用相关)OS_CFG.HINCLUDE.HUCOS移植(与处理器相关代码)OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C硬件4.1.2 临界段:

OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。它们可以用不同的方法去实现,用定义(#define)常数OS_CRITICAL_METHOD(1,2,3)来选择用哪种方法来实现。

当OS_CRITICAL_METHOD=1时,表示用处理器指令关中断,完成OS_ENTER_CRITIACL,用开中断完成OS_EXIT_CRITICAL.利用这种方法有点小问题,即是调用UCOS功能函数之前,中断是关掉的,从UCOS返回后,中断就打开了。

当OS_CRITICAL_METHOD=2时,这种方法是在堆栈中保存中断的开关状态,然后再关中断。在实现OS_EXIT_CRITICAL时,只需简单的从堆栈中弹出原来中断的开关状态。利用这种方法,不论用户在调用函数之前中断是开着的还是关着的,函数的进入和返回状态都得到了保护。

当OS_CRITICAL_METHOD=3时,一些编译器提供了扩展功能,用户可以得到当前处理器的状态字,并保存在C函数的局部变量中,这个变量可以用于恢复PSW。在STM32中,我们一般都是用第三种模式。4.1.3 任务的状态:

任务状态之间的转换如下图:

特别值得注意的是,在任务执行的过程中可以被中断打断。4.1.4任务控制快:

系统必须为每个任务创建一个保存与该任务有关的相关信息的数据结构,这个数据结构就叫做该任务的任务控制块(TCB)。当任务的CPU使用权被剥夺时UCOS利用它来保存任务的状态。4.1.5就绪表:

每个就绪的任务都放在就绪表中,就绪表中有两个变量,OSRdyGRP和OSRdyTbl。OSRdyGrp中每一位表示8组任务中每一组是否有进入就绪态的任务。当有任务进入就绪态时,就绪表OSRdyTbl[]中相应元素的相应位也置为1。4.1.6任务调度OS_SCHED():

Ucos总是进行进入就绪态任务中优先级最高的任务,确定哪个任务优先级最高,这一工作就是有调度器完成的。4.1.7任务切换OS_TASK_SW():

需恢复该任务在CPU使用权被剥夺时保存下来的全部寄存器的值,之后,运行被切换的任务。

4.1.8给调度器上锁和开锁:

给调度器上锁函数OSSchedlock()用于禁止任务调度,直到任务完成后,调用调度器开锁函数OSSchedUnlock()为止。这两函数必须成对使用。4.1.9空闲任务OS_TaskIdle():

每个程序必须在初始化时建立一个空闲任务,这个任务没有其他任务进入就绪态时,投入运行,空闲任务永远处于就绪态。空闲任务始终设为最低优先级。OSTaskIdle()可以调用OSTaskIdleHook()让CPU进入STOP指令,从而进入低功耗模式。当应用系统有电池供电时,这种方式特别有用。

4.2uCOSII 的任务管理

4.2.1建立任务OSTaskCreat(): 如果想让UCOS管理用户的任务,必须先建立任务。可以通过将任务的地址和其他参数传递到以下两个函数之一来建立任务。当调用OSTaskCreat()时,需要四个OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)Task:是指向任务代码的指针,pdata:是任务开始执行是,传递给任务的参数的指针,ptos:是分配给任务的堆栈的栈顶指针,prio是分配给任务的优先级。

4.2.2任务堆栈OS_STK(): 每个任务都有自己的堆栈,堆栈必须申明为OS_STK类型,并且由连续的内存空间组成。可以静态分配堆栈空间,也可以动态分配堆栈空间。但是一般我们都是分配静态堆栈空间。4.2.3删除任务OSTaskDel():

有时需要删除任务,删除任务,是说任务返回并处于休眠态,并不是说任务的代码被删除了。4.3时间管理

4.3.1任务延迟函数OSTimeDly():

Ucos提供一个可以被任务调用而将任务延时一段特定时间的功能函数,即OSTimeDly().任务调用OSTimeDly()后,一旦规定的时间期满或者有其他的任务通过调用OSTimeDlyResume()取消了延时,他就会进入就绪状态。只有当该任务在所有就绪态任务中具有最高的优先级,它才会立即运行。4.3.2按时,分,秒延时函数OSRimeDLyHMSM():

OSTimeDly()一样,调用OSRimeDlyHMSM()函数也会是UCOS进行一次任务调度,并且执行下一个优先级最高的就绪任务。当OSTimeDlyHMSM()后,一旦规定的时间期满,或者有OSTimeDlyResume(),它就会马上处于就绪态。同样,只有当该任务在所有就绪态任务中具有最高的优先级,他才开始运行。

五、设计方案:

5.1单任务

在stm32的平台上移植ucosII,并且建立一个单任务,任务控制LED1以10HZ的频率闪烁。5.2多任务

在stm32的平台上移植ucosII,并且建立三个任务,三个任务分别控制LED1,LED2,LED3以10HZ,20HZ,50HZ的的频率闪烁。

六、程序流程图

多任务控制LED闪烁:

七、遇到的问题

7.1编译器报错,显示PUBLIC未定义

由于我们移植的核心代码用IAR编译的,由于编译器的不同,所以要把PUBLIC改成EXPORT。

7.2编译报错,显示,栈未定义

由于每个任务都要有独立的栈来保存局部变量,从本质上讲也就是将CPU寄存器的值保存到RAM中。在uCOS中,每一个任务都有一个独立的任务堆栈。

八、主要代码 8.1主函数

#include “includes.h” //包含所有头文件

OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE];//定义起始任务堆栈

int main(void){

BSP_Init();//板级初始化

OSInit();//系统初始化,创建空闲任务

OSTaskCreate(Task_Start,(void *)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1], STARTUP_TASK_PRIO);

OS_ENTER_CRITICAL();OSStart();

//把控制权交给操作系统,进行任务调度

return 0;} 8.2用户应用函数

#include “includes.h”

OS_STK task_led2_stk[TASK_LED2_STK_SIZE];

//任务2堆栈 OS_STK task_led3_stk[TASK_LED3_STK_SIZE];

//任务3堆栈 OS_STK task_led4_stk[TASK_LED4_STK_SIZE];

//任务4堆栈

void Task_Start(void *p_arg)

//task1 {

(void)p_arg;

//未用到传递参数,防止编译器报错

SysTick_init();

OSTaskCreate(Task_LED2,(void *)0,//

&task_led2_stk[TASK_LED2_STK_SIZE-1], TASK_LED2_PRIO);OSTaskCreate(Task_LED3,(void *)0,//

&task_led3_stk[TASK_LED3_STK_SIZE-1], TASK_LED3_PRIO);

OSTaskCreate(Task_LED4,(void *)0,//

&task_led4_stk[TASK_LED4_STK_SIZE-1], TASK_LED4_PRIO);

while(1)

{

LED1(ON);

OSTimeDlyHMSM(0, 0,0,100);

LED1(OFF);

OSTimeDlyHMSM(0, 0,0,100);

} } //任务2 void Task_LED2(void *p_arg){

(void)p_arg;

SysTick_init();

while(1)

{

LED2(ON);

OSTimeDlyHMSM(0, 0,0,200);

LED2(OFF);

OSTimeDlyHMSM(0, 0,0,200);

} }

//任务3 void Task_LED3(void *p_arg){

(void)p_arg;

SysTick_init();

while(1)

{

//LED3(ON);

OSTimeDlyHMSM(0, 0,0,300);

//LED3(OFF);

OSTimeDlyHMSM(0, 0,0,300);

} }

//任务4 void Task_LED4(void *p_arg){

(void)p_arg;

SysTick_init();

while(1)

{

LED3(ON);

OSTimeDlyHMSM(0, 0,0,40);

LED3(OFF);

OSTimeDlyHMSM(0, 0,0,40);

} }

娄宇庭

2014年5月5 日

第五篇:操作系统学习心得

操作系统学习心得

会计092班 姓名:潘东辉 学号:0904042062 1.下面就操作系统从2000年以来的发展做一个较简单的介绍。从一些文献中,我可以了解到:至2005年为止,用于通用计算机上的分布的操作系统主要两个家族:类Unix家族和微软Windows家族。而主机系统和嵌入式操作系统使用多样的系统,并且很多和Windows、Unix都没有直接的联系。类Unix家族包括多个组织的操作系统,其中有几个主要的子类包括System V、BSD和Linux。这里'Unix'是一个商标,开发组织允许使用操作系统在一个定义前提下自由地开发。这名字是通用大型设置操作系统类似组织 Unix。Unix系统运行在从巨型机到嵌入式系统的多种机器架构上。Unix主要使用于重要的商务服务器系统以及学院和工程环境中的工作站之上。和 AT&T Unix不同,自由软件比如Linux和BSD逐步开始流行,并且开始进入桌面操作系统领域。和一些Unix操作系统不同,像惠普公司的HPUX和IBM 公司的AIX是设计仅运行在客户购买的设备上,其中有一些特殊的(比如SUN公司的Solaris)可以运行在客户购买设备和基于工业标准的PC上。APPLE公司的Mac OS X是一个BSD特例,以取代早期小型市场上的苹果公司Mac OS,众多流行的Unix操作系统正在走向一体。微软公司的Windows操作系统家族起源于早期的IBM PC环境中的MS-DOS,现在版本是基于新的Windows NT内核,第一次是在OS/2中制定。和Unix不同,Windows只能运行在32位和64位的x86 CPU(如Intel或者AMD的芯片)上,尽管早期有版本运行于DEC Alpha,MIPS 和 PowerPC体系结构。今天Windows是一个流行的操作系统,在全球桌面市场中占有90%左右的份额,同时在中低端服务器市场也有广泛的应用,如 Web服务器和数据库服务器。

大型机系统,比如IBM公司的Z/OS,和嵌入式操作系统比如QNX、eCOs和PalmOS都是和Unix和Windows无关的操作系统,而 Windows CE、Windows NT Embedded 4.0和Windows XP Embedded都是和Windows相关的。

老的操作系统停留在市场包括类似IBM Windows的OS/

2、来自惠普的VMS(以前的DEC);苹果公司的Mac OS操作系统、非Unix先驱苹果公司Mac OS X,以及AmigaOS,第一个图形用户界面的操作系统,包括对于普通用户的高级的多媒体能力。

2.下面我简单的总结了一下操作系统的作用:操作系统在计算机系统中占据着一个非常重要的地位,它不仅是硬件与所有其他软件之间的接口,而且任何数字电子计算机都必须在其硬件平台上加载相应的操作系统之后,才能构成一个可以协调运转的计算机系统。只有在操作系统的指挥控制下,各种计算机资源才能被分配给用户使用。也只有在操作系统的支撑下,其他系统软件如各类编译系统、程序库和运行支持环境才得以取得运行条件。没有操作系统,任何应用软件都无法运行。有了操作系统就像是我们去饭店点菜一样方便,为我们提供了一个良好的平台,更好更直观的管理自己的计算机。操作系统主要有两方面重要的作用。

1)操作系统要管理系统中的各种资源,包括硬件及软件资源。操作系统对每一种资源的管理都必须进行以下几项工作:监视这种资源。该资源有多少,资源的状态如何,它们都在哪里,谁在使用,可供分配的又有多少,资源的使用历史等内容都是监视的含义。实施某种资源分配策略,以决定谁有权限可获得这种资源,何时可获得,可获得多少,如何退回资源等。分配这种资源。按照已决定的资源分配策略,对符合条件的申请者分配这种资源,并进行相应的管理事务处理。回收这种资源。在使用者放弃这种资源之后,对该种资源进行处理,如果是可重复使用的资源,则进行回收、整理,以备再次使用。2)操作系统要为用户提供的良好的界面。操作系统,必须为最终用户和系统用户这两类用户的各种工作提供良好的界面,以方便用户的工作。典型的操作系统界面有两类:一类是命令行界面,如Unix和MS-DOS;另一类则是图形化的操作系统界面,典型的图形化的操作系统界面是MS Windows。

3.下面我就谈谈我在学习操作系统这门公选课时所得到的感悟。老师的教学风格既保守又开放,完全不限制学生太多的想象空间,让我们能够尽情发挥自己的创造力。本来我感觉操作系统一定是一门枯燥乏味的学科,但是却被我们的老师讲述的生动具体。从学习操作系统的过程中,我感受到就算是一个操作系统学科也蕴含了很多知识,要想学得透彻,完全搞明白也不是那么容易的。随着科学技术的日益发展,计算机技术的提高速度是相当惊人的,过一段时间就会有所更新。我们在买来电脑时,就已经注定着它的技术在淘汰了,只要几个月的时间,也许它就会被超越,计算机在我们国家的发展还是在起步阶段。有很多地方时需要我们向别人学习的我们应该思考为什么我们必须要用微软的windous,而我们就没有更好的操作系统来取代它吗?我们作为一个大学生,虽然我不是计算机专业的,但是我们一定要想着多学一些知识来武装自己,不使自己过早的被时代所淘汰。更何况是现在这样一个竞争如此激烈的年代,我们更应该为自己的将来做长期的打算。

下载uc-OS实时操作系统的应用和学习心得word格式文档
下载uc-OS实时操作系统的应用和学习心得.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    计算机实时操作系统的改善措施

    《计算机实时操作系统的改善措施》 摘要: 实时系统在工业、商业和军事等领域都有非常广泛的用途,并且已经有很多实际的应用。一般来说,实时系统通常是比较复杂的,因为它必须处......

    嵌入式Linux实时操作系统习题总结

    第1章 1.嵌入式系统是指操作系统和功能软件集成于计算机硬件系统之中。嵌入式系统一般有3个主要的组成部分:硬件、实时操作系统以及应用软件。 2.嵌入式系统的三要素是嵌入、专......

    嵌入式实时操作系统 项目开发总结报告

    项目开发总结报告 分 类:软件项目计划 使用者:E-fanciers Version: 1.0 项 目 承 担 队伍:烟台大学 计算机学院 E-fanciers小组撰 写 人(签名): 许超 于歌 完 成 日 期: 2009-7-1......

    Linux操作系统学习心得

    Linux操作系统学习心得 这学期有幸学习了《嵌入式系统设计》这门课,在胡佳文老师的教导下深入了解了有关于嵌入式系统,ARM9,Linux系统等很多方面的知识,获益良多,在学习过程中......

    Linux操作系统学习心得

    Linux操作系统学习心得 Linux操作系统这个名词记得在很早以前就听过,但具体是什么样的系统却真的不知道,甚至都不知道它是手机系统还是电脑系统,知道的只是它好像比较不易......

    LINUX操作系统学习心得

    LINUX操作系统学习心得第一次看见LINUX这个词是在选择选修课的时候,根本不知道LINUX是什么东西,带着对计算机的喜爱,选了LINUX操作系统这门选修课。 经过这一个学期的学习,对LIN......

    嵌入式实时操作系统(dynaLinux),及其开发平台(精)

    嵌入式实时操作系统(dynaLinux),及其开发平台 公司简介: 注册时间:2003年3月24日 经济性质:合资 从事领域:电子信息 资产状况:注册资金100万人民币 人员状况:12人 股本结构: 中方:方......

    操作系统及Internet基本应用

    信 息 工 程 学 院 大学计算机基础 实习报告 学院:理学院 班级:应化113 姓名:尤牛奔 学号:2011014944成绩:A 一、实习题目 : 操作系统及Internet基本应用 二、实习过程 在上......