记录下阅读Apollo3 wsf源码过程中的问题1

  Apollo SDK中提供的BLE stack 是exactle,后面被arm收购了,改名为cordio ble集成在mbed os里。

  exactle stack里提供了一套os层来适配不同的RTOS的wsf层,apollo sdk中已经适配freertos的了,所以先理解一下wsf层的功能。

  wsf层主要有动态内存管理(内存池),队列操作,定时器,进出临界区等,今天先主要看下内存池和队列的实现。

  内存池

  在内存池头部存放管理不同大小的内存区的数据结构,被管理的每个内存区由固定大小的内存块组成,并且这些固定大小的内存块使用单向链表连在一起。

  需要注意的是,wsf的内存池实现里使用了全局变量,导致整个系统只能初始化一个内存池,如果想做到每个模块单独一个内存池,需要修改代码,

  另外使用开关中断的方式进出临界区,而不是使用互斥锁,猜测应该是协议栈中有部分逻辑有实时性要求,而互斥锁会加剧分配内存的时间不确定性。

  队列

  在实现上使用的是有头有尾的单向链表,对比和freertos中队列,主要的不同是,wsf中入队的数据结构,本身必须能形成单线链表,即第一个数据成员必须是pNext指针。

 

  

posted @ 2022-06-25 22:59  蓝色雨only  阅读(160)  评论(0编辑  收藏  举报