Silicon labs BLE 开发人员指南

  • 介绍

该文档涵盖了各个方面的发展,并且是对使用C开发的所有运行Bluetooth堆栈的Wireless Gecko产品的所有人的重要参考。

该文档涵盖以下主题:

  • “ 应用程序开发流程”部分讨论了应用程序开发流程和项目结构。

  • 部分配置的蓝牙协议栈和无线设备壁虎解释该项目包括库和应用程序代码的实际无线壁虎配置。

  • 第蓝牙堆栈事件处理是每个人与Silicon Labs的蓝牙协议栈开发的一个重要部分,因为它说明了在基于事件的架构堆栈的同步运行应用程序如何。

  • “ 中断和无线Gecko资源 ”部分讨论了外设和芯片组资源的主题,涵盖了为堆栈使用保留的内容,应如何处理中断以及堆栈的内存占用空间和应用程序可用内存。

  • 应用开发流程

下图描述了高级固件结构。开发人员在堆栈的顶部创建一个应用程序,Silicon Labs将其作为预编译的目标文件提供给应用程序,从而为最终设备实现蓝牙连接。

                                                 

                                                                           蓝牙堆栈架构框图

蓝牙堆栈包含以下块。

  • 引导加载程序— Gecko引导加载程序不是堆栈的一部分,而是随蓝牙SDK一起提供的。有关更多信息,请参见UG266:Gecko引导程序用户指南和AN1086:将Gecko引导程序与Silicon Labs蓝牙应用程序配合使用。有关常规引导加载的信息,请参见UG103.06:引导加载基础。

  • 蓝牙堆栈-蓝牙功能,包括链接层,通用访问配置文件,安全管理器,属性协议和通用属性配置文件。

  • 蓝牙AppLoader-在引导程序之后启动的应用程序。它检查用户应用程序是否有效,如果有效,则AppLoader启动该应用程序。如果应用程序映像无效,则AppLoader将启动OTA进程以尝试接收有效的应用程序映像。这需要使用Gecko Bootloader。

  • 应用程序构建流程

 蓝牙项目构建流程

按照QSG139:Simplicity Studio中的蓝牙应用程序开发中的描述,通过定义蓝牙服务和特性(GATT定义)并编写来自Silicon Labs提供的示例的应用程序源代码或空的项目模板开始构建项目。SDK v2.1.0和更高版本提供了两种定义蓝牙服务和特性的方法。第一个选项是Simplicity Studio中的Visual GATT编辑器GUI。这是用于设计GATT并生成gatt_db.c和gatt_db.h的图形工具。此外,它可以导入.xml和.bgproj GATT定义文件。Visual GATT编辑器是Simplicity Studio项目中用于GATT定义和生成的默认工具。第二种选择是根据UG118:Blue GeckoBluetooth®Profile Toolkit开发人员指南创建.xml或.bgproj,然后将BGBuild可执行文件用作预编译步骤,以将GATT定义文件转换为.c和.h。此方法在IAR Embedded Workbench项目中使用。编译项目会生成一个目标文件,然后将其与SDK中提供的预编译库链接。链接的输出是一个闪存图像,可以对支持的Wireless Gecko设备进行编程。

  • 项目结构

本节说明了应用程序项目结构以及必须包含在项目中的必需和可选资源。

  • 蓝牙文件

库文件:

蓝牙堆栈库是:

  • binapploader.o:蓝牙AppLoader的二进制映像,提供了可选的OTA(无线)功能。

  • binapploader_nvm3.o:具有NVM3支持的Series 1的Bluetooth AppLoader的二进制映像。

  • libbluetooth.a:蓝牙堆栈库。

  • libmbedtls.a:蓝牙堆栈的mbed TLS加密库。

  • libpsstore.a:蓝牙堆栈的PS Store功能。这在EFR32BG2x器件上不可用。必须改用NVM3。

RAIL:

     蓝牙堆栈使用RAIL访问无线电,并且RAIL库需要与蓝牙堆栈链接。对于每个设备系列以及单协议和多协议环境,RAIL都有单独的库。Gecko SDK中提供了RAIL库。有关更多信息,请参考UG103.13:RAIL基础知识和其他RAIL文档。

注意:为了确保无线电模块符合法规要求,需要将无线电模块的蓝牙堆栈与无线电模块的RAIL库和配置库链接在一起。这些是librail_module__release.a和librail_conFIG。一个。

EMLIB和EMDRV:

蓝牙堆栈使用EMLIB和EMDRV库访问EFR32硬件。EMLIB和EMDRV外设库在源代码中提供,并且需要包含在项目中。EMLIB和EMDRV是Gecko SDK的一部分。有关EMLIB和EMDRV的更多详细信息,请参阅《 Gecko Bootloader API参考》中的\ platform \ bootloader \ documentation \ Gecko_Bootloader_API_Reference \ index.html,以及相应文件夹下的文档 \平台。

睡眠定时器

睡眠计时器是一个平台组件,提供单次计时器和定期计时器。蓝牙协议栈将其用于深度睡眠,并且必须包含在项目中。

头文件

bg_version.h

该文件包含蓝牙协议栈版本。

API头文件

这些文件定义了蓝牙协议栈API。对于不同的用例,有三个不同的文件。只能包含其中一个文件。native_gecko.h与裸机蓝牙应用程序一起使用。在构建支持NCP的SoC应用程序时使用ncp_gecko.h。rtos_gecko.h与Micrium RTOS一起使用。

这些文件用于两个目的:首先,它们包含实际的Bluetooth堆栈API以及该堆栈的命令和事件;其次,它们为Bluetooth堆栈提供配置,事件和睡眠管理API。

下面介绍了配置,事件和睡眠管理API。

errorcode_t gecko_init(const gecko_configuration_t*config)

该函数接受一个参数-指向gecko_configuration_t结构的指针。其目的是使用结构中提供的参数配置和初始化Bluetooth堆栈。gecko_init()在使用gecko_stack_init()进行的蓝牙配置一节中将详细讨论配置选项及其使用方法。gecko_init()必须由应用程序调用以初始化蓝牙堆栈。

提供此功能是为了方便。它将初始化蓝牙堆栈中的所有功能。要使配置更加详细,请按以下说明使用gecko_stack_init()。

errorcode_t gecko_stack_init(const gecko_configuration_t*config)

此函数接受一个参数-指向gecko_configuration_t结构的指针。其目的是使用结构中提供的参数配置和初始化Bluetooth堆栈。gecko_stack_init()调用函数后,必须分别初始化每个使用的堆栈组件。这种分离允许通过不包括那些不需要的堆栈组件来优化内存。

以下API可用于分别初始化堆栈组件:

gecko_bgapi_class_dfu_init();gecko_bgapi_class_system_init();gecko_bgapi_class_le_gap_init();gecko_bgapi_class_le_connection_init();gecko_bgapi_class_gatt_init();gecko_bgapi_class_gatt_server_init();gecko_bgapi_class_endpoint_init();gecko_bgapi_class_hardware_init();gecko_bgapi_class_flash_init();gecko_bgapi_class_test_init();gecko_bgapi_class_sm_init();struct gecko_cmd_packet* gecko_wait_event(void)

    这是一个阻止功能,它等待来自蓝牙堆栈的事件并阻止,直到接收到事件为止。接收到事件后,将gecko_cmd_packet返回指向结构的指针。

    如果在蓝牙堆栈配置中启用了EM睡眠模式,则当未从蓝牙堆栈接收到任何事件时,设备将自动进入EM1或EM2模式。使用gecko_wait_event()是确保设备尽可能处于最低功耗睡眠模式的最简单方法。

蓝牙堆栈事件处理中将详细讨论蓝牙堆栈的事件处理。

struct gecko_cmd_packet* gecko_peek_event(void)

    这是一种非阻塞功能,用于从蓝牙堆栈请求蓝牙事件。当请求事件且事件队列不为空时,将gecko_cmd_packet struct返回指向的指针。如果事件队列中没有事件,则返回NULL。

    使用此非阻塞事件侦听器时,必须由应用程序代码管理EM睡眠模式,因为它们不会由Bluetooth堆栈自动管理。睡眠模式管理通过gecko_can_sleep_ms()和gecko_sleep_for_ms()功能完成,稍后将进行讨论。

堆栈的事件处理将在蓝牙堆栈事件处理一节中详细讨论。

     int gecko_event_pending(void)

    此功能检查事件队列中是否有任何未解决的蓝牙堆栈事件。如果找到了未决的蓝牙事件,该函数将返回一个非零值,以指示该事件应由gecko_peek_event()或进行处理gecko_wait_event()。如果未找到事件,则返回零。

    uint32 gecko_can_sleep_ms(void)

    此功能用于确定蓝牙协议栈可以休眠多长时间。返回值是堆栈必须休眠的毫秒数,直到必须进行下一个蓝牙操作为止。如果无法休眠,则返回零。此功能仅与非阻塞gecko_peek_event()事件处理一起使用。

    uint32 gecko_sleep_for_ms(uint32 max)

    此函数用于将堆栈放入EM睡眠中的最大毫秒数(在函数的单个参数中设置)。返回值是实际睡眠的毫秒数。堆栈可能由于外部事件而唤醒。此功能仅与非阻塞gecko_peek_event()事件处理一起使用。

