目录
- Esp32 启动流程
- 外部flash
- 外部psram
- 性能查看
A:内存
B:cpu使用率
1.Esp32 启动流程
在esp32上电运行过程中,固化在rom里面的程序会检查对应gpio状态,从而判断处于下载模式还是flash运行模式。
Flash启动:rom读取外置flash的地址(0x1000),加载并运行二级bootloader。Bootloader
一段独立的小程序,对芯片频率初始化,并读取spi配置信息,对flash运行模式以及频率进行配置,然后根据分区表定义,从对应的地址加载应用程序,运行对应的app固件。
app_main()是用户程序的入口,相当与其他系统的main(),在app_main之前,系统有一段初始化过程,大致分为以下三个过程:
第一阶段:rom中固化的一级引导程序将0x1000地址的bootloader加载到ram。
第二阶段:第二季引导程序加载分区表0x8000和0x10000主应用程序bootloader_start.c
第三阶段:主应用程序执行,此时启动第二个cpu和rtos程序调度。cpu_start.c
以hello_world为例:
0x8000 分区表
0x1000 二级引导程序
0x10000 主应用程序
2.外部flash
以hello_world为例 :
A.Flash_app_args 和 flash_bootloader_args 中flash_size 为2MB,使用了2MB. 外部falsh有8MB,只使用了2MB,更改sdkconfig。或者idf.py menuconfig 设置Falsh size 更改为8MB.
B.Hello_world分区表,对于flash的分区分size,可以增大;并且可以增加分区。
1-> 比如增加如下:
ESP-IDF Partition Table
Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x4000,
otadata, data, ota, 0xd000, 0x2000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
ota_0, app, ota_0, 0x110000, 1M,
ota_1, app, ota_1, 0x210000, 1M,
2-> 也可以增加文件系统的分区,比如:利用spiffs_api 进行数据存储。
C.组件分区表,也可以ifd.py menuconfig 在对应的工程增加自定义目录分区表。
3.外部psram
esp32提供了4m的片外spi ram存储器供用户使用,片外的ram被加载到内存映射中,在某些范围与片上ram使用相同。
配置片外ram:
A.集成片外ram到esp32内存映射
B.添加片外ram到堆内存分配器
C.调用malloc分配片外ram
D.允许.BSS段放到片外存储器
A: idf.py menuconfig -->Conponent config—>ESP32-specific---->Support for exteral,SPI-connected RAM---->spi ram access method.—>即集成片外ram到esp32内存映射选项。这是集成片外ram最基础的设置选项。在启动过程中,片外ram被映射到0x3f800000起始的数据地址空间,空间大小为4MB。应用程序可以通过手动创建该区域的指针,将数据放入片外存储器,并管理spi ram,协调buffer的使用,防止损坏。
B: idf.py menuconfig 相同配置方法,不同选项,选择"MAKE ram allocatable using heap_caps_malloc_malloc"。配置后,片外ram被映射到0x3f800000,并将这个区域添加到堆内存分配器,携带MALLOC_CAP_SPIRAM的标志。应用程序可以通过调用
heap_caps_malloc(size, MALLOC_CAP_SPIRAM、free从片外的存储器分配存储空间。
C:同B:选择“MAKE malocatable using malloc as well”,并设置分配空间大小的阈值,控制分配结果。调用malloc分配片外ram存储空间。阈值比如设置1024k,小于1024k使用内部ram分配,大于1024k使用片外ram存储器分配。
D: Idf.py menuconfig -------> …---->Allow .bss segment placed in external memory. 通过检查
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY 启用该选项,与上面三个选项互补影响。
可以用EXT_RAM_ATTR 用于任何静态声明,可以将附加数据从内部BSS段移到片外RAM. 也可以使用extarm_bss 将组件或者库放到片外ram中。
参考:
https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/external-ram.html
4.性能查看
A:内存
examples/system/console/components/cmd_system/cmd_system.c 159行
vTaskList(task_list_buffer);函数
B:cpu使用率s
vTaskGetRunTimeStats((char*)infoBuffer); 函数
printk("\r\n 任务名,运行计数 使用率");
printk("\r\n%s \r\n",infoBuffer);