a) 凡从事嵌入式系统开发的人,必须对嵌入式操作系统有足够的了解。
b) 对于初学者,从UC/OS-II开始是个明智的选择。在其中可以学习实时系统的一些编程技巧,具有很强的应用性。
a)什么是操作系统:
操作系统是一种为应用程序提供服务的系统软件,是一个完整的计算机系统的有机组成部分。
从层次上来看,操作系统位于计算机硬件之上,应用软件之下,所以也能把它叫做应用软件的运行平台。
b)计算机操作系统的作用:
从用户角度看,它就是一大堆函数,用户可以调用它们对系统资源进行操作。
它在计算机应用程序与计算机硬件系统之间,屏蔽了计算机硬件工作的细节,并对系统间的资源进行有效的管理。
通过提供函数,从而使应用程序设计人员得以友好在平台上进行应用程序的设计和开发,大大提高了应用程序的开发效率。
a ) 操作系统中经常使用的数据结构:数组,位图,结构体,链表,队列,堆栈。
应用:数组——记录同类事物的表
位图(数组的一种特殊应用)——登记表
结构体——通讯录中的一条记录,工具箱
链表——存放较大的表,类似于档案柜
队列——应用于对象的排队
堆栈——程序模块的嵌套运行
a) 什么是多任务系统
简单的说,就是能用一个处理器并发的运行多个程序的计算机管理系统(不是同时)。
深刻的理解PC是理解系统进行程序切换动作的关键。(PC←目标地址)
系统是通过把待运行程序的地址赋予程序计数器PC来实现程序的切换。
b)在内存中为每个任务创建一个虚拟的处理器。当需要执行虚拟处理器中的任务时,将虚拟处理器中的任务复制到实际处理器中,所以任务的切换也就是任务运行环境的切换。
a)具有控制块的程序才是一个可以被系统运行的任务。程序代码(程序),私有堆栈(用以保护运行环境),任务控制块(提供私有堆栈也就是虚拟处理器的位置)是任务的三要件,任务控制块提供了运行环境的储存位置。
a)UC/OS-II就是一个对小任务(线程)进行管理调度的多任务操作系统。
b)从应用程序设计的角度看,UC/OS-II的任务就是一个用户编写的C函数和与之相关的数据结构而组成的一个实体。
c)任务状态——
睡眠状态:任务在没有配别任务控制块,或者被剥夺了任务控制块时的状态。
就绪状态:系统为任务配备了控制块且在任务就绪表中进行了任务登记。
运行转态:处于就绪状态的任务,经调度器判断获得了CPU的使用权。
中断服务状态:正在运行的任务一旦响应中断申请就会终止运行去执行中断服务程序
等待状态:正在运行的任务,需要等待一段时间,或需等待一个事件的发生再运行时,该任务就会把CPU的使用权让给其他任务而进入等待状态。
D)任务控制块——任务在系统中的身份证
UC/OS-II是用任务的优先级来作为任务的标识的,所以任务控制块还要来保存任务的优先级别。
e) 空闲任务:OSTaskIdle(void*pdata),为了使CPU不处于无事可做的状态,添加空闲任务。且Uc/os-ii规定一个用户应用程序必须使用这个空闲任务且这个任务不能用软件来删除的。
f)统计任务(OSTaskStat()):UC/OS-II提供了另一个系统任务就是统计任务.。这个统计任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUSage中,以便应用程序来调用它来获得CPU的利用率。
g) UC/OS-II把任务优先级权分为64个优先级别,每个优先级别都用一个数字来表示,数字0表示优先级别最高。数字越大,优先级别越低。
h) 任务堆栈,保存CPU寄存器中的内容以及存储任务私有数据的需要,每个任务都应该配备自己的堆栈。
i)任务调度 :通过算法在多个任务中确定该运行的任务,做这项工作的函数就叫做调度器。UC/OS-II进行任务调度的思想就是“近似的每时每刻总是让优先级别最高的就绪任务处于运行状态,为了保证这一点,它在系统或用户任务调用系统函数结束时总是调用调度器来确定应该运行的任务并运行它”。
a)uc/os-ii接到中断请求后,如果CPU处于中断允许状态,系统就会中止当前正在运行的任务,而按照中断向量所指的地址去执行中断服务程序,当子程序运行结束后,系统将根据情况返回被中止的任务中继续执行,或者运行另一个更高优先级别的任务。
b)OSIntCtxSw() 叫做中断任务切换函数,负责中断中的任务切换函数。
c)应用程序中的临界段:在应用程序中,经常有些代码必须不受任何干扰连续运行,称之为临界段。
d) 系统时钟:uc/os与大多数计算机系统一样,用硬件定时器产生一个周期为MS级的周期性中断来实现时钟,最小的时钟单位就是两次中断间相间隔的时间,叫做时钟节拍。
e)OSTimeTick()来完成系统在每个时钟节拍需要作的工作。
A)为了把描述事件的数据结构统一起来,uc/os-I’i使用事件控制块ECB的数据结构,来描述诸如信号量,邮箱和消息队列这些事件,事件控制块中包含等待任务表在内的所有有关事件的数据。
b)把一个任务置于等待状态要调用OS_EventTaskWait()函数
d)消息邮箱:如果把数据缓冲区的指针赋给一个事件控制块的成员OSEventPr’t.同时使事件控制块的成员OSEventType为常数OS_EVENT_TYPE_MBOX,则该事件控制块叫做消息邮箱。
A) 应用程序在运行中为了某种特殊的需要,经常需要获得临时的内存空间,因此作为一个比较完善的操作系统必须具有动态分配内存的能力。
B) UC/OS-II改进了ANSIC用来动态动态分配释放内存的malloc()和free()函数。
a)编程步骤:1初始化任务函数,初始化任务优先级,设置任务堆栈大小,创建任务堆栈空间。
b)一般编程格式:
intmain()
{
/*****************调用模块初始化操作**********************/
OSInit(); //初始化UCOS系统操作
OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK(START_STK_SIZE-1),
START_TASK_PRIO)); //创建起始任务
OSStart(); //启动UCOS操作系统
}
Void start_task(void *pdata)
{
OS_CPU_SR_cpu_sr=0;
Pdata=pdata;
OSStartInit(); //初始化统计任务
OS_ENTER_CRITICAL(); //进入临界区,中断无法打断
OSTaskCreate(,,,); //需创建的程序
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务
OS_EXIT_CRITICAL(); //退出临界区,中断可以打断
}
c)常用函数:
任务挂起:OSTaskSuspend();
任务恢复:OSTaskResume();
任务删除:OSTaskDelReq();
任务创建:OSTaskCreate();