ESP32原生开发——小智AI解析1(main.cc)

#include <esp_log.h>
#include <esp_err.h>
#include <nvs.h> //nvs储存区
#include <nvs_flash.h>
#include <driver/gpio.h>
#include <esp_event.h> //关于ESPIDF框架内ESP32的event库

#include "application.h"  //application库
#include "system_info.h"

#define TAG "main" //TAG,但是找不到应用方式
  • 头文件引入:包含 ESP-IDF 框架的核心组件(日志、错误处理、非易失存储、GPIO 驱动、事件循环)以及两个自定义模块。
  • TAG 定义:用于日志输出的标签。
extern "C" void app_main(void)
{
    // 初始化默认事件循环
    ESP_ERROR_CHECK(esp_event_loop_create_default());

extern "C":这是C++中的链接指示符,用于告诉编译器按照C语言的方式处理函数名。因为ESP-IDF(ESP32的官方开发框架)是用C语言编写的,所以需要使用 extern "C" 来确保C++编译器不会对函数名进行名称修饰(name mangling)。
app_main:这是ESP-IDF应用程序的入口函数,类似于C语言中的 main 函数。当系统启动时,app_main 会被自动调用。

    // Initialize the default event loop
    ESP_ERROR_CHECK(esp_event_loop_create_default());
  • ESP_ERROR_CHECK:这是一个宏,用于检查函数返回值是否为 ESP_OK。如果返回值不是 ESP_OK,则会打印错误信息并终止程序。
  • 类似assert

esp_event_loop_create_default后面的文章中会重新写明

    // Initialize NVS flash for WiFi configuration
    esp_err_t ret = nvs_flash_init(); //初始化NVS(Non-Volatile Storage)闪存。NVS用于存储持久化数据,如WiFi配置、设备配置等。
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { //这两个错误码表示NVS闪存可能已损坏或版本不兼容。在这种情况下,代码会擦除NVS闪存并重新初始化。
        ESP_LOGW(TAG, "Erasing NVS flash to fix corruption"); //打印日志
        ESP_ERROR_CHECK(nvs_flash_erase()); //和上面一样 
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret); //再次检查NVS闪存初始化是否成功

再次使用到了ESP_ERROR_CHECK

这部分代码似乎可以移植到其它项目中使用

    // Launch the application
    Application::GetInstance().Start();
}
  • Application::GetInstance().Start():这行代码调用了一个单例类 Application 的 Start 方法,启动应用程序的主要逻辑。GetInstance() 是单例模式的常见实现方式,确保只有一个 Application 实例。

这部分代码也会在后面的文章中继续解析

 

在某些文章中还有

while (true) {
    vTaskDelay(10000 / portTICK_PERIOD_MS);
    // SystemInfo::PrintRealTimeStats(pdMS_TO_TICKS(1000));
    int free_sram = heap_caps_get_free_size(MALLOC_CAP_INTERNAL);
    int min_free_sram = heap_caps_get_minimum_free_size(MALLOC_CAP_INTERNAL);
    ESP_LOGI(TAG, "Free internal: %u minimal internal: %u", free_sram, min_free_sram);
}
定时打印CPU与内存占用信息

while (true):这是一个无限循环,用于定期执行某些任务。
vTaskDelay(10000 / portTICK_PERIOD_MS):让当前任务(Task)延迟10秒。portTICK_PERIOD_MS 是FreeRTOS中表示每个tick的毫秒数。
heap_caps_get_free_size(MALLOC_CAP_INTERNAL):获取当前内部SRAM(静态随机存取存储器)的可用内存大小。
heap_caps_get_minimum_free_size(MALLOC_CAP_INTERNAL):获取内部SRAM的最小可用内存大小(即系统运行过程中内存使用的最低点)。
ESP_LOGI(TAG, "Free internal: %u minimal internal: %u", free_sram, min_free_sram):打印日志,显示当前和最小可用内存大小。

 

posted @ 2025-05-24 00:27  mcwhirr  阅读(321)  评论(0)    收藏  举报