蓝牙初始化时esp_bt_controller_mem_release()函数的理解

Moderator: ESP_ZT

gezhia
Posts: 38
Joined: Thu Nov 24, 2022 10:45 am

蓝牙初始化时esp_bt_controller_mem_release()函数的理解

Postby gezhia » Mon Jan 30, 2023 4:18 am

根据Blufi例程里的代码,esp_bt_controller_mem_release release the controller memory as per the mode。如果选用BLE模式就要在初始化之前先释放CLASSIC模式的内存,这个方式逻辑上有点不好理解。都还未被初始化,何须来释放?如果是用BLE模式,来初始化BLE内存是否更合理?

Code: Select all

void app_main(void)
{
    esp_err_t ret;

    // Initialize NVS
    ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK( ret );

    initialise_wifi();

    ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));

    esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
    ret = esp_bt_controller_init(&bt_cfg);
    if (ret) {
        BLUFI_ERROR("%s initialize bt controller failed: %s\n", __func__, esp_err_to_name(ret));
    }

    ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
    if (ret) {
        BLUFI_ERROR("%s enable bt controller failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }

    ret = esp_blufi_host_and_cb_init(&example_callbacks);
    if (ret) {
        BLUFI_ERROR("%s initialise failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }

    BLUFI_INFO("BLUFI VERSION %04x\n", esp_blufi_get_version());
}

ESP_ZB2
Posts: 21
Joined: Wed Dec 28, 2022 12:33 pm

Re: 蓝牙初始化时esp_bt_controller_mem_release()函数的理解

Postby ESP_ZB2 » Mon Jan 30, 2023 9:51 am

  1. 1、如果选用BLE模式就要在初始化之前先释放CLASSIC模式的内存。是因为在配置BLE之前会调用esp_bt_controller_init()函数来初始化bt的协议栈,而我们针对bt的初始化用的的内存空间是固定的,那么在调用初始化bt之前先把CLASSIC部分会用到的内存给释放掉,再在初始化bt的时候,初始化函数就会发现CLASSIC这部分的内存被释放掉了,也就不会初始化对应的内容;但是如果在初始化函数之后再去释放CLASSIC对应内存的时候,当然就会发生内存踩踏事件(esp_bt_controller_init()这个函数并不知道你要用BLE还是CLASSIC)。
  2. 2、你说的用BLE模式来初始化BLE内存,其实就相当于上面初始化过程的一个封装,其实你也可以在此基础上自己去再做一层封装 :D

gezhia
Posts: 38
Joined: Thu Nov 24, 2022 10:45 am

Re: 蓝牙初始化时esp_bt_controller_mem_release()函数的理解

Postby gezhia » Tue Jan 31, 2023 2:11 am

明白,谢谢!

另外,根据书本讲解,在配置blufi的时候复制了例程中的源码,并在menuconfig里开启了蓝牙,结果编译的时候如下提示,不知道是什么原因?

Code: Select all

c:/espressif/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: esp-idf/main/libmain.a(blufi_init.c.obj):(.literal.esp_blufi_host_and_cb_init+0x10): undefined reference to `esp_blufi_register_callbacks'
c:/espressif/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: esp-idf/main/libmain.a(blufi_init.c.obj): in function `esp_blufi_gap_register_callback':
D:/Project/OB-2008/software/main/ESP32-2023-1-15/blink/main/blufi_init.c:39: undefined reference to `esp_blufi_profile_init'
c:/espressif/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: esp-idf/main/libmain.a(blufi_init.c.obj): in function `esp_blufi_host_and_cb_init':
D:/Project/OB-2008/software/main/ESP32-2023-1-15/blink/main/blufi_init.c:62: undefined reference to `esp_blufi_register_callbacks'        
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

ESP_ZB2
Posts: 21
Joined: Wed Dec 28, 2022 12:33 pm

Re: 蓝牙初始化时esp_bt_controller_mem_release()函数的理解

Postby ESP_ZB2 » Tue Jan 31, 2023 11:25 am

  1. 请提供完整的log,这个log信息太少,无法准确定位你的问题

gezhia
Posts: 38
Joined: Thu Nov 24, 2022 10:45 am

Re: 蓝牙初始化时esp_bt_controller_mem_release()函数的理解

Postby gezhia » Tue Jan 31, 2023 12:12 pm

已经解决,通过menuconfig里修改参数就可以编译成功了。

现在有个疑问:复制例程里的代码,WiFi没有通过menuconfig进行配置,只是进行代码调用就能完成功能配置。而蓝牙却需要用menuconfig做额外的配置。这个时候会搞不清方向,是否有官方的详细说明来指导menuconfig的使用?

Who is online

Users browsing this forum: No registered users and 22 guests