Thunderboard EFR32BG22出厂历程分析

Bluetooth - SoC Thunderboard EFR32BG22工程代码剖析

一、项目描述

出厂自带的代码,配合APP使用,可以查看:Motion、Environment、IO

演示Thunderboard EFR32BG22套件的功能。这可以用Thunderboard 来测试手机应用。
在这里插入图片描述

二、main.c

1、头文件

头文件中有两部分条件编译

  1. 第一个宏:SL_CATALOG_POWER_MANAGER_PRESENT

  2. 第二个宏: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模块部分的,速度方向的姿态功能

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值