UCOS基础概念总结

来源:互联网 发布:变声软件变成女人声 编辑:程序博客网 时间:2024/06/05 09:15

1、UCOS
UCOS III 是一个可裁剪、可固化、可剥夺型的多任务内核,没有任务数目限制。UCOS II有任务数量限制,最多64个任务。UCOS III与UCOS II的大致区别是:a,任务数目由64个变为无限个。b,优先级相同的任务数目由1个变为无限制个。c,UCOS III增加了时间片轮转调度。d,UCOS III可直接向任务发送信号,UCOS II不可以。e,UCOS III可直接向任务发送消息,UCOS II不可以。
2、任务函数 (Task Function)
与基本函数大致一样,特点是:a,一个while(1);死循环。b,循环内必须有任务切换。c,不能返回参数。如下:
void mytast(void *p_arg)
{
OS_ERR err;
p_arg=p_arg; //防止编译器报错
while(1)
{
……
}
}
3、系统内部任务
a,空闲任务 OS_IdleTask 在os_core.c文件中
系统自动创建。当没有任务调度时,内核运行此任务。
UCOS规定,一个用户应用程序必须使用这个空闲任务,而且这个任务不能通过程序来删除。
b,时钟节拍任务 OS_TickTask 在os_tick.c文件中
没有这个任务,操作系统就不能工作。好比人的心脏一样。
c,统计任务 OS_StatTask 在os_stat.c文件中
不是必须的,可选。这个任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在OSCPUsage中,以便其他应用程序来了解CPU的利用率。
d,中断服务管理任务 OS_IntQTask() 在os_int.c文件中 可选。
e,定时任务 由OS_CFG_TMR_EN控制。可选。
4、任务状态
休眠态、就绪态、运行态、等等态、中断态
休眠态
任务在FLASH中,还不受UCOS管理。任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫休眠态。
就绪态
任务分配了任务控制块,且任务已在就绪表中登记。
运行态
处于就绪状态的任务如果经调度器判断获得了CPU的使用权叫运行态。
等待态
正在运行的任务,需要等等一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给其他任务而使任务进入等待状态。即在等待列表的任务。
中断服务态
中断时,当前任务被挡土挂起。
下面是各状态关系图
这里写图片描述
5、任务堆栈 Task_stack
上下文切换的时候用来保存任务的工作环境,例如STM32的内部寄存器的值。
6、任务控制块 OS_TCB
用来记录任务的各个属性。
7、调度
在系统中,每个执行单元都争用CPU的使用权。要求操作系统提供一个合理分配CPU使用权的机制,这个给各个执行单元分配CPU使用权的过程就叫做调度。
8、任务调度 (The scheduler)
中止当前任务转去执行其他任务。UCOS任务调度是由任务调度器来完成的:分为任务级调度器OSSched()(调用OS_TASK_SW();)和中断级调度器OSIntExit()(调用OSIntCtxSw();)
9、任务调度器的基本功能
a、记录系统中各任务的执行状况。
b、选择任务占有CPU。
c、进行任务上下文的切换。
10、任务调度点
a、释放信号量或发送消息,也可通过配置相应的参数不发生任务调度。
b、使用延时函数OSTimeDly()或OSTimeDly HMSM()
c、任务等待的事情还没发生。如等等信号量pend。
d、任务取消等待。
e、删除任务。
f、删除一个内核对象。
g、任务改变自身的优先级或者其他任务的优先级。
h、任务通过调用OSTaskSuspend()将自身挂起。
i、任务解挂某个挂起的任务。
j、通过OSSchedunlock()给调度器解锁。
k、通过调用OSSchedRoundRobinYield()放弃其执行时间片。
l、创建任务
m、用户调用OSSched()。
11、调度器的上锁和解锁
有时不希望发生任务调度,因为有些代码不能被打断的。可用OSSchedLock()加锁,可用OSSchedUnlock()解锁。
12、时间片轮转调度
一个优先级下有多个任务,每个任务可以执行指定的时间叫时间片。然后轮到下个任务。这个过程叫时间片轮转调度。
OS_SchedRoundRobin();
13、任务切换
任务级切换函数:OSCtxSw();
中断级切换函数:OSIntCtxSw();
14、任务上下文 context
执行任务的现场称为上文,将要执行的任务(被选中的任务)叫下文。上文要保存在该任务的堆栈中,下文从该任务的堆栈中恢复。
15、线程与进程
具有独立内存运行空间的叫进程,如我们平时写的C程序,在运行时它在内存中的实体就叫进程;而多个运行程序实体共用一个内存空间的,它们的整体叫做进程,而这里面的单个实体则叫做“线程”。
UCOS II并没有给任务分配独立的运行空间,而是所有任务都是共同使用一个内存空间,故这里的任务属于线程。
16、进入临界区和退出临界区
临界区的代码是受保护的,不能被打断。
OS_CRITICAL_ENTER(); //进入临界区
OS_CRITICAL EXIT(); //退出临界区
17、任务间通信
一个任务或中断和另一个任务交流信息,消息传递的过程叫任务间通信。
18、任务间消息的传递途径
全局变量和发布信息。
19、消息 Message
指向数据的指针、数据的长度和记录消息发布时刻的时间戳。
大小为1的消息队列就是消息邮箱。
20、TLS 线程本地存储
Task Local Storage
21、信号量 semaphore –>sem
像是一种上锁机制。用于控制对共享资源的保护。最早用来控制任务存取共享资源,现在基本用来做任务同步。信号量分二进制信号量和计数型信号量。
二进制信号量:某一资源对应的信号量为1的时候,那么就可以使用这一资源,如果对应资源的信号量为0,那么等待该信号量的任务就会被放进等待信号量的任务表中。
计数型信号量:有时候我们需要同时有多个任务访问共享资源,这个时候二进制信号量就不能使用了,计数型信号量就是为了来解决这个问题的。
比如某一信号量初始值为10,那么只有前10个请求该信号量的任务可以使用共享资源,以后的任务需要等待前10个任务释放掉该信号量。每当有任务请求信号量的时候,信号量的值就会减一,直到减为0。当有任务释放掉信号量的时候信号量的值就会加1。
为了避免优先级反转的问题,引入了互斥型信号量MUTEX,即互斥型信号量就是为了解决优先级反转的。
内嵌信号量:任务内建的信号量,信号量的请求和发送前是不需要创建信号量的。
22、回调函数 (介入函数) HOOK
调用相应的任务时,执行此函数一次。用于给用户在里面写用户代码。
待续……

0 0
原创粉丝点击