【蜗牛哥带你玩转FireBLE】--第009讲 QN9021内核分析 为了减轻后续BLE学习压力,这里还是得深入了解下QN9021整体架构,昆天科QN9021是一种蓝牙超低功耗SoC解决方案,可从硬件和软件两方面拆分。 硬件方面:主要分为四个方面(Figure1) 1.Cortex-M0处理器, 2.96K ROM+64K SRAM+128K FLASH 3.2.4GHz射频收发器 4.齐全的外围设备接口 软件方面:包括固件和应用程序两部分,存在于内部三个存储器中(Figure2) 1.96K ROM中:运行BLE协议栈所需要的底层驱动、内核、基础协议栈。 2.64K SRAM中:系统内存,可以选择开启和关闭任意8块,profile规范也在其中。 3.128K FLASH中:程序代码和用户数据,也应用于OTA升级。 软件方面也可以认为是五个主要部分:内核、BLE协议栈、规范、设备驱动程序和应用程序。ROM中的固件包含内核和BLE协议栈,只提供API;SRAM中的应用程序项目包含配置文件、设备驱动程序和应用程序,这三个提供了完整的源代码。
QN9021支持三种工作模式: 1.SOC模式(System On Chip):(Figure3) 所有的程序都必须在QN9021上运行并完成,适合一些简单的处理场合,例如蓝牙防丢器、蓝牙温度计、IBeacon基站、蓝牙手环等等,其特点的是对处理器要求不高,数据吞吐量比较低,并且对功耗要求比较高的场合,一般此时以从机形式存在。 2.NP模式(Network Processor)(Figure4) 只有app在外部执行,而蓝牙协议栈和profile都在QN9021中运行,app与QN9021通过ACI接口通信。此模式适合于需要处理比较复杂数据的场合,QN9021作为模组提供数据交互,例如USB Dongle、智能健康秤等等。
3.HCI(Host Control interface)(Figure5) 只有内核和部分最底层协议栈是在QN9021中运行的,外部通过HCI与QN9021通信,可实现较大的定制。
QN9021的BLE协议栈分为LL、L2CAP、SMP、ATT、GATT、GAP、profile以及APP八个层,每一个层都是一个单独的状态机,有独立的任务描述器和状态形式。系统内核的主要任务就是实现内存分配、任务调度、定时器功能和层与层之间的消息通信和事件处理。 CPU上电后,首先启动的是ROM中的BootLoad,BootLoad会对Spi或者是Uart口进行检查是否有命令发出,有烧写命令发出,就会开始FLASH或者SRAM的烧录;如果200ms内没有收到命令,则将FLASH中存储的应用程序装入SRAM并且开始运行应用程序。应用程序装入SRAM后,会进行一系列的环境初始(startup.s),然后跳转main函数中,我们可以在main函数中看到整个系统初始化过程。初始化完毕之后,程序进入while循环中,首先调用了ke_schedule函数,此函数就是系统内核的任务调度函数。如果系统中存在任务,调度器就会挑选出其中优先级别最高的任务执行。执行完毕后,系统开始判断系统任务中需要调用的模块,然后根据系统需求选择不同的睡眠模式,以降低系统功耗。
事件: 系统在main函数的大循环中不断执行ke_schedule函数,一旦发现事件列表为非空,就会在事件列表中取出其优先级最高的事件执行处理。系统中一共有32个事件,最高的8个事件已经被BLE协议栈使用了,所以用户只有24个协议栈可以自由使用。用户可以定义0~23共24个事件,数字越大等级越高。
消息:
实现协议层与层之间的信息交换,可以从某一层指定向某一层发送消息。 消息结构体成员 消息API接口函数
任务:
一个任务包含任务类型和任务描述符,任务类型是一个由内核定义的常量值,一个常量值对应一个任务。下面列出了所有可用的任务类型。 每一个任务都有一个在任务描述器里的单独的状态机和消息处理机制,任务描述器包含内容:
任务API接口函数: 消息调度器: 消息调度机制提供了一个发送命令到一个任务状态机的方法。消息有三种状态:consumed、free和save,调度器发现消息列表非空后,就会逐一的找到消息的处理函数去执行处理,在执行完处理函数之后一般处理函数会返回一个消息状态。如果在处理未完成的时候,系统又不得不去执行其他的任务,消息调度器就会把消息设置为save,在有空闲的时候再调出来执行,如果执行完毕,就直接把该消息free掉,释放掉其占用的资源。 消息调度API接口函数
时间调度器: 定时器调度器是一个非常频繁使用的一个调度器,它提供了一个延时一段时间后发出某个消息的操作,时间基数为10ms。使用定时器发送消息是不能够携带参数的,所以定时器虽然简单,也有一定的限制性。 定时器调度器API接口函数: 头文件: 为了能够正常使用内核提供的服务,必须包含如下头文件:
|