ESP32 LOG库使用

ESP32 log库 官方文档

一、printf是不可重入函数

printf不能在中断中被调用的原因是它是一个不可重入函数,而在中断中要避免调用不可重入函数,首先我们先说说什么是不可重入函数。

简单说来,区分一个函数是否可重入就是看这个函数能否在未返回的时候再次被调用。而造成一个函数不可重入的原因往往是使用了全局变量,如果一个函数未返回再执行一次会导致对全局变量的操作是不安全的。就例如我们常用的printf、malloc、free都是不可重入的函数,printf会引用全局变量stdout,malloc,free会引用全局的内存分配表,在多线程的环境下,如果没有很好的处理数据保护和互斥访问,就会发生错误。

二、ESP_LOGx日志

日志记录库提供了两种设置日志详细程度的方法:

  • 在编译时:在menuconfig中,使用选项设置详细程度CONFIG_LOG_DEFAULT_LEVEL。详细程度高于的所有日志记录语句CONFIG_LOG_DEFAULT_LEVEL 将被预处理器删除。
#ifndef LOG_LOCAL_LEVEL
#ifndef BOOTLOADER_BUILD
#define LOG_LOCAL_LEVEL  CONFIG_LOG_DEFAULT_LEVEL
#else
#define LOG_LOCAL_LEVEL  CONFIG_LOG_BOOTLOADER_LEVEL
#endif
#endif

#define ESP_LOG_LEVEL_LOCAL(level, tag, format, ...) do {               \
        if ( LOG_LOCAL_LEVEL >= level ) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \
    } while(0)

  • 在运行时:详细级别低于的所有日志CONFIG_LOG_DEFAULT_LEVEL默认情况下启用。该功能esp_log_level_set()可用于按模块设置日志记录级别。模块由其标签标识,这些标签是可读的ASCII零终止字符串。
该功能esp_log_level_set()无法将日志记录级别设置为高于CONFIG_LOG_DEFAULT_LEVEL。要在编译时增加特定文件的日志级别,请使用宏LOG_LOCAL_LEVEL

有以下详细级别:

  • ESP_LOGE -错误(最低)
  • ESP_LOGW - 警告
  • ESP_LOGI -信息
  • ESP_LOGD -调试
  • ESP_LOGV -详细(最高)

此外,ESP_EARLY_LOGx每个宏都有相应的版本,例如ESP_EARLY_LOGE。在初始化堆分配器和syscalls之前,只能在早期启动代码中显式使用这些版本。普通ESP_LOGx宏也可以在编译引导加载程序时使用,但是它们将退回到与ESP_EARLY_LOGx宏相同的实现方式。

考虑到线程安全,在FreeRTOS中尽量使用ESP_LOGx来输出调试信息和打印消息。

四、如何使用这个库

4.1 打印信息

在每个使用日志记录功能的C文件中,定义TAG变量,如下所示:

static const char* TAG = "MyModule";

然后使用日志记录宏之一生成输出,例如:

uint16_t ap_count = 0;
ESP_LOGI(TAG, "Total APs scanned = %u", ap_count);

4.2 更改详细级别

要在文件或组件范围内覆盖默认的详细级别,请定义LOG_LOCAL_LEVEL宏。

在文件范围内,在包含之前定义它esp_log.h,例如:

#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE
#include "esp_log.h"

在组件范围内,在组件makefile中定义它:

CFLAGS += -D LOG_LOCAL_LEVEL=ESP_LOG_DEBUG

要在运行时配置每个模块的日志记录输出,请esp_log_level_set()按以下方式向函数添加调用:

esp_log_level_set("*", ESP_LOG_ERROR);        // set all components to ERROR level
esp_log_level_set("wifi", ESP_LOG_WARN);      // enable WARN logs from WiFi stack
esp_log_level_set("dhcpc", ESP_LOG_INFO);     // enable INFO logs from DHCP client

4.3 通过JTAG登录到主机

默认情况下,日志记录库使用类似于vprintf的函数将格式化的输出写入专用UART。通过调用一个简单的API,所有日志输出都可以路由到JTAG,从而使日志记录速度提高了几倍。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP32是一种低成本、低功耗的微控制器,它内置了WiFi和蓝牙模块,可以轻松地连接到互联网或其他设备。 要使用ESP32连接WiFi网络,您可以使用ESP-IDF(ESP32开发框架)提供的WiFi。以下是基本的步骤: 1. 在ESP-IDF中配置WiFi连接参数,例如SSID和密码。 2. 初始化WiFi连接并启用WiFi。 3. 使用WiFi管理器扫描可用的WiFi网络。 4. 连接到您选择的WiFi网络。 5. 确认连接成功并开始使用网络。 以下是一个简单的ESP-IDF程序,演示了如何连接到WiFi网络: ``` #include <string.h> #include <stdlib.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_wifi.h" #include "esp_event.h" #include "esp_log.h" #define WIFI_SSID "your_wifi_ssid" #define WIFI_PASS "your_wifi_password" static const char *TAG = "wifi station"; static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { if (event_id == WIFI_EVENT_STA_START) { esp_wifi_connect(); } else if (event_id == WIFI_EVENT_STA_DISCONNECTED) { esp_wifi_connect(); ESP_LOGI(TAG,"retry to connect to the AP"); } else if (event_id == WIFI_EVENT_STA_CONNECTED) { ESP_LOGI(TAG,"connected to AP"); } } void wifi_init_sta(void) { tcpip_adapter_init(); ESP_ERROR_CHECK(esp_event_loop_create_default()); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); esp_event_handler_instance_t instance_any_id; esp_event_handler_instance_t instance_got_ip; esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL, &instance_any_id); esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL, &instance_got_ip); wifi_config_t wifi_config = { .sta = { .ssid = WIFI_SSID, .password = WIFI_PASS, .threshold.authmode = WIFI_AUTH_WPA2_PSK, .pmf_cfg = { .capable = true, .required = false }, }, }; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); ESP_LOGI(TAG, "wifi_init_sta finished."); } void app_main() { ESP_ERROR_CHECK(nvs_flash_init()); wifi_init_sta(); } ``` 请注意,此示例仅适用于连接到使用WPA2密码保护的WiFi网络。如果您的网络使用不同的安全协议或没有密码,请相应地更改WiFi配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值