重新定义
int 在Free RTOS 中不使用,只使用short 和long类型
在Cortex-M内核的MCU,short 16位 long 32位
char = portCHAR
short = portSHORT
portTickType = unsigned short int
= unsigned int 在Config.h中文件定义 configUSE_16_BITICKS = 0则为32位
portBASE_Type= long 根据架构决定多少位的 一般用于定义函数的返回值或布尔类型
如果没有明确指出char的类型,编译器会默认成指定char的变量为无符号或者有符号的, keil中默认为无符号的
FreeRTOS 定义变量的时候会把变量的类型当作前缀加在变量上
char 前缀 c
short 前缀 s
long 前缀 l
portBASE_Type 前缀 x
数据结构 任务句柄 队列句柄 前缀 x
无符号 前缀 u
指针变量 前缀 p
无符号的char变量 uc
一个char类型的指针 pc
函数名 包含了返回值的类型 函数所在的文件名 函数的功能 如果是私有的函数会加prv
信号量的函数都是一个宏定义,函数的命名方法遵循函数的命名方法 而不是宏定义的方法
通用的宏 表示0和1
pdTRUE 1
pdFALSE 0
pdPASS 1
pdFAIL 0
FreeRTOS 中源码的list和list item 就是链表和节点
链表就是列表
节点就是列表项
链表分为 单向链表和双向链表(使用最多)
节点结构体定义
struct node
{
struct node *next; /*指向链表的下一个节点-节点指针*/
char data1;/*单个数据*/
unsigned char array[]; /*数组*/
unsigned long *prt; /*指针*/
struct userstruct data2; /*自定义结构体类型数据*/
}
以上代码 除了节点指针其他可认为可携带的数据,但这种方法很少用。
通常做法是通过链表存储的数据内嵌一个节点
在节点内嵌一个数据结构 ,存储的数据通过内嵌的节点可挂接到链表中
struct node/*节点定义*/
{
struct node *next; /*指向链表的下一个节点*/
}
struct userstruct
{
/*在结构体中,内嵌一个节点指针,通过这个节点将数据挂接到链表中*/
struct node *next;
/*各种各样的存储数据*/
}
链表的常规操作:节点的插入与删除,
为了顺利的插入 规定一个根节点,这个根节点称为生产者
根节点还会有一个节点计数器,用于统计整条链表的节点个数
双向链表和单向链表的区别节点中有两个节点指针
链表与数组的对比
链表:链表是通过节点把离散的数据链接成一个表,通过对节点的插入与删除从而实现对数据的存取
数组:数组是开辟一段连续的内存来存储数据
链表是一个圈 没有头和尾之分,为了方便节点的插入与删除规定了一个根节点
数组有起始地址和结束地址
RTOS
链表 = 列表 list
节点 = 列表项 list item
链表和数组的区别:
链表是通过 节点 把离散的数据链接成一个表,通过对 节点 的插入和删除操作从而实现对数据的存取。
数组是通过开辟一段连续的内存来存储数据。--> 数组与链表最大的区别
数组的每个member对应链表的节点,成员与节点的数据类型可以是标准的C类型或者是用户自定义的结构体。数组有起始地址和结束地址,链表是一个圈,没有头和尾之分,
为了方便节点操作的插入和删除会人为的规定一个根节点
链表节点的数据结构在list.h中定义
{
#if (configUSE_16_BIT_TICKS ==1)
typedef uint16_t TickType_t;
}
struct xLIST_ITEM
{
TickType_t xItemValue; /*辅助值*/
struct xLIST_ITEM * pxNext;
struct xLIST_ITEM * pxPrevious;
void * pvOwner; /*指向拥有该节点的内核对象,通常是TCB*/
void * pvContainer; /*指向该节点所在的链表*/
};
typedef struct xLIST_ITEM ListItem_t;