Bluetooth - SoC Thunderboard EFR32BG22工程代码剖析
一、项目描述
出厂自带的代码,配合APP使用,可以查看:Motion、Environment、IO
演示Thunderboard EFR32BG22套件的功能。这可以用Thunderboard 来测试手机应用。
二、main.c
1、头文件
头文件中有两部分条件编译
-
第一个宏:SL_CATALOG_POWER_MANAGER_PRESENT
-
第二个宏:SL_CATALOG_KERNEL_PRESENT
第一个应该是电源管理方面,第二个应该是内核状态方面的
第一个宏:
- 如果被定义:包含头文件sl_power_manager.h
第二个宏:
-
如果被定义:包含头文件sl_system_kernel.h
-
如果未被定义:包含头文件sl_system_process_action.h
各头文件作用:定义的很规范很清晰,详细查看代码中的英文注释
2、主函数
2.0 梳理
- while循环外有两个初始化函数:sl_system_init函数、app_init函数
- 然后是第二个宏的条件编译,因为未定义,所以编译的是while循环,否则编译sl_system_kernel_start函数
- while循环中包含:sl_system_process_action函数、app_process_action函数、以及第一个宏的条件编译
- 因为第一个宏有定义,所以还包括sl_power_manager_sleep函数
简化后的代码如下,并添加注释,详细注释标注在工程文件中:
int main(void)
{
sl_system_init();
app_init();
while (1) {
sl_system_process_action();//系统进程动作
app_process_action();//应用事件进程
sl_power_manager_sleep();//如果系统允许,让CPU进入睡眠状态
}
}
下面进行以上几个函数的逐个分析
2.1 sl_system_init 函数
系统初始化:初始化Silicon Labs设备、系统、服务和协议栈。
注:如果内核存在,处理任务将由这个调用创建。
如图:
该函数解析如下:
①、前两个是平台、驱动初始化, mcu 开发很常见,跳过去不看
②、服务初始化 sl_service_init函数
- 休眠时钟初始化函数sl_sleeptimer_init:主要是设置频率,初始化。功能大概是在系统休眠后,这个时钟还是要工作的,来定时唤醒系统,处理事件。
- sl_hfxo_manager_init函数:初始化HFXO管理器模块
- IO初始化函数sl_iostream_init_instances:初始化uart,可以通过Virtual COM port 端口输出信息。
- sl_iostream_stdlib_disable_buffering函数:禁用标准库缓冲
- sl_mbedtls_init 函数:
- mpu 初始化sl_mpu_disable_execute_from_ram函数:做一些节能相关的初始化工作
③、sl_stack_init函数
注释:蓝牙协议栈初始化,蓝牙初始化全都在这里。
④、sl_internal_app_init函数
注释:应用程序日志初始化
2.2 app_init函数
初始化应用程序。例如,如果内核存在,创建周期性计时器或任务。
2.3 sl_system_process_action函数
注释:不要删除此调用:必须从超级循环调用Silicon Labs组件进程动作例程。
用来处理 platform,service,stack,internel_app 事件,蓝牙事件也是在这里处理。
2.4 app_process_action函数
注释:应用进程
空的,读取uart命令后处理,相当于shell 的交互服务。
2.5 sl_power_manager_sleep
找到最节省电能的模式休眠,有事件就唤醒开始处理,处理完了还来这里休眠省电
2.6 总结
整个项目,先初始化平台、初始化外设、初始化低功耗电源管理,再初始化蓝牙协议栈、设置uart交互,最后进入死循环,不停的处理uart交互,蓝牙协议栈事件,休眠唤醒。
三、sl_system_process_action函数
这个出厂历程的实现,重点分析sl_system_process_action函数
1、首先,主程序中包含一句对该函数的注释:
// Do not remove this call: Silicon Labs components process action routine must be called from the super loop.
意思是:不要删除此调用:必须从超级循环调用Silicon Labs组件进程动作例程。
2、其次,该函数在sl_system_ process_action.c头文件中
该头文件的路径:gecko sdk 3.2.3—>
platform—>
service—>
system—>
src
分析后,platform下存放的基本上就是这边块板子的各种库文件,但是并非像hardware中driver中各种ic的驱动函数,是稍微上层一些的
用来处理 platform,service,stack,internel_app 事件,蓝牙事件也是在这里处理。
3、sl_system_ process_action.c文件内只包含sl_system_process_action这一个函数
#include "sl_event_handler.h"
void sl_system_process_action(void)
{
sl_platform_process_action();
sl_service_process_action();
sl_stack_process_action();
sl_internal_app_process_action();
}
sl_system_process_action函数内有四个子函数
该项目内:
①、sl_platform_process_action 是一个空函数
②、sl_service_process_action函数内包含一个子函数sli_simple_timer_step函数
//Execute timer callback functions 作用是:执行定时器回调函数
③、sl_stack_process_action函数内包含一个子函数sl_bt_step函数
sl_bt_step函数在sl bluetooth.c文件内,且包含最重要的sl_bt_process_event函数
sl_bt_step函数,从事件队列中弹出(非阻塞)蓝牙堆栈事件,这些事件就在sl_bt_process_event函数中
//sl_bt_process_event函数
void sl_bt_process_event(sl_bt_msg_t *evt)
{
sl_bt_ota_dfu_on_event(evt);//均为蓝牙堆栈事件处理程序
sl_gatt_service_aio_on_event(evt);
sl_gatt_service_battery_on_event(evt);
sl_gatt_service_hall_on_event(evt);
sl_gatt_service_imu_on_event(evt);
sl_gatt_service_light_on_event(evt);
sl_gatt_service_rht_on_event(evt);
sl_bt_on_event(evt);
}
④、sl_internal_app_process_action函数内包含两个子函数
sl_gatt_service_aio_step函数://Push button event handler 按钮事件处理程序
sl_gatt_service_imu_step函数://IMU GATT service event handler 应该是imu和蓝牙协议服务事件处理程序
与APP部分有关的功能:
第一个函数,大概就是实现的demo中IO模块部分的,按钮功能
第二个函数,就是实现的demo中motion模块部分的,速度方向的姿态功能
按钮事件处理程序
sl_gatt_service_imu_step函数://IMU GATT service event handler 应该是imu和蓝牙协议服务事件处理程序
与APP部分有关的功能:
第一个函数,大概就是实现的demo中IO模块部分的,按钮功能
第二个函数,就是实现的demo中motion模块部分的,速度方向的姿态功能