UCOSII原理与应用----基本概念和任务

1、实时操作系统是什么
实时操作系统:能够使计算机系统在一个规定的时间内及时响应外部请求并及时控制设备和实时任务协调运行的操作系统。
实时系统有两个基本要求:1、实时系统的计算必须产生正确结果,称逻辑或功能正确。2、实时系统的计算必须在规定时间完成。
根据对时间正确的程度,可以分成硬实时系统和软实时系统。
硬实时系统:必须在极严格的时间内完成实时任务。超过截止时间
软实时系统:对计算超时有一定的容忍度,超过允许的时间得到不会完全没有用途,只是这结果可信度有某种程度的降低。

2、任务的基本概念
在设计一个较为复杂的应用程序时,通常把一个大型任务分解成多个小任务,这样使系统并发的运行多个任务,从而提高处理器利用率,加快程序的执行过程。
在UCOSII中,与上述小任务对应的程序实体就叫“任务”,UCOSII是一个能对这些小任务的运行进行管理和调度的多任务操作系统。
从代码上看。UCOSII的任务就是一个个函数。而从任务的存储结构上看,ucos的任务由三部分组成:任务程序代码(函数)、任务堆栈和任务控制块。
1、任务控制块:关联任务代码的程序控制块,记录任务的各个属性。
2、任务堆栈可以看作任务控制块的二级结构控制块,用来指向CPU程序指针(程序计数器)PC的副本。PC值指向的总是执行指令的地方,也就是一个程序执行的位置。PC只有获得一个新地址从会使,才会使CPU运行新的任务。有时候,任务也会被分成“进程”,“线程”。具体的说:具有私有空间的任务叫进程,没有私有空间叫线程。所以UCOSII任务都属于线程
任务堆栈:用来保存任务的工作环境。
3、任务程序代码:执行任务功能的部分。
任务控制块

3、任务和状态
UCOSII任务有两种:用户任务和系统任务
用户任务:应用程序设计者编写的任务。为用户解决各种应用问题。
系统任务:系统提供的任务。是为应用程序提供服务或系统本身服务
最多64个任务(包括用户和系统任务)

UCOSII五种状态及其转化
任务状态
任务状态切换
任务中系统提供的两个任务。空闲任务和统计任务
空闲任务:在某个时间无用户可运行而处于空闲状态,为了让CPU在没有任务可执行时有事可做,ucos提供OSTaskIdle()的系统任务。
统计任务:每秒计算CPU在单位时间内被使用的时间,计算结果以百分比形式存放在变量OSCPUsage中,以便其他应用程序可以了解CPU的利用率。

优先级:64个任务,0、1、2、…、63数字越小,优先级越高
OS_CFG.H中定义最低优先级OS_LOWEST_PRIO。为了用户方便,最低优先级OS_LOWEST_PRIO自动赋值给空闲函数。如果还定义统计任务,优先级OS_LOWEST_PRIO-1自动赋值给统计任务。

4、任务堆栈
堆栈是指在存储器中按数据“先进口出(LIFO)”的原则组织的连续存储空间,为了满足任务切换和响应中断时保存CPU寄存器中的内容及任务调用其他函数时的需要,每个任务都需要有自己的堆栈。所以任务的控制块中都含有一个指向该任务堆栈的指针。

为了堆栈方便建立,在OS_CPU.H中定义一个数据类型OS_STK
typedef unsigned int OS_STK //16位
我们在每定义一个任务时需要定义一个数组和数据长度
#define APP_TASK_START_STK_SIZE 128 //定义堆栈长度256字节
OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; //定义一个数组作为任务堆栈
任务的创建
OSTaskCreateExt( AppTaskStart, //建立扩展任务(任务代码指针)
(void *)0, //传递参数指针
(OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE-1],//分配任务堆栈栈顶指针
APP_TASK_START_PRIO, //分配任务优先级
APP_TASK_START_PRIO, //(未来的)优先级标识(与优先级相同)
(OS_STK *)&AppTaskStartStk[0], //分配任务堆栈栈底指针
APP_TASK_START_STK_SIZE, //指定堆栈的容量(检验用)
(void *)0,//指向用户附加的数据域的指针
OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);//建立任务设定选项

OSTaskCreate()建立一个新任务,可以在多任务环境启动之前,或者运行任务中建立任务。注意,ISR中禁止建立任务,一个任务必须为无限循环结构。
OSTaskCreateExt()为OSTaskCreate()的扩展函数,允许更多的内容设置。
OSTaskCreateExt()可以兼容OSTaskCreate(),所以更推荐用扩展函数。
说明:
OSTaskCreate (void (*task)(void *pd), // 函数指针,void *pd为函数的参数
void *pdata, // 建立任务时,传递的参数
OS_STK *ptos, // 指向堆栈任务栈顶的指针
INT8U prio) // 任务优先级
指向堆栈任务栈顶的指针需要根据 处理器的堆栈增长方式。
向上增长:AppTaskStartStk[0]
向下增长:AppTaskStartStk[APP_TASK_START_STK_SIZE-1]
堆栈增长方式

4、任务控制块及其链表
任务控制块是一个结构体类型,包括该任务的基本信息(身份证),用户调用函数(OSTaskCreate )创建一个用户任务,该函数会对任务控制块的所有成员赋值相关信息(对本人身份证信息进行注册)。
在这里插入图片描述
在这里插入图片描述
OS_TCBStat用来存放任务的当前状态。 在这里插入图片描述

5、挂起任务函数OSTaskSuspend()
INT8U OSTaskSuspend(INT8U prio)
参数为挂起任务的优先级别。如果需要挂起自身,参数设置为常数OS_PRIO_SELF(在ucos_II.h中)
恢复函数
INT8U OSTaskResume(INT8U prio)
改变任务优先级
INT8U OSTaskChangePrio(INT8U oleprio,INT8U,newprio)
删除任务
INT8U OSTaskDel(INT8U prio)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值