2817|0

446

帖子

0

TA的资源

裸片初长成(高级)

楼主
 

初学者之--理解嵌入式操作系统 [复制链接]

采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对于C/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为2.6版。

  1 FreeRTOS操作系统功能

  作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务治理、时间治理、信号量、消息队列、内存治理、记录功能等,可基本满足较小系统的需要。FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统答应不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。

  FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率。 ARM开发论坛

  2 FreeRTOS操作系统的原理与实现

  2. 1任务调度机制的实现


  任务调度机制是嵌入式实时操作系统的一个重要概念,也是其核心技术。对于可剥夺型内核,优先级高的任务一旦就绪就能剥夺优先级较低任务的CPU使用权,提高了系统的实时响应能力。不同于μC/OS-II,FreeRTOS对系统任务的数量没有限制,既支持优先级调度算法也支持轮换调度算法,因此FreeRTOS采用双向链表而不是采用查任务就绪表的方法来进行任务调度。系统定
义的链表和链表节点数据结构如下所示:
typedef struct xLIST{ //定义链表结构 unsigned portSHORPT usNumberOfItems; 字串4

//usNumberOfItems为链表的长度,为0表示链表为空 ARM开发论坛

volatile xListItem * pxHead;//pxHead为链表的头指针 http://www.armforum.cn

volatile xListItem * pxIndex; //pxIndex指向链表当前结点的指针 ARM
volatile xListItem xListEnd; //xListEnd为链表尾结点 ARM开发论坛
}xList; ARM

struct xLIST_ITEM { //定义链表结点的结构 M开发论坛
port Tick type xItem Value; http://www.armforum.cn
//xItem Value的值用于实现时间治理 http://www.armforum.cn

//port Tick Type为时针节拍数据类型, ARM
//可根据需要选择为16位或32位 ARM
volatile struct xLIST_ITEM * pxNext; M开发论坛
//指向链表的前一个结点 http://www.armforum.cn

void * pvOwner;//指向此链表结点所在的任务控制块 M开发论坛

void * pvContainer;//指向此链表结点所在的链表}; ARM

FreeRTOS中每个任务对应于一个任务控制块(TCB),其定义如下所示: 字串4

typedef struct tskTaskControlBlock { http://www.armforum.cn

portSTACK_TYPE * pxTopOfStack; 字串4

//指向任务堆栈结束处 http://www.armforum.cn
portSTACK_TYPE * pxStack; http://www.armforum.cn
//指向任务堆栈起始处 http://www.armforum.cn

unsigned portSHORT usStackDepth; //定义堆栈深度 ARM开发论坛
signed portCHAR pcTaskName[tskMAX_TASK_NAME_LEN];//任务名称 http://www.armforum.cn
unsigned portCHAR ucPriority; //任务优先级 字串4

xListItem xGenericListItem; 字串4

//用于把TCB插入就绪链表或等待链表 ARM
xListItem xEventListItem; ARM开发论坛

//用于把TCB插入事件链表(如消息队列) 字串8
unsigned portCHAR ucTCBNumber; //用于记录功能 字串4
}tskTCB; 字串4

  FreeRTOS定义就绪任务链表数组为xList pxReady—TasksLists[portMAX_PRIORITIES]。其中portMAX_PRIORITIES为系统定义的最大优先级。若想使优先级为n的任务进入就绪态,需要把此任务对应的TCB中的结点xGenericListltem插入到链表pxReadyTasksLiStS[n]中,还要把xGenericListItem中的pvContainer指向pxReadyTasksLists[n]方可实现。

  当进行任务调度时,调度算法首先实现优先级调度。系统按照优先级从高到低的顺序从就绪任务链表数组中寻找usNumberOfItems第一个不为0的优先级,此优先级即为当前最高就绪优先级,据此实现优先级调度。若此优先级下只有一个就绪任务,则此就绪任务进入运行态;若此优先级下有多个就绪任务,则需采用轮换调度算法实现多任务轮流执行。

  若在优先级n下执行轮换调度算法,系统先通过执行
(pxReadyTasksLists[n])→pxIndex=(pxReadyTasks-Lists[n])→pxlndex→pxNext语句得到当前结点所指向的下一个结点,再通过此结点的pvOwner指针得到对应的任务控制块,最后使此任务控制块对应的任务进入运行态。由此可见,在FreeRTOS中,相同优先级任务之间的切换时间为一个时钟节拍周期。

  以图l为例,设系统的最大任务数为pottMAX_PRIORITIES,在某一时刻进行任务调度时,得到pxReadyTasksLists.usNumberOfItems=O(i=2...portMAX_PRIORITIES)以及pxReadyTasksLists[1]。usNumberOfItems=3。由此内核可知当前最高就绪优先级为l,且此优先级下已有三个任务已进入就绪态.由于最高就绪优先级下有多个就绪任务,系统需执行轮换调度算法实现任务切换;通过指针pxlndex可知任务l为当前任务,而任务l的pxNext结点指向任务2,因此系统把pxIndex指向任务2并执行任务2来实现任务调度。当下一个时钟节拍到来时,若最高就绪优先级仍为1,由图l可见,系统会把pxIndex指向任务3并执行任务3。 字串4

  为了加快任务调度的速度,FrecRTOS通过变量ucTopReadyPriotity跟踪当前就绪的最高优先级。当把一个任务加入就绪链表时,假如此任务的优先级高于ucTopReadyPriority,则把这个任务的优先级赋予ucTopReadyPriority。这样当进行优先级调度时,调度算法不是从portMAX_PRIORITIES而是从ucTopReady-Priority开始搜索。这就加快了搜索的速度,同时缩短了内核关断时间。
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表