native_gecko.h

该文件用于没有RTOS的应用程序。它使用直接函数调用向蓝牙协议栈提供IPC(进程间通信)。

ncp_gecko.h

该文件将在为主机提供NCP功能的应用程序中使用。它使用NCP标头作为函数调用向蓝牙堆栈提供IPC。

host_gecko.h和gecko_bglib.h 这些文件在为外部主机开发应用程序时使用。host_gecko.h具有API定义,而gecko_bglib.h包含主机应用程序和BGAPI串行协议之间的适配层。

rtos_gecko.h

当为Micrium OS构建应用程序时,将使用rtos_gecko.h。蓝牙堆栈是Micrium OS的一项单独任务,并使用其电源,睡眠和内存管理。rtos_gecko.h为IPC提供了一个包装器,以使用Micrium OS中任何任务中的蓝牙堆栈。该文件包含蓝牙协议栈API,该协议栈的命令和事件以及蓝牙协议栈的配置API。

  • GATT数据库

    GATT(通用属性配置文件)数据库是描述蓝牙配置文件,服务和蓝牙设备特征的标准化方法。使用Silicon Labs蓝牙堆栈,可以在Simplicity Studio的Visual GATT编辑器GUI中直接编辑GATT定义,也可以用XML编写GATT定义,并将其作为预构建任务传递给BGBuild可执行文件。有关如何创建GATT数据库和语法的更多信息,请参阅UG118:Blue GeckoBluetooth®Smart Profile Toolkit开发人员指南。

gatt_db.c和gatt_db.h

所述gatt_db.c定义GATT数据库结构和内容,以及是自动生成由BGBuild.exe或由Visual GATT编辑器。gatt_db.h包含此数据库以及本地特征和服务的句柄。GATT的类型定义会自动从gatt_db_def.h包含到gatt_db.h中。

  • 设备固件升级

设备固件升级(DFU)是通过串行链接或无线(OTA)升级应用程序的过程。在这两种情况下,应用程序都需要添加以下文件来启用对DFU的支持。

application_properties.c

该文件包括应用程序属性结构,该结构包含有关应用程序映像的信息,例如类型,版本和安全性。该结构是在Gecko Bootloader API的application_properties.h中定义的(请参阅参考资料中的Gecko Bootloader API参考)。\ platform \ bootloader \ documentation \ Gecko_Bootloader_API_Reference \ index.html)。Simplicity Studio项目中包含一个预生成的文件,可以对其进行修改以包含特定于应用程序的属性。可以使用Gecko Bootloader API访问应用程序属性。可以通过更改定义来更新以下成员:

// Version number for this application (uint32_t)#define BG_APP_PROPERTIES_VERSION// Capabilities of this application (uint32_t)#define BG_APP_PROPERTIES_CAPABILITIES// Unique ID (e.g. UUID or GUID) for the product this application is built for (uint8_t[16])#define BG_APP_PROPERTIES_ID

    当将OTA进程与Bluetooth AppLoader一起使用时,应用程序属性结构应立即驻留在应用程序向量表之后。使用蓝牙协议栈提供的链接器文件时,将自动启用此功能。

  • 实时操作系统支持

    蓝牙堆栈也可以在Micrium RTOS上运行。在这种情况下native_gecko.h被替换rtos_gecko.h和下列文件添加到项目中:rtos_bluetooth.c和rtos_bluetooth.h。

rtos_bluetooth.c和rtos_bluetooth.h

rtos_bluetooth.c和rtos_bluetooth.h通过蓝牙协议栈和其他Micrium OS任务为IPC(进程间通信)提供Micrium OS任务。使用Micrium OS时,还必须包括下面描述的rtos_gecko.h头文件。它提供API IPC封装,以使用任何Micrium OS任务中的Bluetooth堆栈。

    需要在结构中为蓝牙协议栈配置对RTOS的支持gecko_configuration_t。config_flags字段需要GECKO_CONFIG_FLAG_RTOS设置。这导致蓝牙堆栈依赖Micrium OS进行睡眠,而不是直接睡眠。scheduler_callback并且stack_schedule_callback必须配置为调用适当的功能。这些回调用于唤醒相应的任务。

与Micrium OS一起使用的Bluetooth Stack配置如下:

.config_flags = GECKO_CONFIG_FLAG_RTOS,

.scheduler_callback = BluetoothLLCallback,

.stack_schedule_callback = BluetoothUpdate,

调用之后,可以调用gecko_stack_init()bluetooth_start_task()。

void bluetooth_start_task(OS_PRIO ll_priority, OS_PRIO stack_priority);

    它以任务优先级为参数。ll_priority用于链路层,stack_priority用于蓝牙协议栈。链路层优先级必须是系统中的最高优先级,因为及时执行对于系统性能至关重要。

  • 多协议支持

在多协议环境中使用蓝牙协议栈时,必须使用以下功能启用蓝牙协议栈中的多协议功能:

gecko_init_multiprotocol(const void *config);

该config参数当前始终设置为NULL,保留用于将来的扩展。

在多协议环境中使用蓝牙还需要使用具有多协议支持的RAIL库。

  • 硬体支援

    以下文件是Gecko SDK的一部分,它们添加了对硬件特定功能的支持。

    hal-config.h

    该头文件包含MCU外设初始化设置,例如用于时钟和电源管理的设置以及用于UART,SPI等外设的设置。请注意,此文件仅包含外设的非特定于板的设置,例如UART的波特率,而不包含特定于板的特定设置,例如UART的输入/输出引脚。

    init_mcu.c和init_mcu.h

    这些文件包括设备初始化功能,该功能初始化MCU的内部设置,例如时钟和电源管理。

    init_board.c和init_board.h

    这些文件包括电路板初始化功能,该功能可初始化电路板上的外部部件。例如,它启用GPIO,并初始化无线电板上的外部闪存。

    init_app.c和init_app.h

    这些文件包括应用程序初始化功能,该功能根据应用程序初始化WSTK上的外部部件。例如,它在WSTK上启用VCOM,传感器和LCD显示。

    pti.c和pti.h

    这些文件包括PTI初始化功能,该功能启用了数据包跟踪接口。

    hal-config-board.h

    该头文件包含板初始化设置,例如按钮和LED引脚,UART和SPI引脚等。在为Silicon Labs的无线电板开发应用程序时,可以在SDK中提供的示例中正确设置这些设置,但是为自定义硬件设计创建应用程序的开发人员需要相应地配置设置。

    bspconfig.h / bsphalconfig.h

    BSP(板级支持包)标头包含特定于无线电板的配置,这些配置用作WSTK特定功能的参数,例如切换WSTK上的IO或驱动入门工具包上的LCD显示器。如果使用了硬件配置器工具,则示例使用bsphalconfig.h。否则,将使用bspconfig.h。

    mx25flash_spi.h

    该头文件包含用于将某些无线电板上的SPI闪存芯片(例如BRD4100A)配置为低功耗模式的功能。例如,这在进行睡眠电流测量时非常有用,因为如果SPI闪存不在低功耗模式下,则不会达到最低的EM2,EM3或EM4电流。

  • 配置蓝牙协议栈和无线Gecko设备

    要在Wireless Gecko上运行Bluetooth堆栈和应用程序,必须正确配置MCU及其外围设备。初始化硬件后,还必须使用gecko_init()函数初始化堆栈。

  • 无线Gecko MCU和外围设备配置

initMcu()

该initMCU()函数用于初始化MCU内核。该功能启动振荡器并配置器件的能量模式。可以将与板卡设置无关的外围设备初始化(例如,计时器初始化)添加到此功能中。该函数必须在main()的开头调用。

initBoard()

该initBoard()功能用于初始化电路板功能,例如初始化外部闪存。可以将取决于电路板设计的外设初始化(例如GPIO初始化或UART初始化)添加到此功能。该函数必须在initMcu()之后调用。

initApp()

该initApp()函数用于初始化特定于应用程序的功能,例如在WSTK上启用SPI显示。该函数必须在之后调用initBoard()。

自适应跳频

蓝牙协议栈实现了自适应跳频(AFH),符合ETSI EN 300 328标准。使用+10 dBm以上的发射功率时,需要AFH。AFH还可以通过避免信道拥塞来提高性能。

要在蓝牙协议栈中启用AFH,必须调用以下初始化函数:

void gecko_init_afh();

在主从连接中,两端可以独立使用AFH。主机可能是非自适应的,但从机仍可能需要自适应。该标准允许在阻塞的通道上使用控制传输。出于合规性原因,如果从站检测到正在使用阻塞的信道,它将仅在该信道上发送单个数据包以防止连接超时。

注意:旧版广告不使用自适应跳频。旧版广告使用3个渠道,而AFH至少需要15个渠道才能满足ETSI标准的要求。必须使用扩展广告来启用AFH广告功能。

