我是嵌入式学习菌,一名热爱学习的嵌入式工程师
关注我,一起变得更加优秀!
1.事件循环函数:
这个函数是ESP-IDF框架中的esp_event_loop_create_default,核心作用是创建一个默认的系统事件循环,用于管理ESP32的系统事件(比如WiFi、蓝牙、外设等模块的事件)。
举个实际场景:WiFi连接状态监听
比如你要开发ESP32的WiFiStation功能,需要监听“WiFi连接成功”“WiFi断开”等事件,就必须依赖这个默认事件循环:
步骤1:先调用esp_event_loop_create_default创建循环(你的代码里需要先执行这个函数,否则事件无法分发)
//1.创建默认事件循环(就是你截图里的这个函数)esp_err_tret=esp_event_loop_create_default();if(ret!=ESP_OK){ESP_LOGE("MAIN","创建事件循环失败:%s",esp_err_to_name(ret));return;}步骤2:注册WiFi事件的回调函数//2.定义一个“WiFi连接成功”的回调函数staticvoidon_wifi_connected(void*arg,esp_event_base_tevent_base,int32_tevent_id,void*event_data){ESP_LOGI("WIFI","成功连接到路由器!");//这里可以写连接成功后的逻辑(比如启动网络请求)}//3.把回调函数注册到默认事件循环中esp_event_handler_register(WIFI_EVENT,WIFI_EVENT_STA_CONNECTED,on_wifi_connected,NULL);步骤3:初始化并启动WiFi//4.初始化WiFi为Station模式wifi_init_config_tcfg=WIFI_INIT_CONFIG_DEFAULT();esp_wifi_init(&cfg);//配置WiFi参数(SSID、密码)并启动esp_wifi_set_mode(WIFI_MODE_STA);wifi_config_twifi_cfg={.sta={.ssid="你的WiFi名称",.password="你的WiFi密码"}};esp_wifi_set_config(WIFI_IF_STA,&wifi_cfg);esp_wifi_start();
这个函数在例子中的作用
当WiFi成功连接路由器时,ESP32的WiFi模块会向“默认事件循环”发送一个WIFI_EVENT_STA_CONNECTED事件;而你注册的on_wifi_connected回调函数,正是通过这个默认事件循环接收到事件后被触发执行的。
2.挂载SPIFFS文件系统
在ESP32中基于ESP-IDF框架初始化、挂载SPIFFS文件系统(SPIFlashFileSystem),并完成文件系统完整性检查、容量信息获取,确保SPIFFS可用(SPIFFS是ESP32专为SPIFlash设计的轻量级文件系统,适合存储小文件、配置、日志等)。
ESP-IDF编译后程序自身的内存/Flash占用统计,它和SPIFFS文件系统的关系是:SPIFFS占用的是Flash的独立分区,不在这个表格的统计范围内。
SPIFFS文件系统存储在ESP32的SPIFlash(闪存)中,而Flash是非易失性存储介质,所以只要正常完成文件写入(比如调用fclose确保数据刷入Flash),SPIFFS里的内容掉电后不会丢失。
下面分步骤拆解代码的具体作用,结合每一行逻辑说明:
1.配置SPIFFS挂载参数esp_vfs_spiffs_conf_tconf={.base_path="/spiffs",//SPIFFS挂载到VFS的路径(后续访问文件用/spiffs/xxx).partition_label=NULL,//使用分区表中第一个标记为SPIFFS的分区(留空默认匹配).max_files=10,//允许同时打开的最大文件数(限制资源占用).format_if_mount_failed=true,//挂载失败时自动格式化(首次使用/文件系统损坏时生效)};
这一步是定义SPIFFS的挂载规则:比如后续要读写/spiffs/config.json文件,就是通过.base_path指定的路径访问;.format_if_mount_failed是关键容错参数,首次烧录固件后SPIFFS分区为空,挂载会失败,开启这个参数会自动格式化分区,让挂载成功。
2.注册并挂载SPIFFS到VFS
err=esp_vfs_spiffs_register(&conf);if(err!=ESP_OK){ESP_LOGE("SPIFFS","ERROR");}
esp_vfs_spiffs_register是核心函数:
把SPIFFS文件系统注册到ESP-IDF的VFS(虚拟文件系统)中,让ESP32可以用标准C文件操作函数(如fopen/fwrite/fread)访问SPIFFS;
若返回非ESP_OK(比如分区不存在、Flash损坏),打印错误日志。
3.检查SPIFFS文件系统完整性
err=esp_spiffs_check(conf.partition_label);if(err!=ESP_OK){ESP_LOGE("SPIFFS","spiffscheckerror");}else{ESP_LOGI("SPIFFS","spiffschecksuccess");
esp_spiffs_check用于校验SPIFFS分区的完整性:
检查文件系统的元数据、目录结构是否损坏;
若损坏则打印错误(需手动处理或重新格式化),正常则打印成功日志。
4.获取SPIFFS容量信息
size_ttotal=0,used=0;err=esp_spiffs_info(conf.partition_label,&total,&used);if(err==ESP_OK){ESP_LOGI("SPIFFS","total:%d,used:%d",total,used);}
esp_spiffs_info读取SPIFFS分区的总容量和已用容量:
比如打印total:1048576,used:123456,表示SPIFFS总大小1MB,已使用约120KB;
方便开发者监控文件系统占用情况,避免存储溢出。
整体作用总结+实际应用举例
这段代码是ESP32使用SPIFFS的“初始化模板”,完成后就能像操作普通文件一样读写SPIFFS里的文件,比如:
//挂载成功后,向/spiffs/test.txt写入内容FILE*f=fopen("/spiffs/test.txt","w");if(f){fprintf(f,"HelloSPIFFS!");fclose(f);ESP_LOGI("SPIFFS","文件写入成功");}//读取/spiffs/test.txt的内容charbuf[32]={0};f=fopen("/spiffs/test.txt","r");if(f){fread(buf,1,sizeof(buf)-1,f);fclose(f);ESP_LOGI("SPIFFS","读取到内容:%s",buf);//输出:HelloSPIFFS!}
小编也为零基础小白整理了一份嵌入式学习资料大全。
思维导图、C语言学习、单片机、学习笔记、实例项目……你需要的知识都在这儿!