- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8 章基于STM32F107 的FreeRTOS 移植
本章以FreeRTOS 在STM32F107 上的移植为主要内容,介绍移植的主要工作内容,及移植过
程需要注意的事项。
8.1 概述
FreeRTOS 的实现主要由list.c、queue.c、croutine.c 和tasks.c 4 个文件组成。list.c 是一个链表
的实现,主要供给内核调度器使用;queue.c 是一个队列的实现,支持中断环境和信号量控制;
croutine.c 和task.c 是两种任务的组织实现。协程(英文为croutine )是采用各任务共享同一个堆栈,
使RAM 的需求进一步缩小,但也正因如此,他的使用受到相对严格的限制。而task 则是传统的实
现,各任务使用各自的堆栈,支持完全的抢占式调度。
FreeRTOS 的主要功能可以归结为以下几点:
优先级调度、相同优先级任务的轮转调度,同时可设成可剥夺内核或不可剥夺内核
任务可选择是否共享堆栈(co-routines tasks ),并且没有任务数限制
消息队列,二值信号量,计数信号量,递归互斥体
时间管理
内存管理
与UC/OS-II 一样,FreeRTOS 在STM32 的移植大致由3 个文件实现,一个.h 文件定义编译器
相关的数据类型和中断处理的宏定义;一个.c 文件实现任务的堆栈初始化、系统心跳的管理和任务
切换的请求;一个.s 文件实现具体的任务切换。在本次移植中,使用的编译软件为IAR EWARM 6.3 。
8.2 FreeRTOS 移植
8.2.1 portmacro.h 头文件
PORTMACRO.H 头文件主要包括两部分内容。第一部分定义了一系列内核代码中用到的数据
类型。FreeRTOS 与uC/OS-II 一样,并不直接使用char、int 等这些原生数据类型,而是将其重新
定义为一系列以 port 开头的新类型。这样的好处在于,在不同架构的处理器移植时,仅需针对处
理器的位宽对这些数据类型做相应的调整,而无需繁琐地从头至尾修改源代码。
第二部分包含了实现 FreeRTOS 移植所需要定义的函数。包括与架构相关的定义、内核调度、
临界区管理、任务优化等。
1.数据类型定义
定义编译器相关的各种数据类型。在 uC/OS-II 的移植代码中,通常采用 typedef 来定义新的
267
类型,而FreeRTOS 的作者似乎更喜欢用宏定义#define 。虽然typedef 和#define 能够实现相同的功
能,但也有细微的区别,typedef 由编译器解释,而非预处理器执行,并且仅限于对数据类型进行
定义。尽管如此,typedef 在其受限范围内比#define 更为灵活。下面是相应的代码片段。
#define portCHAR char
#define portFLOAT float
#define portDOUBLE double
#define portLONG long
#define portSHORT short
#define portSTACK_TYPE unsigned portLONG
#define portBASE_TYPE long
2 .架构相关的定义
定义与处理器或控制器架构相关的宏定义。
条件编译中的代码是针对处理器的字长为16 位,工程配置时应在FreeRTOSConfig.h 中将宏定
义改为“#define configUSE_16_BIT_TICKS 1 ”,若处理器字长为 32 位,宏定义为“#define
configUSE_16_BIT_TICKS 0 ”。
宏 portSTACK_GROWTH 定义了堆栈的生长方向。对于不同的嵌入式操作系统,堆栈的生长
方向定义可能不同,在移植时应予以明确。portSTACK_GROWTH 定义为1 表示堆栈是正向生长的,
-1 为逆向生长的。一般来说堆栈都是倒生的。Cortex-M3 的堆栈增长方向为高地址向低地址增长,
因此这里定义为 -1 。
文档评论(0)