- 优先级数值越大,优先级越高(0优先级最低,和threadx相反)
- 有空闲task,没有task跑的时候就会跑空闲task(优先级应该是0)
- 有hook函数
- int main(void){
/* perform any hardware setup necessary */
prvSetupHardware( );
/*application tasks can be created here */
.....
/*start the created tasks running*/
vTaskStartScheduler( );
/*execution will only reach here if there was insufficient heap to start the schedule*/
for(;;);
return 0;
}
- 变量名的第一个字符表示该变量的类型:c表示char、s表示short、l表示long、x表示BaseType_t和自定义的非标准类型、p表示指针、u表示无符号、v表示void
- 函数名的第一个字符表示该函数的返回类型:prv表示private。。。。。。
- 宏都是大写字母,前面的小写字母代表定义宏的地方
- 申请内存pvPortMalloc,释放内存vPortFree
- heap_1大小configTOTAL_HEAP_SIZE在FreeRTOSConfig.h中定义,动态内存分配,有malloc没有free;
Prefix | Location of macro definition |
port (for example, portMAX_DELAY) | portable.h or portmacro.h |
task (for example, taskENTER_CRITICAL()) | task.h |
pd (for example, pdTRUE) | projdefs.h |
config (for example, configUSE_PREEMPTION) | FreeRTOSConfig.h |
err (for example, errQUEUE_FULL) | projdefs.h |
heap_2大小configTOTAL_HEAP_SIZE在FreeRTOSConfig.h中定义,静态声明,有malloc和free。在malloc时会寻找空闲内存块中满足申请大小的最小内存块,并将多余的那部分再分割出来作为新的空闲块,并且不会合并相邻空闲块。比如现在有5字节、25字节、50字节三个空闲块,申请20字节大小时,会自动匹配25字节的空闲块,并将多余的5字节分割出来,作为新的空闲块等待分配。heap_2适合频繁创建删除相同大小stack的task的应用;
heap_3使用标准库里的malloc、free接口,configTOTAL_HEAP_SIZE对其没有影响;
heap_4大小configTOTAL_HEAP_SIZE在FreeRTOSConfig.h中定义,静态声明,有malloc和free。使用首次适应算法,并且会合并相邻的空闲块(类似threadx的字节池)
- heap_1的pvPortMalloc:
xNextFreeByte记录已分配字节大小
traceMALLOC函数定义在哪?
对xWantedSize进行字节对齐;然后vTaskSuspendAll(),在这个函数中++uxSchedulerSuspended;检查申请大小、剩余空间以及overflow情况合格后,进行空间分配,返回指针;然后xTaskResumeAll();如果开启了malloc失败hook函数,调用vApplicationMallocFailedHook();return分配到的指针
- heap_1的vPortFree
heap_1没有free策略,调用了就configASSERT()
- heap_1使用过程中的图例:
A:在创建task之前的数组---整个数组是空闲的。
B:在创建一个task之后
C:在创建三个task之后
- heap_2的prvHeapInit
xStart保存空闲链表的表首,xEnd保存空闲链表的表尾。
xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
xStart.xBlockSize = ( size_t ) 0;
xEnd.xBlockSize = configADJUSTED_HEAP_SIZE;
xEnd.pxNextFreeBlock = NULL;
pxFirstFreeBlock记录第一个空闲块的地址,初始化时这个空闲块为整个heap。
FirstFreeBlock = ( void * ) pucAlignedHeap;
pxFirstFreeBlock->xBlockSize = configADJUSTED_HEAP_SIZE;
pxFirstFreeBlock->pxNextFreeBlock = &xEnd;
- heap_2的pvPortMalloc:
vTaskSuspendAll();如果是第一次从这个heap分配,要先初始化prvHeapInit();检查申请大小、剩余空间以及overflow情况合格后,xWantedSize+=heapSTRUCT_SIZE,再对新的xWantedSize进行overflow检查后字节对齐;当剩余空闲空间大于申请大小时,
- heap_2的vPortFree
- heap_2使用过程中的图例:
A:在创建了三个task之后。heap顶部是一大块空闲空间
B:在删除了一个task之后。heap顶部仍然是一大块空闲空间,同时删除的task之前所占的TCB、Stack空间也变为空闲
C:又创建一个task,如果这个task的stack和之前删除的task一样,那么这个task就会使用删除掉的task使用的空间