将移植FreeRTOS到已有的项目中
FreeRTOSConfig.h
包含了配置大量初始化数据的头文件,是
source files
主要存放在Source文件夹中,主要包含
用于实现一系列RTOS功能的函数文件
数量繁杂的文件与代码对于启动与运行FreeRTOS程序而言并不是必要的,在官方所给出的示例中,运行程序所必须的文件有
FreeRTOSConfig.h+task.c+list.c
而其关键的代码块为
int main(void){//官方示例
prvSetupHardware();
vTaskStartScheduler();
for(;;);
return 0;
}
关键数据类型和名称解释
数据类型
/*主要用来定义因系统tick中断产生的计数*/
TickType_t
/*处理器位数的基础型,不应使用无规定int*/
BaseType_t
prefixed名解释
/***********Variable Names
'c' for char(int8_t)
's' for int16_t
'l' for int32_t
'x' for BaseType_t and any other non-standard types
*/
/***********Functions Names
*Functions are prefixed with both the type they return,and the file they are defined within
*而文件内部函数将由prv进行修饰
*/
宏名解释
/************
*portXXX in portable.h or portmacro.h
*taskXXX in task.h
*pdXXX in projdefs.h(project_define)
*configXXX in FreeRTOSConfig.h
*errXXX in projdefs.h
*/
堆内存管理说明
前置知识说明
堆栈内存
来源 CS255
教程中涉及到的一段代码如下
Cube *CreateCube(){
Cube c(20);
return &c;
}
int main(){
Cube *c = CreateCube();
/*当在main中运行到这个位置时,在CreateCube中申请
的c的空间被*c直接覆盖掉了
*/
double r = c->getVolume();
double v = c->getSurfaceArea();
return 0;
}
原文中有一句:
A common mistake is to return a pointer to a stack variable in a helper function
含义实际上是,系统会在函数返回之后回收内存,那么如果函数返回的是指向内部某一变量的指针,随着这段内存被清理,该值同样也无法保留下来
用于FreeRTOS中,堆栈比较关键的知识如下
栈自高地址向下增长,堆自低地址向上增长
栈由于需要多次快速访问,通常大小较堆而言更小,栈操作的效率是更高的
栈内存在任务执行后会被自行优化,堆内存则不会
malloc()与free()
来源博主 Healtheon
需要注意的只有malloc与free都是对堆中的空间进行操作。这样可以将static这一关键字也进行一定程度的说明了
/*
static修饰的成员类型应该在程序一开始时就存在,
不能在函数内部初始化或者分配,这是由静态数据成员是存储在
程序的静态存储区而非栈上空间所决定的
*/
值得注意的是,malloc()与free()在FreeRTOS中的使用并不广泛,这是因为在多线程任务中,对堆内存的分配并不能够保证其中的数据访问在多任务中安全合法
是reentrancy和thread-safe的问题
故在FreeRTOS中,堆内存的申请使用
/*
malloc() -> pvPortMalloc()
free() -> vPortFree
*/