前言
- 本博文基于MDK,FreeRTOSV9.0.0库为例,参考野火教程编写,算是对野火教程的一个提炼总结笔记;
- 根据我的个人理解,下文中出现的单词port翻译为端口,接口,但是我认为理解为CPU架构更容易理解;
- 如有不足之处还请多多指教;
数据类型的重定义
重定义的目的: 为了适应不同的编译环境和处理器(同一个数据类型在不同的编译器和CPU架构里的位数大小可能不同);
具体实现: 在FreeRTOSV9.0.0官方库下的portable文件夹中,包含着FreeRTOS官方为各种开发环境而编写的数据类型重定义头文件 “portmacro.h”(端口宏定义.h);使用不同的环境,使用不同的文件即可;如下图:
以RVDS中的ARM_CM3文件为例:
展开portmacro.h为例:
/*-----------------------------------------------------------
* Port specific definitions. 端口指定类型
*
* The settings in this file configure FreeRTOS correctly for the
* given hardware and compiler.
*
* These settings should not be altered. 这些配置不应该被改变;
*-----------------------------------------------------------
*/
/* Type definitions. */
#define portCHAR char
#define portFLOAT float
#define portDOUBLE double
#define portLONG long
#define portSHORT short
#define portSTACK_TYPE uint32_t
#define portBASE_TYPE long
typedef portSTACK_TYPE StackType_t;
typedef long BaseType_t;
typedef unsigned long UBaseType_t;
#if( configUSE_16_BIT_TICKS == 1 )
typedef uint16_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#endif
/*-----------------------------------------------------------*/
需要重要记住的几个宏定义类型:
BaseType_t(portBASE_TYPE/UBaseType_t): 根据处理器的架构来决定是多少位的, 如果是 32/16/8bit 的处理器则是 32/16/8bit 的数据类型。一般用于定义函数的返回值或者布尔类型。
TickType_t:用于定义系统时基计数器的值和阻塞时间的 值 。 FreeRTOSConfig.h 头 文 件 中 的 宏configUSE_16_BIT_TICKS 为 1 时则为 32位。
portMAX_DELAY :系统最大堵塞时间设置(32Bit/16Bit);
portSTACK_TYPE (StackType_t):
野火补充:
在编程的时候,如果用户没有明确指定 char 的符号类型, 那么编译器会默认的指定char 型的变量为无符号或者有符号。正是因为这个原因,在 FreeRTOS 中,我们都需要明确的指定变量 char 是有符号的还是无符号的。 在 keil 中, 默认 char 是无符号的;在Keil中可配置