0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

uC/OS--II的性能特性,任务控制块OS_TCB将被赋值

Q4MP_gh_c472c21 来源:未知 作者:李倩 2018-04-20 14:26 次阅读

uC/OS----Micro Controller OS微控制器操作系统,美国人Jean Labrosse于1192年完成,1998年出现uC/OS--II,2000年NASA许可可用于飞行器中(无人机中有木有啊!但是很少有极客把他用到飞控中,APM的操作系统是一个裁剪的Linux--Nuxxt什么鬼的)。

uC/OS--II的性能特性不跟大家废话了,大家自己去看它的中文手册吧。有几点要注意理解:

1、用户任务只有56个,因为有8个是系统保留的,这有点像Linux下的系统服务daemons。如空闲任务、统计任务都是系统保留任务。

2、uC/OS中所有函数的调用和服务都有确定的时间,也就是说函数的执行周期确定、执行时间确定,这个由统计任务OSTaskStat()来完成。

3、任务的优先级就是它的标识符,最低优先级 OS_LOWEST_PRIOR=63.

下面进入主题--任务机制。

任务控制块TCB:TCB是描述任务的核心数据结构,存放了它的各种管理信息,包括任务堆栈指针,任务的状态、优先级,任务链表指针等;一旦务建立了,任务控制块OS_TCB将被赋值。

typedef struct os_tcb
{
栈指针;
INT16U OSTCBId;
/*任务的ID*/
链表指针;
OS_EVENT *OSTCBEventPtr; /*事件指针*/
void *OSTCBMsg;
/*消息指针*/
INT8U OSTCBStat;
/*任务的状态*/
INT8U OSTCBPrio;
/*任务的优先级*/
其他……

}OS_TCB;

OSTCBStkPtr:指向当前任务栈顶的指针,每个任务可以有自己的栈,栈的容量可以是任意的;

OSTCBStkBottom:执行任务栈底的指针;OSTCBStkSize:栈的容量,用可容纳的指针数目而不是字节数(Byte)来表示。

值得一提的是链表指针,这个设计可以快速的使任务就绪和休眠。所有的务控制块分属于两条不同的链表,单向的空闲链表(头指针为OSTCBFreeList)和双向的使用链表(头指针为OSTCBList);OSTCBNext、OSTCBPrev:用于将任务控制块插入到空闲链表或使用链表中。每个任务的任务控制块在任务创建的时候被链接到使用链表中,在任务删除的时候从链表中被删除。双向连接的链表使得一成员都能快速插入或删除。

任务的五个状态:休眠、就绪、运行、中断、挂起(阻塞)。

各状态间的相互转换:

好了,既然一共有64个任务,那我是怎么知道现在到底该运行哪个任务呢?这就是任务就绪表的工作了。

多列几种就绪情况会发现,OSRdyGrp和OSRdyTbl[]的赋值与优先级priority有一定的关系哦。我们先列一个编码表叫OSMapTbl[7]=2^n.n=0.1.2...7(同理就有OSUnMapTbl[7])。可以得到这个公式

说明OSRdyGrp与优先级的高三位有关、OSRdyTbl与优先级的低三位有关.通过上面公式就可以把相应的任务标志为就绪状态。既然有让他进入就绪态的方法,也就有让他解除就绪状态--休眠态的方法

.

任务的调度。前面的准备工作做好了之后,下面就可以真正的运行任务了。确定哪个务的优先级最高,应该选择哪个任务去运行,这部分的工作是由调度器(Scheduler)来完成的。任务级的调度是由函数OSSched()完成的;中断级的调度是由另一个函数OSIntExt()完成的。

首先根据就绪表确定最高优先级。然后根据最高优先级替换当前任务的TCB,进行上下文切换。

void OSSched(void)

{

INT8U y;

OS_ENTER_CRITICAL();

OS_EXIT_CRITICAL();

}

可以看到实际执行任务切换的是OS_TASK_SW()函数(也就是OSCtxSW()),我们看下任务切换的过程:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6808

    浏览量

    147618
  • UC
    UC
    +关注

    关注

    1

    文章

    57

    浏览量

    60706

原文标题:重拾uC/OS-II之任务机制理解

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Micro Controller OS控制器操作系统应用设计方案

    任务控制TCB:TCB是描述任务的核心数据结构,存放了它的各种管理信息,包括任务堆栈指针,
    的头像 发表于 04-25 08:52 8970次阅读
    Micro Controller <b class='flag-5'>OS</b>微<b class='flag-5'>控制</b>器操作系统应用设计方案

    UC/OS-II操作系统——任务(一)

    本帖最后由 ax918 于 2012-2-22 14:41 编辑 UC/OS-II操作系统内核的主要工作就是对任务进行管理和调度。  1、任务的概念  从应程设计的角度来看,
    发表于 02-22 14:40

    OS_TCB *ptcb if(ptcb!=(OS_TCB *)0) 这个是什么意思?

    OS_TCB*ptcbif(ptcb!=(OS_TCB *)0)这个是什么意思?
    发表于 10-12 17:13

    ptcb除了if (ptcb == (OS_TCB *)0) {} 和if (ptcb == (OS_TCB *)1) {}外 ,还有其他情况没?

    请问各位大神,ptcb除了if (ptcb == (OS_TCB *)0) {}和if (ptcb == (OS_TCB *)1) {}外,还有其他情况没?在我那个ucosii版本中
    发表于 10-19 12:31

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等
    发表于 10-08 09:11

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等
    发表于 10-11 09:26

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等
    发表于 10-15 11:03

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等
    发表于 10-20 09:35

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等
    发表于 10-25 09:59

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等
    发表于 10-27 09:29

    请问不同书上讲的uC/OS是不是不同?

    我在图书馆借了uC/OS II原理上的书,上面在讲OS_TCB的时候,我看了原子大哥例程里面对OS_TCB的定义,比书上讲的少了些成员,比如
    发表于 02-25 06:35

    请问uC/OS-III 3.04.05中OS_TickTask对延时任务的剩余节拍都减1吗?

    for loop*/if (p_tcb == (OS_TCB *)0) break;elsep_tcb->TickPrevPtr = (OS_TCB *)0;} }这是对延迟
    发表于 08-06 00:27

    请问(OS_TCB *)&AppTaskStartTCB里的指针该怎么用?

    (OS_TCB *)&AppTaskStartTCB 这里的指针*是怎么回事 是什么用法??“()”是强制类型转换吗,
    发表于 09-23 04:35

    uC/OS-II源码包的下载

    ,如下图所示。uC/OS-II内核结构2、对各部分的进一步解释:第一部分 (1):与硬件无关的高层的操作系统部分大部分是关于任务的创建、信号量的创建、邮箱和队列的创建,以...
    发表于 08-05 08:09

    uC/OS-II—邮箱介绍

    uC/OS-II中邮箱是线程(任务)通讯的一种,使用邮箱能够发送一个指针,当然也可以发送指针大小的数据。
    的头像 发表于 09-11 15:35 684次阅读