蓝牙时钟

时钟设置在initMcu_clocks()函数中初始化。时钟设置包括使用诸如调谐之类的参数初始化振荡器(HFXO,LFXO和LFRCO),初始化时钟(HFCLK,LFCLK,LFA,LFB,LFE)以及将时钟分配给振荡器。注意:此功能未启用外设时钟(如GPIO时钟,TIMER时钟)。初始化外围设备时必须启用它们。

高频时钟

HFCLK用于无线电协议计时器(PROTIMER)。HFCLK是一个高频时钟,精度必须至少为±50 ppm。该时钟需要一个外部晶振才能足够准确(HFXO)。

HFXO初始化将外部晶体配置为时序关键型连接和睡眠管理。必须将HFXO设置为高频时钟(HFCLK),并物理连接到Wireless Gecko的HFXO输入引脚。

低频时钟

低频时钟LFCLK有两个用途。在蓝牙堆栈中,它用于蓝牙协议计时。还需要在睡眠模式下跟踪时间。

当设备进入睡眠模式时,将保存PROTIMER的当前状态。设备唤醒后,它将计算经过多少个睡眠时钟滴答,并相应地调整PROTIMER。在收音机中,PROTIMER似乎一直在滴答作响。

此时钟的准确性取决于设备的工作模式。在做广告或扫描时,精度不是那么重要,但是当连接断开时,精度必须至少为±500 ppm。该时钟可以由LFXO或LFRCO驱动,具体取决于精度要求。如果应用程序仅需要广告或扫描,则可以将LFRCO用作时钟源。但是,如果需要蓝牙连接,则时钟源必须是LFXO或PLFRCO(具有精确模式的LFRCO)。使用PLFRCO时,时钟的精度必须配置为±500 ppm。

时钟的准确性在蓝牙协议栈配置结构中定义,请参阅“蓝牙协议栈配置”部分。

在默认配置中,LFXO连接到Wireless Gecko,并设置为LFCLK的时钟源。如果设计中没有LFXO,但可用PLFRCO,则连接PLFRCO并将其设置为时钟源。如果没有连接LFXO或PLFRCO,但是在设计中需要蓝牙连接,则必须从应用程序中明确禁用睡眠。如“睡眠”部分所述,如果LFCLK不够准确,则必须禁用睡眠模式才能使蓝牙连接正确运行。

这些示例均默认设置了HFXO和LFXO的晶体调谐(CTUNE)设置,以与所有Silicon Labs的蓝牙模块,参考设计和无线电板一起使用。但是,在某些情况下,最终产品设计需要针对每个器件或每个设计进行特定的晶体校准。可以使用hfxoInit.ctuneSteadyState和功能中的lfxoInit.ctune设置根据设计调整CTUNE值initMcu_clocks()。

// Initialize HFXOCMU_HFXOInit_TypeDef hfxoInit = BSP_CLK_HFXO_INIT;hfxoInit.ctuneStartup = BSP_CLK_HFXO_CTUNE;hfxoInit.ctuneSteadyState = BSP_CLK_HFXO_CTUNE;CMU_HFXOInit(&hfxoInit);

有关配置HFXO和LFXO的更多信息,请参阅《 EFR32参考手册》。

HFXO CTUNE默认值

系统使用以下逻辑顺序检查多个源的默认HFXO CTUNE值:

  1. CTUNE PSKEY已设置。此项的ID为50(十六进制为32),并包含2个字节的数据,用于16位CTUNE值。可以使用BGAPI命令cmd_flash_ps_save进行编程

  2. 校准值存在于DEVINFO中。某些模块在DEVINFO页中包含工厂编程的值。

  3. 制造令牌存在于用户数据页面中。这由开发人员编程,或者如果板EEPROM包含该值,则可以由Simplicity Studio自动设置。该令牌由2个字节组成,与EFR32xG1x器件的“用户数据”页的起始地址或从EFR32xG21x器件的最后一个闪存页的起始地址偏移0x0100。有关完整的Flash映射,请参阅您的EFR变体的《 EFR32参考手册》。

  4. 如果在生成项目时选择了无线电板,则使用板头文件中的默认值

  5. 如果找不到其他内容,请使用CMU头文件中的默认值。

注意:蓝牙协议栈仅支持38.4 MHz HFXO频率。不支持其他HFXO频率。

DC-DC配置

在具有DC-DC的设备上,配置是在initMCU()函数中设置的。SDK中的示例已将DC-DC配置设置为可与Silicon Labs的蓝牙模块,无线电板和参考设计一起使用,但是自定义设计可能需要特定的DC-DC设置。这些自定义设置可以在hal-config-board.h中进行设置。

#define BSP_DCDC_INIT \{ \emuPowerConfig_DcdcToDvdd, /* DCDC to DVDD */ \emuDcdcMode_LowNoise, /* Low-noise mode in EM0 */ \1800, /* Nominal output voltage for DVDD mode, 1.8V */ \15, /* Nominal EM0/1 load current of less than 15mA */ \10, /* Nominal EM2/3/4 load current less than 10uA */ \200, /* Maximum average current of 200mA(assume strong battery or other power source) */ \emuDcdcAnaPeripheralPower_DCDC,/* Select DCDC as analog power supply (lower power) */ \160, /* Maximum reverse current of 160mA */ \emuDcdcLnCompCtrl_1u0F, /* 1uF DCDC capacitor */ \}

有关配置DC-DC的更多信息,请参阅EFR32参考手册,第11章,以及AN0948:电源配置和DC-DC。

低噪声放大器

低噪声放大器(LNA)是一种电子放大器,可放大非常低功率的信号而不会显着降低其信噪比。LNA改善了RF灵敏度。

某些MGM12P模块中的板载LNA作为前端模块(FEM)的一部分。要在这些模块中使用LNA,需要正确配置和启用FEM。使用前缀BSP_FEM_ 在hal-config-board.h中配置 FEM。

如果主板支持FEM ,则initFem()在initBoard()功能内初始化FEM。

定期广告

定期广告使多个收听者可以与单个广告设备同步。因此,它是组播的一种形式。

每个收听者在开始接收数据之前都需要与广告设备同步。定期广告使用监听设备上的扫描仪建立与广告设备的同步。同步后,可以停止扫描仪。这比全时使用扫描仪收听广播广告要省电得多。

定期广告由两个部分组成:定期广告主角色和侦听侧的定期广告同步这两个组件彼此独立,需要分别进行初始化。

max_advertisers 在蓝牙配置中,还配置了周期性广告主的最大数量。

要在Bluetooth堆栈中启用Periodic Advertiser,必须在通用gecko_init()函数之后调用以下初始化函数:

void gecko_init_periodic_advertising();

定期广告同步

max_periodic_sync 蓝牙配置中的,用于配置蓝牙协议栈需要支持的最大同步次数。

要在蓝牙协议栈中启用定期广告同步,必须在通用gecko_init()函数之后调用以下初始化函数:

void gecko_bgapi_class_sync_init();

此命令还将初始化BGAPI同步类,使其可供使用。

PTI

PTI(数据包跟踪接口)是Wireless Gecko SoC中的内置模块,用于将传入和传出的无线电数据包作为原始数据路由到调试接口。然后可以捕获这些数据包并将其显示在Simplicity Studio的网络分析器中。网络分析仪具有用于蓝牙数据包的解码器,可用于调试,分析和测量蓝牙网络。

configEnablePti()在initApp()函数中初始化PTI 。可以使用 定义在hal-config.h中设置波特率HAL_PTI_BAUD_RATE,而可以使用带有前缀的定义在hal-config-board.h中配置引脚BSP_PTI_。

从Bluetooth 2.6.x开始,PTI已配置有RAIL提供的功能。

发射功率

蓝牙的发射功率取决于无线电允许的最大功率,软件配置,RF路径增益补偿以及自适应跳频(AFH)的使用。

ETSI EN 300 328标准要求在发射机功率为+10 dBm以上时使用AFH。

如果适应性要求阻止,则最大允许功率限制为小于+10 dBm。ETSI标准要求AFH至少使用15个通道。在以下情况下,此要求可防止使用+10 dBm及以上:旧版广告,扫描响应以及在没有足够信道可用时的连接。

白名单

白名单用于过滤设备。当前仅在发现设备时才支持。连接请求,通告期间来自远程设备的扫描请求以及连接启动不受白名单的限制。

白名单大小与绑定设备最大数量的配置匹配。如果在使用白名单时更改了绑定设备的最大数量,则需要在新设置生效之前重置设备。

绑定的设备会自动添加到白名单中。或者,可以使用BGAPI命令手动添加它们gecko_cmd_sm_add_to_whitelist()。

不支持随机地址解析。使用可解析的随机地址的设备在扫描过程中将不可见。由于大多数Android和iOS手机使用可解析的随机地址,因此白名单功能将在设备发现期间有效地阻止这些设备。

要在蓝牙堆栈中启用白名单,必须在通用gecko_init函数之后调用以下初始化函数:

void gecko_init_whitelisting();

