freertos学习

  1. 优先级数值越大,优先级越高(0优先级最低,和threadx相反)
  2. 有空闲task,没有task跑的时候就会跑空闲task(优先级应该是0)
  3. 有hook函数
  4. 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;

}

  1. 变量名的第一个字符表示该变量的类型:c表示char、s表示short、l表示long、x表示BaseType_t和自定义的非标准类型、p表示指针、u表示无符号、v表示void
  2. 函数名的第一个字符表示该函数的返回类型:prv表示private。。。。。。
  3. 宏都是大写字母,前面的小写字母代表定义宏的地方
  4. 申请内存pvPortMalloc,释放内存vPortFree
  5. 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的字节池)

  1. heap_1的pvPortMalloc:

xNextFreeByte记录已分配字节大小

traceMALLOC函数定义在哪?

对xWantedSize进行字节对齐;然后vTaskSuspendAll(),在这个函数中++uxSchedulerSuspended;检查申请大小、剩余空间以及overflow情况合格后,进行空间分配,返回指针;然后xTaskResumeAll();如果开启了malloc失败hook函数,调用vApplicationMallocFailedHook();return分配到的指针

  1. heap_1的vPortFree

heap_1没有free策略,调用了就configASSERT()

  1. heap_1使用过程中的图例:

A:在创建task之前的数组---整个数组是空闲的。

B:在创建一个task之后

C:在创建三个task之后

  1. 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;

  1. heap_2的pvPortMalloc:

vTaskSuspendAll();如果是第一次从这个heap分配,要先初始化prvHeapInit();检查申请大小、剩余空间以及overflow情况合格后,xWantedSize+=heapSTRUCT_SIZE,再对新的xWantedSize进行overflow检查后字节对齐;当剩余空闲空间大于申请大小时,

  1. heap_2的vPortFree

  1. heap_2使用过程中的图例:

A:在创建了三个task之后。heap顶部是一大块空闲空间

B:在删除了一个task之后。heap顶部仍然是一大块空闲空间,同时删除的task之前所占的TCB、Stack空间也变为空闲

C:又创建一个task,如果这个task的stack和之前删除的task一样,那么这个task就会使用删除掉的task使用的空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值