启用该功能后,可以在运行时通过BGAPI命令启用和禁用该功能gecko_cmd_le_gap_enable_whitelisting()。

Wi-Fi共存

Wi-Fi共存(COEX)是一种协议,蓝牙和Wi-Fi可以仲裁该协议可以使用无线电进行传输的协议。启用后,它可以改善Wi-Fi和蓝牙的性能。在hal-config-board.h中使用带有前缀BSP_COEX_和的定义来配置COEX HAL_COEX_。

要启用COEX,请在之后调用以下函数gecko_stack_init()。

gecko_initCoexHAL();

COEX实现了Wi-Fi IC的GPIO接口。它取决于EMLIB em_gpio.c和EMDRV gpiointerrupt.c,并且要求两个文件都包含在项目中。

  • 使用gecko_stack_init()进行蓝牙配置

g ecko_stack_init()函数用于配置Bluetooth堆栈,包括睡眠模式配置,为连接分配的内存,OTA配置等。在配置蓝牙堆栈之前,不能使用任何蓝牙堆栈功能。

蓝牙堆栈配置示例:

uint8_t bluetooth_stack_heap[DEFAULT_BLUETOOTH_HEAP(MAX_CONNECTIONS)];static const gecko_configuration_t config = {.config_flags=0,.sleep.flags=SLEEP_FLAGS_DEEP_SLEEP_ENABLE,.bluetooth.max_connections=MAX_CONNECTIONS,.bluetooth.heap=bluetooth_stack_heap,.bluetooth.heap_size=sizeof(bluetooth_stack_heap),.bluetooth.sleep_clock_accuracy = 100, // ppm.gattdb=&bg_gattdb_data,.ota.flags=0,.ota.device_name_len=3,.ota.device_name_ptr="OTA",.max_timers=4};

该gecko_stack_init()功能中的配置选项包括:睡眠启用/禁用,蓝牙连接计数,堆大小,睡眠时钟准确性,GATT数据库,OTA配置和PA配置。

gecko_stack_init()调用函数后,必须分别初始化每个使用的堆栈组件。这种分离允许通过不包括不必要的堆栈组件来优化内存。

以下命令可用于分别初始化堆栈组件:

命令

描述

gecko_bgapi_class_dfu_init()

启用设备固件升级(dfu)API。

gecko_bgapi_class_system_init()

启用本地设备(系统)API。

gecko_bgapi_class_le_gap_init()

启用通用访问配置文件(gap)API。

gecko_bgapi_class_le_connection_init()

允许通过连接API管理连接的建立,参数设置和断开过程。

gecko_bgapi_class_gatt_init()

使您能够通过gatt API浏览和管理远程GATT服务器中的属性。

gecko_bgapi_class_gatt_server_init()

使您能够浏览和管理本地GATT数据库gatt_server API中的属性。

gecko_bgapi_class_hardware_init()

启用对软件计时器的访问和配置。

gecko_bgapi_class_flash_init()

启用持久性存储命令(闪存)API,这些API可用于管理闪存中的用户数据。

gecko_bgapi_class_test_init()

启用DTM测试API。

gecko_bgapi_class_sm_init()

使安全管理器(sm)API启用。

gecko_bgapi_class_util_init()

启用实用函数API,例如atoi和itoa。

配置标志

当前标志

GECKO_CONFIG_FLAG_RTOS1 =应用程序使用RTOS。堆栈不配置RTOS提供的时钟,向量,TEMPDRV或休眠。

mbedTLS

堆栈使用的Mbedtls加密库是使用配置文件配置的,该文件定义了支持哪些算法以及实现是使用硬件加速还是在软件上完成。Mbedtls配置文件路径使用给出#define MBEDTLS_CONFIG_FILE。默认配置文件mbedtls_config.h位于SDK中,如果需要更改配置,则应将其用作模板。

多协议优先级配置

在多协议环境中将蓝牙协议栈与其他协议一起使用时,可能有必要更改RAIL的蓝牙优先级设置以优化某些用例。

应用程序需要分配配置结构并将其提供给蓝牙堆栈:

gecko_bluetooth_ll_priorities custom_priorities;static const gecko_configuration_t config = {//.bluetooth.linklayer_priorities = &custom_priorities,//};

 

gecko_bluetooth_ll_priorities必须通过GECKO_BLUETOOTH_PRIORITIES_DEFAULT常量将结构初始化为默认状态。

该gecko_bluetooth_ll_priorities结构包含以下字段:

  • scan_min&scan_max-扫描操作的优先级范围。

  • adv_min&adv_max-广告操作的优先级范围。

  • conn_min&conn_max-连接数据包的优先级范围。

  • init_min&init_max-连接启动的优先级范围。

  • threshold_coex -提高优先级信号时的阈值水平,仅在启用coex时使用。

  • rail_mapping_offset -蓝牙优先级所在的RAIL优先级。

  • rail_mapping_range -蓝牙优先级所在的RAIL优先级范围。

对于每个优先级范围,0是最大优先级,0xff是最小优先级。蓝牙优先级与RAIL优先级不同。也就是说,蓝牙在所有蓝牙优先级所在的位置都有自己的介于0和0xff之间的空间。要将Bluetooth优先级映射到RAIL优先级,请使用字段中的值rail_mapping_offset并rail_mapping_range形成单次方程式:

RAIL_priority=(BT_priority/0xFF)*rail_mapping_range+rail_mapping_offset

睡眠

必须在该gecko_init()功能中启用Wireless Gecko的睡眠模式EM2(节能模式2)。睡眠标志是该gecko_configuration_t结构的一部分。该SLEEP_FLAGS_DEEP_SLEEP_ENABLED标志必须设置为启用睡眠。如发生阻塞事件,休眠模式将由堆栈自动处理,如“ 蓝牙堆栈事件处理”一节中所述。

在gecko_configuration_tstruct(main.c)中启用睡眠的示例:

.sleep.flags = SLEEP_FLAGS_DEEP_SLEEP_ENABLE // EM sleeps enabled

睡眠模式要求硬件中存在准确的32 kHz低频时钟(LFCLK)。如果没有准确的睡眠时钟可用于蓝牙协议栈,那么如果应用程序需要支持蓝牙连接,则无法进入低功耗睡眠模式。对于不需要低功耗睡眠模式的应用,可以省去LFXO或LFRCO,但是壁虎配置结构中的睡眠标志必须设置如下:

.sleep.flags = 0, // Sleeps disabled

在运行时禁用睡眠

如果需要在运行时禁用睡眠,则可以通过调用睡眠驱动程序函数SLEEP_SleepBlockBegin(sleepEM2)来完成。要重新启用EM2深度睡眠模式,请使用SLEEP_SleepBlockEnd(sleepEM2)。当EM2被禁用(/阻塞)时,堆栈将在EM0和EM1之间切换。有关更多信息,请参阅知识库文章“将能源模式与Bluetooth Stack一起使用”。

蓝牙堆栈配置

堆栈记忆体

蓝牙堆栈使用内部内存管理为每个连接和内部数据缓冲区分配内存。该内存需要由应用程序分配并传递给蓝牙堆栈。内存大小取决于连接数。C宏DEFAULT_BLUETOOTH_HEAP()计算所需内存的默认大小(以字节为单位)。

分配bluetooth_stack_heap数组并将其传递到Bluetooth堆栈的示例:

uint8_t bluetooth_stack_heap[DEFAULT_BLUETOOTH_HEAP(MAX_CONNECTIONS)];static const gecko_configuration_t config = {//.bluetooth.heap = bluetooth_stack_heap,.bluetooth.heap_size = sizeof(bluetooth_stack_heap),//};

连接数

同时进行的蓝牙连接的绝对最大数量为8。为连接管理分配的内存量进一步限制了连接数量。在中初始化时分配内存gecko_init()。MAX_CONNECTIONS可以定义C-define 来设置连接数。然后,如上所述,相同的定义也可用于计算蓝牙堆栈的内存大小。MAX_CONNECTIONS然后将其进一步传递给.bluetooth.max_connections配置结构中字段中的Bluetooth堆栈。

将蓝牙连接限制为一(1)的示例。

#define MAX_CONNECTIONS 1

有关连接RAM使用情况的更多信息,请参阅7.3.2蓝牙连接池。

睡眠时钟精度

蓝牙堆栈用于.sleep_clock_accuracy优化从睡眠中唤醒的时间。单位为ppm(百万分之一)。如果该值太大,则蓝牙堆栈太早从睡眠中唤醒,无法等待实际事件,这会导致过多的功耗。如果此值太小,则蓝牙协议栈唤醒时间太晚,并且错过了连接事件,这会导致连接断开。

如果未定义或设置为0,则使用默认值250 ppm。

设置睡眠时钟精度的示例。

.bluetooth.sleep_clock_accuracy = 100, // ppm

广告商

可以通过此配置选项定义广告集的最大数量。这些集合可用于启动多个广告商。此配置选项还配置了定期通告的最大数量。每个广告上下文分配约60个字节的RAM。

.bluetooth.max_advertisers = 5; //!< Maximum number of advertisers to support, if 0 defaults to 1

注意:最大可连接广告受到MAX_CONNECTIONS的限制。

同步广告

需要配置支持的最大同步广告数量。每个上下文分配约40个字节的RAM。

.bluetooth.max_periodic_sync = 5; //!< Maximum number of synhronous advertisers to support. Default is 0, none supported

OTA配置

由于部分固件升级由蓝牙AppLoader应用程序处理,因此支持蓝牙无线(OTA)固件升级。

OTA模式使用.ota.flags配置字段。目前,它只有一个选项,GECKO_OTA_FLAGS_RANDOM_ADDRESS该选项将OTA设置为使用静态随机地址而不是公共地址。

当Wireless Gecko处于AppLoader的OTA模式时,可以通过gecko配置结构配置其设备名称和设备名称长度。

.ota.device_name_len = 3, // OTA name length

.ota.device_name_ptr = "OTA", // OTA Device Name

最后,应确保将设备设置为OTA DFU模式,以便只有受信任的设备才具有该功能。

有关OTA固件更新的更多详细信息,请参考《UG266:Silicon Labs Gecko Booloader用户指南》和《AN1086:将Gecko Bootloader与Silicon Labs蓝牙应用程序结合使用》。

功放

在基于EFR32 SoC的设计中,可以从DC / DC的输出或从3.3 V电源直接提供PAVDD(功率放大器电压调节器VDD输入)。

蓝牙协议栈配置默认使用DC / DC作为PAVDD输入。如果从3.3 V电源提供PAVDD,则.pa.input需要定义该字段。

蓝牙堆栈会自动选择高功率PA(如果有)。在pa_mode配置中设置1 将使蓝牙协议栈始终使用低功率PA。

.pa.config_enable = 1, // PA Configuration is enabled

.pa.input = GECKO_RADIO_PA_INPUT_VBAT, // PAVDD is upplied from an 3.3 V power supply

.pa.pa_mode=0 // selects high power PA if available

软件计时器

可以配置最大可用软件计时器。每个计时器都需要来自堆栈的资源才能实现。在某些使用情况下,软计时器数量的增加可能会导致性能下降。

.max_timers = 4; // Maximum number of soft timers, up to 16, Default: 4

射频路径增益

该应用程序可以分别定义RX和TX的RF路径增益值。

调整发射器功率时,蓝牙堆栈会考虑TX RF路径增益。然后,从天线辐射的功率会匹配应用程序的请求。例如,如果应用程序要求的最大功率为+10 dBm,路径损耗为-1 dBm,则引脚上的实际功率为+11 dBm。

RX RF路径增益用于补偿来自蓝牙协议栈的RSSI报告。

.rf.tx_gain = -20; // RF TX path gain in unit of 0.1 dBm

.rf.rx_gain = -18; // RF RX path gain in unit of 0.1 dBm

  • 蓝牙堆栈事件处理

Wireless Geckos的蓝牙堆栈是事件驱动的体系结构,其中事件在主while循环中处理。

  • 阻止事件监听器

gecko_wait_event()是阻塞等待函数的实现,该函数等待事件出现到事件队列中并将它们返回给事件处理程序。这是蓝牙堆栈建议的操作模式,因为它可以最有效和自动地管理睡眠,同时保持设备和连接同步。

  • 该gecko_wait_event()函数处理内部消息队列,直到接收到事件为止。

  • 如果没有任何待处理的事件或消息要处理,则设备将进入EM1或EM2睡眠模式。

  • 该函数返回一个指向gecko_cmd_packet保存所接收事件的结构的指针。

下面的代码段显示了iBeacon示例中使用的简单主while循环,该示例gecko_wait_event()在启动后设置广告。

/* Main loop */while (1) {struct gecko_cmd_packet* evt;/* Wait (blocking) for a Bluetooth stack event. */evt = gecko_wait_event();/* Run application and event handler. */switch (BGLIB_MSG_ID(evt->header)){/* This boot event is generated when the system is turned on or reset. */case gecko_evt_system_boot_id:/* Initialize iBeacon ADV data */bcnSetupAdvBeaconing();break;/* Ignore other events */default:break;}
  • 非阻塞事件监听器

这种操作模式需要更多的手动调整,例如,睡眠管理需要由应用程序完成。在某些用例中,需要非阻塞操作。

  • 该gecko_peek_event()函数处理内部消息队列,直到接收到事件或所有消息被处理为止。

  • 该函数返回一个指针,该指针指向gecko_cmd_packet保存已接收事件或NULL队列中没有事件的结构。

睡眠和非阻塞事件监听器

当应用程序使用非阻塞gecko_peek_event()功能创建事件处理程序时,睡眠实现也有所不同。应用程序必须用于gecko_can_sleep_ms()查询堆栈设备可以休眠多长时间,然后使用该gecko_sleep_for_ms()函数将该设备设置为休眠该时间。必须在调用gecko_can_sleep_ms()或gecko_sleep_for_ms()函数之前禁用中断,并在执行函数后启用中断。

注意:建议不要在此关键部分添加任何其他功能。这将增加中断延迟并降低性能。

下面的示例显示了使用非阻塞事件处理时如何实现睡眠管理。

/* Main loop */while (1) {struct gecko_cmd_packet* evt;CORE_DECLARE_IRQ_STATE;/* Poll (non-blocking) for a Bluetooth stack event. */evt = gecko_peek_event();/* Run application and event handler. */if(evt != NULL){switch (BGLIB_MSG_ID(evt->header)){/* This boot event is generated when the system is turned on or reset. */case gecko_evt_system_boot_id:/* Initialize iBeacon ADV data */bcnSetupAdvBeaconing();break;/* Ignore other events */default:break;}}CORE_ENTER_ATOMIC(); // Disable interrupts/* Check how long the stack can sleep */uint32_t durationMs = gecko_can_sleep_ms();/* Go to sleep. Sleeping will be avoided if there isn't enough time to sleep */gecko_sleep_for_ms(durationMs);CORE_EXIT_ATOMIC(); // Enable interrupts}

更新事件监听器的通知

在某些情况下,可能需要在应用程序的另一个事件循环中运行Bluetooth事件循环。蓝牙堆栈具有回调机制,用于通知应用程序有关更新蓝牙堆栈事件监听器的需求。通过在蓝牙配置结构中定义回调函数来启用此功能。

注意:这stack_schedule_callback是从中断上下文中调用的。重要的是不要致电gecko_peek_event或gecko_wait_event从此上下文中进行呼叫。应用程序必须设置一个标志或使用其他机制来启用应用程序主循环以更新蓝牙堆栈。

static const gecko_configuration_t config = {//.stack_schedule_callback = bluetooth_update//};void bluetooth_update(){//set notification for application}
  • Micrium OS的事件监听器

该应用程序使用不同的过程来使用Micrium OS接收事件。应用程序需要调用Micrium OS标志,而不是调用函数来接收事件。只能从单个任务接收事件。

Micrium OS标志bluetooth_event_flags用于通知蓝牙蓝牙状态的不同任务。该应用程序仅使用BLUETOOTH_EVENT_FLAG_EVT_WAITING和BLUETOOTH_EVENT_FLAG_EVT_HANDLED。

应用程序事件处理程序需要保留BLUETOOTH_EVENT_FLAG_EVT_WAITING。

OSFlagPend(&bluetooth_event_flags, (OS_FLAGS)BLUETOOTH_EVENT_FLAG_EVT_WAITING 0,OS_OPT_PEND_BLOCKING +

OS_OPT_PEND_FLAG_CONSUME, NULL,&os_err);

`

然后,传入事件在中可用bluetooth_evt。

switch (BGLIB_MSG_ID(bluetooth_evt->header)) {

 

}

`

处理事件后,需要释放它以允许接收下一个事件。这是通过发布标志通知蓝牙任务来完成的BLUETOOTH_EVENT_FLAG_EVT_HANDLED。

OSFlagPost(&bluetooth_event_flags, (OS_FLAGS)BLUETOOTH_EVENT_FLAG_EVT_HANDLED, OS_OPT_POST_FLAG_SET, &os_err);

注意:当应用程序待处理时,睡眠和电源管理将由Micrium OS而不是由应用程序自动处理。

来自多个任务的命令

可以从多个Micrium OS任务发送蓝牙命令。它要求每个任务在发送命令之前都具有排他性,然后再释放它。

为了方便起见,蓝牙协议栈提供了两种功能。BluetoothPend获取Micrium OS互斥锁并BluetoothPost释放该互斥锁。

以下代码块在蓝牙命令之前获取了蓝牙互斥锁,并在之后释放了该互斥锁。

BluetoothPend(&err); //acquire mutex for Bluetooth stack

gecko_cmd_gatt_server_send_characteristic_notification(0xff, gattdb_temp_measurement, 5, temp_buffer);

BluetoothPost(&err);//release mutex

  • 中断

中断在其各自的中断处理程序中创建事件,无论是无线电中断还是来自IO引脚的中断。事件随后在主事件循环中从消息队列进行处理。应用程序应始终尽量减少中断处理程序中的处理时间,并将处理留给事件回调或主循环使用。

通常,中断方案根据任何基于事件的编程体系结构进行,但是一些独特且重要的例外适用于蓝牙协议栈:

  • 不能从中断上下文中调用BGAPI命令。

  • 只能gecko_external_signal()从中断上下文中调用该函数。

  • gecko_sleep_for_ms()如前面的代码示例所示,在调用之前必须禁用中断。

  • 外部事件

外部事件用于捕获所有外围中断,作为要传递到主事件循环并在该循环内进行处理的外部信号。外部事件中断可以来自任何外围中断源,例如IO,比较器或ADC等。信号位数组用于通知事件处理程序已发出哪些外部中断。

  • 外部信号的主要目的是触发从中断上下文到主事件循环的事件。

  • system_external_signal可以通过调用该void gecko_external_signal(uint32 signals)函数来生成BGAPI事件。

  • gecko_external_signal可以从中断上下文中调用该函数。

  • gecko_external_signal函数的signals参数传递给system_external_signal event。

/*** Main*/void main(){...//Event loopwhile(1){...//External signal indication (comes from the interrupt handler)case gecko_evt_system_external_signal_id:// Handle GPIO IRQ and do something// External signal command’s parameter can be accessed using// event->data.evt_system_external_signal.extsignalsbreak;...}}/*** Handle GPIO interrupts and trigger system_external_signal event*/void GPIO_ODD_IRQHandler(){static bool radioHalted = false;uint32_t flags = GPIO_IntGet();GPIO_IntClear(flags);//Send gecko_evt_system_external_signal_id event to the main loopgecko_external_signal(...);}

优先事项

强烈建议无线电应具有最高优先级的中断。这是默认配置,其他中断的优先级较低。无线电的默认中断优先级为1,对于链路层,优先级为2,USART中断为3,其他中断的默认优先级为4。

如果应用程序需要禁用中断,建议使用BASEPRI寄存器而不是PRIMASK寄存器。该BASEPRI寄存器以中断优先级PRIMASK禁用,而禁用所有中断。可以将EMLIB Core配置为使用BASEPRI寄存器,然后可以将其与CORE_ENTER_ATOMIC()和CORE_EXIT_ATOMIC()宏一起使用。

在没有RTOS的情况下,链路层使用PendSV来获得高于应用程序软件的优先级。使用RTOS,链接层将不使用PendSV,但是链接层任务将比应用程序任务具有更高的优先级。然后,RTOS调度程序将优先于链接层任务而不是应用程序任务。

下表描述了在不同操作上下文中运行的蓝牙协议栈中的三个不同组件,以及它们为禁用每个组件以确保连接的最大中断时间。

零件

描述

计时精度

操作环境

最大IRQ禁用

如果忽略时间要求

无线电

对时间要求严格的低电平TX / RX无线电控制

微秒

广播IRQ

<〜10μs

数据包未发送或接收,最终将导致监管超时和蓝牙链接丢失。

链接层

时间紧迫的连接管理程序和加密

毫秒

PendSV IRQ *

<〜20毫秒

如果未及时处理链接控制过程,则可能会发生蓝牙链接丢失。从侧通道映射更新和连接更新时序由主机控制。

主机栈

蓝牙主机堆栈,安全管理器,GATT

应用

<30秒

SMP和GATT的超时时间为30 s,如果在此超时时间内未处理任何操作,则将导致蓝牙链接丢失。

* PendSV中断仅在没有RTOS的情况下使用

wrieless Gecko资源

蓝牙协议栈使用了Wireless Gecko的一些资源,这些资源对应用程序不可用。下表列出了资源,并说明了堆栈的使用情况。前四个资源(红色)始终由蓝牙堆栈使用。

类别

资源资源

用于软件

笔记

PRS

PRS7

PRS7 PROTIMER RTC同步

PRS7始终由蓝牙协议栈使用。

计时器

即时通讯

EM2计时

用于睡眠时间。两个通道总是保留的。

 

应用程序只能读取RTC值,而不能写入RTC值或使用RTCC。

 

RTCC仅在EFR32BG1和EFR32BG12中保留。有关更多信息,请参见RTCC。

计时器

计时器

蓝牙

该应用程序无权访问PROTIMER。

无线电

无线电

蓝牙

始终使用,所有无线电寄存器均保留用于蓝牙堆栈。

通用输入输出

国家协调委员会

主机通讯

根据使用的功能(UART,RTS / CTS,唤醒和主机唤醒),可以为NCP使用分配2至6个I / O引脚。

 

可选使用,仅对NCP用例有效。

通用输入输出

PTI

封包追踪

2至N x I / O引脚。

 

可选使用。

通用输入输出

发送使能

TX活动指示

1个I / O引脚

 

可选使用。

通用输入输出

接收使能

RX活动指示

1个I / O引脚

 

可选使用。

通用输入输出

COEX

Wi-Fi共存

4个I / O引脚。

 

可选使用。

CRC

GPCRC

PS Storge

可以在应用程序中使用,但是应用程序应始终在使用前重新配置GPCRC,并且不得在CMU中禁用GPCRC时钟。

flash

MSC

PS Storge

可由应用程序使用,但不得禁用MSC。

加密

加密

蓝牙链接加密

CRYPTO外设只能通过mbedTLS密码库访问,而不能通过任何其他方式访问,该库应该能够在堆栈和应用程序访问之间进行调度。

FLASH

应用程序和蓝牙堆栈从闪存执行。闪存可分为用于引导加载程序,Bluetooth AppLoader,应用程序和非易失性存储器的块,如下图所示。

  • 引导加载程序对于实现蓝牙堆栈和应用程序升级能力至关重要。引导加载程序经过专门设计,可针对未来进行改进,以改进引导加载程序和增加功能。在具有单独的引导加载程序闪存的设备上,它位于此处。

  • 蓝牙AppLoader为应用程序提供OTA可升级性。这是一项可选功能,但使用它需要同时使用引导加载程序。

  • PS Store和NVM3是非易失性数据存储(NVM),蓝牙堆栈和应用程序都可以在其中存储永久数据,例如蓝牙绑定密钥,应用程序配置数据,硬件配置等。

  • 该应用程序位于Bluetooth AppLoader和NVM之间。蓝牙堆栈是与应用程序链接的库。蓝牙堆栈包括实际的蓝牙固件,包括链路层,GAP,SM,ATT。和GATT层。

  • 用户数据页面用于存储制造令牌。在EFR32BG2X器件上,它位于主闪存的末端。

 有和没有独立的引导加载程序闪存时的 闪存使用情况

下表显示了每个块的闪存使用情况。估计值可能会因使用案例,配置,应用程序资源或SDK版本而异。

 flash使用

* soc-empty和soc-thermometer是Bluetooth SDK中提供的示例应用程序。它们是通过大型优化进行编译的。GCC使用该-Os标志,而IAR使用该-Ohz标志。

优化闪存使用率

消除死代码

蓝牙堆栈库旨在受益于链接器的无效代码消除优化。通过这种优化,所有未使用的代码将从应用程序中删除。

为了充分利用此优化功能,重要的是不要调用应用程序不需要的任何函数。这些功能包括蓝牙堆栈的所有初始化功能。

蓝牙堆栈组件的选择性初始化

gecko_init()函数会自动初始化每个堆栈组件。对于更多的选择性初始化,gecko_stack_init()必须使用。然后,每个必需的堆栈组件都将单独初始化。有关更多信息,请参阅“ 使用gecko_stack_init()进行蓝牙配置”部分。

连结中

蓝牙堆栈作为一组库文件提供。该应用程序将蓝牙堆栈库与其他应用程序链接。然后,链接器将创建一个ELF文件,其中包含准备好要加载到闪存中的应用程序代码和数据。

为了生成OTA DFU文件,必须将应用程序的代码和数据链接到ELF文件中自己的部分。这是通过蓝牙堆栈随附的链接器文件自动完成的。

 链接器文件中定义的节及其放置 链接器文件中定义的节及其放置

链接器文件定义了两个存储区,一个用于主闪存,一个用于引导加载程序闪存。如果不存在单独的引导加载程序闪存,则链接器文件会从主闪存中为引导加载程序保留一些内存。蓝牙AppLoader放在主闪存的开头,带有所有库的应用程序从下一个免费闪存页面开始。

有关OTA更新及其启用方法的更多信息,请参考UG266:《 Silicon Labs Gecko Bootloader用户指南》和《AN1086:将Gecko Bootloader与Silicon Labs蓝牙应用程序结合使用》。

内存

蓝牙堆栈保留了Wireless Gecko的部分RAM,并将未使用的RAM留给应用程序。

蓝牙功能的RAM消耗分为:

  • 蓝牙堆栈

  • 蓝牙连接池

  • 蓝牙GATT数据库

  • C堆栈

  • 堆内存

下表显示了RAM使用情况的详细信息。

零件

分配的RAM

蓝牙堆栈

12 kB

蓝牙连接池

4824 +连接数* 480字节

蓝牙GATT数据库

取决于应用程序(20到200个字节)

调用堆栈

2 kB

堆内存

3 KB

蓝牙堆栈

蓝牙协议栈至少需要12 kB RAM。它包括具有低级无线电驱动程序和应用程序编程接口的蓝牙堆栈软件。

蓝牙连接池

蓝牙堆栈使用其自己的静态内存池进行动态内存分配。分配的内存池的大小取决于并行连接的数量。该数字是通过gecko_init()函数中的.bluetooth.max_connections参数设置的。

Bluetooth Connection Pool Size = 4824 + Number of connections * 436 bytes

蓝牙GATT数据库

蓝牙GATT数据库使用RAM。RAM的使用量取决于用户定义的GATT数据库,因此不能一概而论。所有启用了写操作的特性都使用与其定义的长度一样多的RAM。另外,GATT中的每个属性都需要几个字节的RAM来维护属性权限。典型的RAM使用量约为20到200个字节。

调用堆栈

蓝牙堆栈至少需要从RAM保留1.5 kB的呼叫堆栈。应用程序开发人员必须在堆栈要求的1.5 kB之上为应用程序调用堆栈分配RAM。

调用堆栈大小定义的位置取决于编译器和启动文件。默认呼叫堆栈大小为2 kB。可以通过以下命令行选项来覆盖它:

编译器

命令行选项

注意

IAR

--config_def __STACK_SIZE=<size>

调用堆栈在链接器文件中定义。该参数需要传递给链接器。

GCC

 

-D __STACK_SIZE=<size>

调用堆栈在启动代码中定义。这需要为编译器定义。

堆内存

必须根据应用程序要求保留堆内存。

堆大小定义的位置取决于编译器和启动文件。最小堆大小为3328(0xD00)字节,这也是默认值。可以通过以下命令行选项来覆盖它:

编译器

命令行选项

注意

IAR

--config_def __HEAP_SIZE=<size>

调用堆栈在链接器文件中定义。该参数需要传递给链接器。

GCC

-D__HEAP_SIZE=<size>

调用堆栈在启动代码中定义。这需要为编译器定义。

即时通讯

本章仅适用于EFR32BG1和EFR32BG12。其他设备具有单独的蓝牙定时器,应用程序可自由使用RTCC。

硬件RTCC(实时时钟和日历)已由Bluetooth堆栈设置为以计数器模式运行,并且保留供堆栈使用。但是,RTC值可以由应用程序读取,但不能由应用程序写入。每次启动设备时,都会重置RTC值。

如果应用程序需要类似RTCC的功能,则可以开发以下应用程序代码:

  1. 建立一种从诸如智能手机之类的外部设备检索当前时间的机制。某些智能手机实现了蓝牙时间配置文件,可用于读取时间和日期值。

  2. 将时间转换为“自纪元以来的秒数”(例如,mktime从stdlib 使用)。

  3. 使用蓝牙协议栈的API hardware_get_time(),自重置起经过秒数。

  4. 计算“自纪元以来的秒数”与自复位以来的秒数之间的差异,并将其存储到例如PS键中。

  5. 如果要获取当前日历时间,请使用hardware_get_time获取当前RTC值,将PS键中的值添加到其中,然后使用localtimestdlib获取当前日历时间。

应用ELF文件

ELF(可执行和可链接格式)是可执行文件的标准文件格式。本章介绍ELF文件中与应用程序和Bluetooth堆栈相关的部分。

一些链接器提供了描述已消耗的闪存的输出,但是持续的状态并不明显。蓝牙项目可能包含引导加载程序和蓝牙AppLoader,并且该设备可能具有用于引导加载程序的单独闪存。ELF文件提供有关RAM和闪存使用情况的确切信息。

Simplicity Studio提供了GCC工具链,其中包含命令行工具objdump。该工具可用于从ELF文件获取节信息。

objdump需要输入ELF文件。如果使用该参数-h,则objdump转储节头信息。

IAR

从命令行为示例应用程序调用objdump:

arm-none-eabi-objdump -h IAR\ ARM\ -\ Default/soc-thermometer-iar-mg1p.out

`

然后,objdump提供以下输出:

Sections:

Idx Name Size VMA LMA File off Algn

0 .text_apploader rw 00008fc0 00004000 00004000 00000034 2**11

CONTENTS, ALLOC, LOAD, READONLY, DATA

1 .text_application us 0001e3d3 0000d000 0000d000 00008ff4 2**11

CONTENTS, ALLOC, LOAD, READONLY, CODE

2 A1 rw 00000800 20000000 20000000 000273c8 2**3

ALLOC

3 P3 rw 00000246 20000800 20000800 000273c8 2**2

ALLOC, CODE

4 P3 ui 00000d00 20000a48 20000a48 000273c8 2**3

ALLOC

5 P3 zi 00002b60 20001748 20001748 000273c8 2**8

 

.text_apploader 包含蓝牙AppLoader。

.text_application包含应用程序代码和只读数据。在此示例中,应用程序的大小以十六进制为0x1e3d3,以十进制为123859字节。

有关其余部分的说明,请参阅IAR文档。

海湾合作委员会

从命令行为示例应用程序调用objdump:

arm-none-eabi-objdump -h GNU\ ARM\ v4.9.3\ -\ Default/soc-thermometer-gcc-mg1p.axf

然后,objdump提供以下输出:

Sections:

Idx Name Size VMA LMA File off Algn

0 .text_bootloader 00000000 00000000 00000000 000306d0 2**0

CONTENTS

1 .text_apploader 00009000 00004000 00004000 00004000 2**0

CONTENTS, ALLOC, LOAD, READONLY, DATA

2 .text_application 0001e4c4 0000d000 0000d000 0000d000 2**8

CONTENTS, ALLOC, LOAD, READONLY, CODE

3 .text_application_ARM.exidx 00000008 0002b4c4 0002b4c4 0002b4c4 2**2

CONTENTS, ALLOC, LOAD, READONLY, DATA

4 .stack_dummy 00000400 20000000 20000000 000306d0 2**3

CONTENTS

5 .text_application_data 000002d0 20000400 0002b4cc 00030400 2**2

CONTENTS, ALLOC, LOAD, CODE

6 .bss 00002a88 20000700 0002b800 00030700 2**8

ALLOC

7 .heap 00000c00 20003188 20003188 00030ad0 2**3

CONTENTS

`

.text_bootloader包含引导加载程序。在此示例中,它是单独加载的,该部分为空。

.text_apploader 包含蓝牙AppLoader。

.text_application包含应用程序代码和只读数据。在此示例中,应用程序的大小为十六进制的0x1e3c3和十进制的124100字节。

.text_application_ARM.exidx 用于调试

.stack_dummy 是调用堆栈的占位符部分。

.text_application_data 是初始化变量的RAM部分。

.bss 是未初始化变量的RAM部分。

.heap 是堆的RAM部分。

有关其余部分的说明,请参阅GCC文档

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. JAVA实现第n个素数的查找

    素数就是除了自己和1之外没有其他因数的数 判断条件可以是&#xff1a; 1.因数只有1和本身n 2.(1,n/2]中没有可以整除n的整数 3.(1,sqrt(n)]中没有可以整除n的整数 首先写一下输出1-n中的素数输出 方法一 import java.util.Scanner;public class 素数 {public static vo…...

    2024/4/29 4:50:49
  2. Solidia Technologies宣布有可能将混凝土转变为地球碳汇

    首席执行官Tom Schuler在Countdown全球启动仪式上发表TED演讲&#xff0c;分享预拌混凝土的技术应用 新泽西州皮斯卡特维--(美国商业资讯)--Solidia Technologies首席执行官Tom Schuler在TED和Future Stewards全球Countdown启动仪式上发表TED演讲&#xff0c;其间分享了将Solid…...

    2024/4/27 15:19:28
  3. DREP双周报9.16-10.15 | DREP公链开发持续优化,区块浏览器提升分析和统计功能

    亲爱的DREP社区成员&#xff1a; 9月下半月和10月上半月DREP更加关注DREP技术产品进展。 技术产品方面&#xff0c;DREP公链正在进行出块节点弹性增减功能的设计与开发&#xff0c;增加节点最高限制MaxPeers&#xff0c;节点总量可在2/3MaxPeers ~ MaxPeers 之间增减&#xf…...

    2024/4/28 22:00:14
  4. CDH技术向视频:PaaS、flink、kafka、Workload XM、Cloudera Machine Learning

    CDP私有云上面的PaaS服务&#xff0c;也即是容器化的数据体验服务&#xff0c;一共有五类PaaS服务&#xff1a;CDW、CDE、CML、CDF、COD。本视频主要展示CDW和CML两类服务。 CDW封装了Hive LLAP和Impala服务&#xff0c;这些服务运行在K8S之上&#xff0c;让你可以快速部署计算…...

    2024/5/6 18:25:05
  5. 一周的小项目总结

    一&#xff0c;普通用户&#xff08;User&#xff09; 1&#xff09;注册&#xff1a; 注册的时候由于注册的用户分为普通用户和管理员用户&#xff0c;所以关联到另一张角色表&#xff0c;并且是用户角色权限表是通过用户表和角色表的主键构成&#xff0c;不能直接在用户表里…...

    2024/4/19 1:04:40
  6. leetcode-621. 任务调度器

    题目 给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行&#xff0c;并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务&#xff0c;或者在待命状态…...

    2024/4/17 20:21:01
  7. innodb行级锁

    1.SELECT … FROM 是一个快照读&#xff0c;通过读取数据库的一个快照&#xff0c;不会加任何锁&#xff0c;除非将隔离级别设置成了 SERIALIZABLE 。 2.SELECT … FROM … LOCK IN SHARE MODE 在所有索引扫描范围的索引记录上加上共享的next key锁;如果是唯一索引&#xff0c;…...

    2024/4/17 19:35:40
  8. Loadrunner 录制手机App脚本多种方法介绍

    之前写过使用Loadrunner录制APP脚本的基本流程_Loadrunner_APP测试_性能测试_脚本录制_基本操作流程&#xff0c;但是只能用于请求单一服务器端口适用 这次主要是写的多server服务器时&#xff0c;如何录制脚本&#xff08;APP、浏览器脚本录制均适用&#xff09; 录制多serve…...

    2024/4/6 8:28:34
  9. 如何办理gb2626,民用口罩en149标准

    防护用品质检报告一般有国标欧标美标测试&#xff0c;要带CNASCMA章。如手套GB10213&#xff0c;GB7543&#xff1b;防护服GB19082&#xff0c;EN13795&#xff0c;EN14126&#xff0c;AAMI PB70&#xff1b;口罩GB19083&#xff0c;YY0469&#xff0c;YY/T0969&#xff0c;GB2…...

    2024/4/6 6:57:30
  10. vue中利用a的href属性配合dom的id实现锚点定位

    vue的项目中&#xff0c;有一些地方需要使用锚点定位。 html中传统锚点定位方法就是利用a标签的href属性值与dom元素的id值实现的&#xff0c;例如&#xff1a; <a href"#tiaozhuan1">早年经历</a><h3 id"tiaozhuan1">早年经历</h3&…...

    2024/4/6 6:57:29
  11. gcc: internal compiler error: Killed (program cc1)

    编译报错 gcc: internal compiler error: Killed (program cc1) Please submit a full bug report, with preprocessed source if appropriate. See <file:///usr/share/doc/gcc-5/README.Bugs> for instructions. dmesg 可以看到系统有提示 out of memory free -m 可以…...

    2024/4/13 9:21:19
  12. Python的应用范围

    Python的应用范围 尽管python是适合初学者学习的语言&#xff0c;许多青少年儿童培训机构也以python作为程序入门语言。然而它却是一个功能强大的程序语言&#xff0c;以下是它的部分可应用范围&#xff1a; (1) 设计动画游戏&#xff1b; (2) 支持图形接口 ( Graphical Use…...

    2024/4/6 6:57:27
  13. 基于注解的aspectJ开发步骤|学习SSM第四天

    基于注解的aspectJ开发步骤 今天是学习SSM框架的第四天&#x1f937;‍♀️ 今天咱们就单纯做一个实验&#xff0c;如果有不理解的&#xff0c;欢迎大家在评论区留言&#x1f91e; 1 准备切面和通知 package aspectj_xml_annotation; import org.aspectj.lang.JoinPoint; im…...

    2024/4/23 4:15:40
  14. Java进阶笔记(四):SpringMVC相关

    springMVC是什么&#xff1a;spring提供的用于简化web开发的框架。 -------------------------------- view&#xff1a;视图(html) Controller&#xff1a;只负责接收请求、转发请求 service&#xff1a;处理业务逻辑 Dao&#xff1a;操作数据库 经典三层&#xff08;代码架…...

    2024/4/6 8:28:32
  15. 信息搜集-子域名挖掘

    作者&#xff1a;小刚 一位苦于信息安全的萌新小白帽&#xff0c;记得关注给个赞&#xff0c;谢谢 本实验仅用于信息防御教学&#xff0c;切勿用于其它用途 子域名挖掘域名收集原理网站和工具1.在线子域名查询https://phpinfo.me/domain/2.一会儿~ https://dns.bufferover.run/…...

    2024/4/26 7:47:31
  16. 爬虫IP被封的处理方法

    在数据爬虫的工作中&#xff0c;我们不可避免的会遭遇反爬封禁&#xff0c;所以会有爬虫的攻防&#xff0c;在攻和守之间两股力量不断的抗衡。 接下来就讲讲在数据抓取或爬虫时ip被限制的几种解决方案问题&#xff1a; 解决方案一&#xff1a; 建议一定要使用代理IP&#xff…...

    2024/4/6 8:28:31
  17. 让人无法拒绝的内容种草营销

    以前传统的营销方式是先宣传品牌&#xff0c;打造品牌的知名度&#xff0c;然后在宣传产品&#xff0c;推广产品&#xff0c;利用品牌的知名度和影响力吸引用户购买&#xff0c;这导致一些用心打磨产品的小品牌被埋没&#xff0c;即使产品再好&#xff0c;也无人问津。但随着互…...

    2024/5/1 6:48:25
  18. Atcoder arc_105 D.Let‘s play Nim(博弈)

    题意&#xff1a;给定你n个背包还有n个盘子&#xff0c;然后n个背包里第i个背包内放有a[i]个硬币&#xff0c;然后起初n个盘子都是空的&#xff0c;然后你可以进行的操作是&#xff0c;每一次选择一个背包然后将背包内所有的硬币放到一个盘子中&#xff0c;这个盘子可空可不空。…...

    2024/4/18 8:58:44
  19. MyBatisPlus-狂神(1. 简介)学习笔记

    文章目录1. 简介2. 快速入门1. 简介 是什么 MyBatis 本来就是简化 JDBC 操作的&#xff0c;然后MyBatisPlus是用来简化 MyBatis的。 为什么要学习它呢 MyBatisPlus可以节省我们大量工作时间&#xff0c;所有的CRUD代码它都可以自动化完成&#xff01; 官网 &#xff1a; http…...

    2024/4/18 7:16:31
  20. 一文读懂zookeeper--万字长文肝就完了

    1. zookeeper在分布式集群的作用 1.1&#xff0c;数据发布与订阅&#xff08;配置中心&#xff09; 发布与订阅模型&#xff0c;即所谓的配置中心&#xff0c;顾名思义就是讲发布者将数据发布到zk节点上&#xff0c;共订阅者动态获取数据&#xff0c;实现配置的集中式管理和动…...

    2024/4/6 8:28:26

最新文章

  1. 数据库课程设计《基于Spring Boot + MyBatis + MySQL 实现Java医院药品管理系统》+源代码

    文章目录 源代码下载地址项目介绍项目功能 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目功能 库存管理 登记入库的药品。 登记出库的药品。 每日检查库存下限&#xff0c;报警。 每日检查过期的药品&#xff0c;报警并做退回销毁处理。 对有问题…...

    2024/5/10 6:20:43
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/9 21:23:04
  3. mac安装nvm

    一、前景提示 1、保证自己的mac电脑上没安装node环境 2、保证自己的电脑上有安装git&#xff0c;不然下载nvm时会报错。git下载可以参考&#xff1a; 1&#xff09;佛系安装&#xff1a;通过提示下载 XCode 2&#xff09;brem安装 3&#xff09;终极大法&#xff1a;git官网下…...

    2024/5/7 23:35:01
  4. Java深度优先搜索DFS(含面试大厂题和源码)

    深度优先搜索&#xff08;Depth-First Search&#xff0c;简称DFS&#xff09;是一种用于遍历或搜索树或图的算法。DFS 通过沿着树的深度来遍历节点&#xff0c;尽可能深地搜索树的分支。当节点v的所在边都已被探寻过&#xff0c;搜索将回溯到发现节点v的那条边的起始节点。这个…...

    2024/5/10 0:59:45
  5. 【蓝桥杯嵌入式】13届程序题刷题记录及反思

    一、题目分析 考察内容&#xff1a; led按键&#xff08;短按&#xff09;PWM输出&#xff08;PA1&#xff09;串口接收lcd显示 根据PWM输出占空比调节&#xff0c;高频与低频切换 串口接收&#xff08;指令解析&#xff09;【中断接收】 2个显示界面 led灯闪烁定时器 二…...

    2024/5/10 0:11:26
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/10 1:36:26
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/9 7:40:42
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/9 2:44:26
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/10 2:07:45
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/9 3:15:57
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/9 5:40:03
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/9 7:40:40
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/10 2:07:43
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/10 2:07:43
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/9 4:12:16
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/9 7:40:35
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/9 19:47:07
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/9 7:40:34
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/10 2:07:41
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/9 5:02:59
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/9 4:31:45
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/9 16:54:42
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/10 1:31:37
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/9 6:36:49
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/9 4:33:29
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57