- 2024-11-22
-
回复了主题帖:
STlink下载时出现Invalid ROM Table
用openocd或pyocd试试
- 2024-06-20
-
回复了主题帖:
[FireBeetle 2 ESP32C6开发板] uart2tcp透传工具
haiwangxing2016 发表于 2024-6-17 15:21
不知道这个 uart2tcp透传工具 有没测试通过?因为esp32c6在Socket是有Bug的
你所说的esp32c6 socket bug是什么表现?
- 2024-06-02
-
回复了主题帖:
[FireBeetle 2 ESP32C6开发板] uart2tcp透传工具
样例工程供参考,但强烈建议按帖子的方法去试一试,看看能否自己搭积木搭出来,而不是直接用附件的工程,成就感是不一样的
- 2024-05-16
-
回复了主题帖:
[FireBeetle 2 ESP32C6开发板] uart2tcp透传工具
qzc飘曳 发表于 2024-5-16 12:13
tcp_server例子地址在哪里查看数据啊?
tcp_server样例也是“nc 192.168.1.88 3333”命令
-
发表了主题帖:
[FireBeetle 2 ESP32C6开发板] uart2tcp透传工具
今天来设计和实现一个叫uart2tcp的透传小工具,名字里的"2"是"to"的意思。
uart2tcp是什么
此工具把esp32c6开发板上的uart传输都透传到tcp server上,板子会接入环境中的wifi AP,其它设备如PC机通过网络连接这个tcp server,读写socket就相当于读写esp32c6的uart。
为什么做uart2tcp
或者说应用场景是什么。现阶段串口是极佳的调试工具比如看log、输入命令等等,所以几乎每块板子都有串口针脚或者可以焊接针脚,然后和电脑的usb转串口连接起来。但有的场景接电脑并不方便,比如目标设备是移动机器人、扫地机,或者处于封闭空间或服务器机房等等,这时候这个工具就派上用场了,只要测试场所有wifi服务,工程师可以安安静静地坐在自己座位上调试,和把目标板放在身边一样方便。
怎么做uart2tcp
esp idf例子这么全,自己看懂后手搓一个,有句话怎么说来着自己动手丰衣足食。
先看看我们需要做哪些
第一,wifi连接AP;第二,实现一个tcp server;第三,uart读写。巧的是这三块esp idf都有例子代码,分别是examples/common_components/protocol_examples_common, examples/protocols/sockets/tcp_server/与examples/peripherals/uart/uart_events/。注意uart示例目录examples/peripherals/uart中有好几个,个人翻来覆去挑了挑还是觉得uart_events合适。
选谁为主模板
上面这三个各自独立,有自己的task和main函数,但以谁为主模板修改呢?笔者选择examples/protocols/sockets/tcp_server/,它和wifi示例examples/common_components/protocol_examples_common联系比较紧密,uart更独立一些,以tcp_server为主模板修改会更少。那么拷贝一份吧做工程模板吧:
cp -a examples/protocols/sockets/tcp_server/ examples/uart2tcp
mv examples/uart2tcp/main/tcp_server.c examples/uart2tcp/main/uart2tcp.c
并修改下examples/uart2tcp/main/CMakeLists.txt为
idf_component_register(SRCS "uart2tcp.c"
INCLUDE_DIRS ".")
代码设计和实现
模板里的uart2tcp.c只创建了一个任务,就是监听并接收tcp连接,连接建立以后然后从客户端收数据再写回。我们要把它改成从客户端收数据再往uart写入,这里展示下核心代码:
static void do_retransmit(const int tsock)
{
int len;
char rx_buffer[128];
do {
len = recv(tsock, rx_buffer, sizeof(rx_buffer), 0);
if (len < 0) {
ESP_LOGE(TAG, "Error occurred during receiving: errno %d", errno);
} else if (len == 0) {
ESP_LOGW(TAG, "Connection closed");
} else {
//ESP_LOGI(TAG, "Received %d bytes", len);
uart_write_bytes(EX_UART_NUM, rx_buffer, len);
}
} while (len > 0);
}
到此已经打通tcp socket收数据后写入uart的通路,还缺另一个方向的通路即从uart读并写入socket。创建一个FreeRTOS任务来完成这个通路。此任务主要就是监听uart什么时候有数据,监听uart通过uart event做到,examples/peripherals/uart/uart_events示例可以搬过来。一旦uart有数据调用uart_read_bytes()函数读取后再调用send()函数写入socket,关键代码片段如下:
if(xQueueReceive(uart0_queue, (void *)&event, (TickType_t)portMAX_DELAY))
{
//ESP_LOGI(TAG, "uart[%d] event:", EX_UART_NUM);
switch(event.type) {
//Event of UART receving data
case UART_DATA:
//ESP_LOGI(TAG, "[UART DATA]: %d", event.size);
uart_read_bytes(EX_UART_NUM, data, event.size, portMAX_DELAY);
to_write = event.size;
while (to_write > 0) {
int written = send(sock, data + (event.size - to_write), to_write, 0);
if (written < 0) {
ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno);
}
to_write -= written;
}
break;
//Event of HW FIFO overflow detected
其余uart event比如UART_FIFO_OVF, UART_BUFFER_FULL等等可以沿用examples/peripherals/uart/uart_events中的代码。
处理好初始化uart/wifi/tcp_server等小事
到此coding任务基本完成了,剩下即使uart、wifi和tcp servert初始化。因为沿用examples/protocols/sockets/tcp_server/为主模板,wifi和tcp server相应初始化代码可以沿用,我们需要把examples/peripherals/uart/uart_events中uart初始化代码搬运过来:
static void uart_init(void)
{
uart_config_t uart_config = {
.baud_rate = 115200,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
.source_clk = UART_SCLK_DEFAULT,
};
//Install UART driver, and get the queue.
uart_driver_install(EX_UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart0_queue, 0);
uart_param_config(EX_UART_NUM, &uart_config);
uart_set_pin(EX_UART_NUM, UART_TXD, UART_RXD, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}
对照原理图选合适的针脚作为uart的RX和TX
FireBeetle 2 ESP32C6开发板可用IO16与IO17两根引脚,并选用UART0。综合以上信息写入宏定义 :
#define EX_UART_NUM UART_NUM_0
#define UART_TXD GPIO_NUM_16
#define UART_RXD GPIO_NUM_17
编译、烧录和测试
cd examples/uart2tcp
idf.py set-target esp32c6
idf.py menuconfig
menuconfig进如下界面
设置一下SSID和密码:
当然也可以从stdin动态输入,对于esp32c6就是由usb那个cdc串口输入
哪种方便自己选择
使用示例
连接FireBeetle 2 ESP32C6开发板的IO16、IO17和目标板串口,别忘记GND也要接上。假设esp32c6的ip地址为192.168.1.88 (获得方式:usb cdc串口会打印,也可通过wifi ap查询), 那么如下命令就可以和目标板串口交互了,和用串口助手、minicom、putty基本一样
nc 192.168.1.88 3333
当然也可以用socat把套接字转成pty,然后用串口终端工具如putty、minicom等打开pty用,最方便的还是瑞士军刀nc。
一些参数调优
个人使用经验,uart的rx和tx buffer可能要按需调一调,就是uart初始化中下面这行代码的参数可以调一调,其它没什么需要调的。目前代码RX和TX都设成了2KB buffer,经测试基本上高波特率都可以满足并无丢数据现象
uart_driver_install(EX_UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart0_queue, 0);
未来可以提升的地方
1.串口的参数设定如波特率目前hardcoding的,将来能否再开一个tcp端口动态接收命令并处理
2.esp32c6板子的ip地址通知: wifi连上后usb cdc那个串口打印了AP分配的地址,将来能否利用mDNS服务免除寻找ip地址的过程
总结
本文先提出uart2tcp这个小工具的由来,然后把整个编程任务分成三个小任务,再寻找esp idf的对应示例,学习这三部分示例代码后,选择esp idf的tcp_server例子为主模板,然后通过类似搭乐高积木一样把它们综合起来手搓完成了工具开发任务,怎么样你学会了吗?
- 2024-05-05
-
回复了主题帖:
[FireBeetle 2 ESP32C6开发板] SPI测试
lugl4313820 发表于 2024-5-4 20:42
相比poll方式速度下降了26.6%。阻塞式还要快一点吗?
poll方式更快,esp-idf官方文档说过poll方式能减少上下文切换。实际上这个道理和linux中的NAPI原理是一致的
- 2024-05-04
-
回复了主题帖:
[FireBeetle 2 ESP32C6开发板] SPI测试
对于spi0和spi1的使用,这个链接里的回答非常清楚:https://github.com/espressif/esp-idf/issues/11663
Here're few ways to access the Flash:
By default most of the ESP-IDF program is placed in the Flash. Accessing code placed in Flash is done by hardware (SPI0).
And we provide the ESP FLASH driver for you to access the Flash for other purpose (e.g. storage). This is via SPI1.
We provide SPI FLASH MMAP driver and MMU MMAP driver for you to access (via SPI0, e.g. by a pointer) those you write to the Flash via ESP FLASH driver.
-
发表了主题帖:
[FireBeetle 2 ESP32C6开发板] SPI测试
本帖最后由 xhackerustc 于 2024-5-4 17:57 编辑
esp32c6集成了3个SPI控制器:SPI0, SPI1和通用SPI2。其中SPI0与SPI1合称MSPI主要芯片内部使用以访问外部的flash和psram(看esp32c6的datasheet框图也会发现有个有意思的地方:SPI0和SPI1合用一套spi信号,之间通过一个总线仲裁器,另外SPI0接了cache,猜测cache硬件操作SPI0,而esptool、idf中的代码读写flash是操作的SPI1),通用SPI2可当通用SPI控制器来使用。通用SPI2支持1线、2线、4线等spi模式,支持DMA传输,最高时钟频率80MHZ,时钟极性和相位可配置。笔者有一个8MB的PSRAM模块,这次就以它来测试下ESP32C6的通用SPI2。不过这一次idf没现成代码,需要手搓一个操作手里这个PSRAM的代码,但是可以照葫芦画瓢,在idf的spi例子上(examples/peripherals/spi_master/hd_eeprom/)改。
io mux与GPIO交换矩阵
esp32c6 datasheet说明通过iomux与GPIO交换矩阵,信号可以接到任意针脚,但是对于高速信号,可仅仅经由iomux而"旁路GPIO 交换矩阵以实现更好的高频数字特性”,是以一定的针脚灵活性换取了更好的高频数字特性。经阅读datasheet第7.12章节IO MUX 管脚功能列表中的表 73. IO MUX 管脚功能, 笔者想直接经由iomux的FSPID, FSPICLK, FSPIQ以及FSPICS2这四个信号, 对比FireBettle 2原理图,这次笔者不再遵循板子丝印的针脚安排,而是使用如下针脚映射:
- MOSI: MTDO
- MISO: GPIO2
- CS: SDIO_CMD
- SCLK: MTCK
esp idf中的spi api简介
idf中spi使用基本上这个套路:调用spi_bus_initialize()初始化spi host,再调用spi_bus_add_device(),初始化流程完成。然后每一次spi传输都是通过spi_transaction_t或spi_transaction_ext_t结构体控制的,其中后者用于地址或cmd长度会变,或者需要传输dummy bits的场景。spi传输的API比较灵活,选用哪个结构体取决于spi传输需要。设置完spi传输结构体后调用spi_device_polling_transmit()或spi_device_tranmit(),前者顾名思义不用中断使用poll方式,延迟和spi本身的传输性能比较好,因为没有context切换开销;后者整体系统cpu利用占优,选用哪个API也是灵活机变根据需要选择。
psram操作原则
任何操作都是发起一次spi传输,每次发spi传输前拉低CS信号,结束后拉高CS信号。
psram的初始化
根据笔者这款psram模块的datasheet,上电后自动初始化进入standby模式,不过笔者初始化后还是发起了RESET_EN和RESET命令,发命令的函数如下所示:
static esp_err_t psram_send_cmd(spi_device_handle_t h, const uint8_t cmd)
{
spi_transaction_ext_t t = { };
t.base.flags = SPI_TRANS_VARIABLE_ADDR;
t.base.cmd = cmd;
t.base.length = 0;
t.command_bits = 8U;
t.address_bits = 0;
return spi_device_polling_transmit(h, (spi_transaction_t*)&t);
}
psram的读取
int psram_read(uint32_t addr, void *buf, int len)
{
esp_err_t ret;
spi_transaction_ext_t t = { };
t.base.cmd = CMD_FAST_READ;
t.base.addr = addr;
t.base.rx_buffer = buf;
t.base.length = len * 8;
t.base.flags = SPI_TRANS_VARIABLE_DUMMY;
t.dummy_bits = 8;
gpio_set_level(GPIO_CS, 0);
ret = spi_device_polling_transmit(handle, (spi_transaction_t*)&t);
gpio_set_level(GPIO_CS, 1);
if (ret != ESP_OK) {
printf("psram_read failed %lx %d\n", addr, len);
return -1;
}
return len;
}
psram的写入
int psram_write(uint32_t addr, void *buf, int len)
{
esp_err_t ret;
spi_transaction_t t = {};
t.cmd = CMD_WRITE;
t.addr = addr;
t.tx_buffer = buf;
t.length = len * 8;
gpio_set_level(GPIO_CS, 0);
ret = spi_device_polling_transmit(handle, &t);
gpio_set_level(GPIO_CS, 1);
if (ret != ESP_OK) {
printf("psram_write failed %lx %d\n", addr, len);
return -1;
}
return len;
}
综合测试代码
void app_main(void)
{
int i;
uint64_t t1;
uint8_t testbuf[64];
usleep(2000000);
if (psram_init())
printf("failed to init psram");
memset(testbuf, 0x5a, sizeof(testbuf));
t1 = esp_timer_get_time();
for (i = 0; i < 10000; ++i) {
psram_write(i * 64, &testbuf, 64);
}
t1 = esp_timer_get_time() - t1;
t1 /= 1000;
printf("PSRAM write speed: %lld B/s.\n", 64 * 10000 * 1000 / t1);
fflush(stdout);
t1 = esp_timer_get_time();
for (i = 0; i < 10000; ++i) {
psram_read(i * 64, &testbuf, 64);
}
t1 = esp_timer_get_time() - t1;
t1 /= 1000;
printf("PSRAM read speed: %lld B/s.\n", 64 * 10000 * 1000 / t1);
fflush(stdout);
for (;;) {
printf("PSRAM test done\n");
usleep(1000000);
}
}
编译烧录和测试
可参见笔者前面的测评贴,这里不再赘述,测试结果如下:
I (2066) gpio: GPIO[18]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
spi_bus_initialize = 0
spi_bus_add_device = 0
PSRAM ID: 0d5d52d26fd0
PSRAM write speed: 3091787 B/s.
PSRAM read speed: 3004694 B/s.
SPI传输性能影响因素
据笔者测试,每次SPI传输数据大小和用不用poll方式影响比较大,其它因素影响比较小。实验如下:
1.将每次传输大小从64字节改成128字节,相比使用64字节传输大小,速度提升了38.2%
PSRAM write speed: 4723247 B/s.
PSRAM read speed: 4654545 B/s.
2.在此基础上,把传输方式改成非poll方式即spi_device_polling_transmit()改成spi_device_transmit(),传输大小仍然维持128字节,相比poll方式速度下降了26.6%
PSRAM write speed: 3137254 B/s.
PSRAM read speed: 3099273 B/s.
- 2024-05-03
-
回复了主题帖:
[FireBeetle 2 ESP32C6开发板] i2c_tools初尝试
lugl4313820 发表于 2024-5-3 19:24
i2c_tools初尝试,这个工具挺强呀!
i2c-tools这套工具很有用,通常i2c设备(比如一些sensor、PMIC等等)bring up时不写代码,用i2c-tools读写跑通基本功能后,最后才写完整代码的
-
发表了主题帖:
[FireBeetle 2 ESP32C6开发板] i2c_tools初尝试
本帖最后由 xhackerustc 于 2024-5-3 16:38 编辑
据esp32c6 datasheet,芯片有两个i2c控制器,即分别在主系统和低功耗系统各有一个 I2C 控制器。其中主系统中的i2c控制器既然可以做master又可以做slave,FIFO有32字节;低功耗系统中的i2c控制器只能当master使用,fifo缩减为16字节。除此以外是基本一样的,尤其对于软件编程来说区别并不大。此次i2c测评以主系统的i2c控制器为对象。
笔者惯例芯片/板子i2c bring up并不是一上来就写代码的,而是利用i2c-tools这套工具集先测试基本读写没问题后才写成代码。巧的是esp-idf也有类似工具(由此可以看出esp的软件生态确实做得不错)。
i2c_tools的配置
examples/peripherals/i2c/i2c_tools
idf.py set-target esp32c6
idf.py menuconfig
由FireBeetle 2板子原理图可知GPIO19和GPIO20可分别用作SDA和SCL引脚,不过也不是非要用GPIO19和GPIO20,因为对于像i2c这样的慢速设备,esp32c6可利用gpio交换矩阵把i2c的信号通过任意gpio引出,但是板子原理图相当于做了一次信号引脚分配,且引脚丝印印好就跟着用不费脑。笔者的配置如下图所示(注:i2c_tools也支持运行时通过i2cconfig命令改SDA和SCL引脚)
笔者还同时把store command history in flash禁用了没啥意义。
i2c_tools编译&烧录
idf.py build
esptool.py -p /dev/ttyACM0 -b 460800 --before default_reset --after hard_reset --chip esp32c6 --no-stub write_flash --flash_mode qio --flash_size 4MB --flash_freq 80m 0x10000 build/i2c_tools.bin
i2c_tools初尝试
测试用的是max30102的模块,用杜邦线把它VIN/SDA/SCL/GND引脚和板子对应引脚接好后,板子上电。
发现i2c_tools是个命令行,“help”命令把所有支持的命令参数都显示出来了
检测下看看能否探测到slave设备:
Nice在0x57探测到了一个i2c slave设备,0x57也确实是这个max30102模组的芯片地址。据max30102 datasheet,0xfe和0xff两个寄存器分别对应REV_ID和PARTID,是只读寄存器,读取看看
i2c slave读取成功!现在可以测试写了,根据max30102 datasheet,enable温度sensor再读取:
以上数据显示温度大概是0x17+0x0d*0.0625 = 23.8125摄氏度
- 2024-05-02
-
发表了主题帖:
[FireBeetle 2 ESP32C6开发板] SoftAP初尝试
本帖最后由 xhackerustc 于 2024-5-3 16:37 编辑
ESP32C6 datasheet对于802.11ax(所谓wifi6)明确提及支持仅非接入点工作模式 (20MHz-only non-AP mode),但对于802.11b/g/n没有这么说,所以猜测它在802.11b/g/n时可以当ap用。今天就来试试ESP32C6的softap功能。
softap配置
esp-idf做得真好啊,它的example非常全,这不softap也有,直接用了
cd examples/wifi/getting_started/softAP
idf.py set-target esp32c6
idf.py menuconfig
在menuconfig界面注意改下flash设置:qio和4MB;以及console output设为usb,可参见笔者第一篇测试贴[FireBeetle 2 ESP32C6开发板]linux下开发环境搭建,后续不再赘述。另配置下softap的ssid和密码(笔者配置的ssid是esp32c6),后面测试时其它wifi终端连接时要用,另密码必须不能少于8位,否则会跑起来后会ASSERT,ASSERT现场如下图所示
编译&烧录
idf.py build
esptool.py -p /dev/ttyACM0 --chip esp32c6 -b 460800 --before default_reset --after hard_reset write_flash --flash_mode qio --flash_size 4MB --flash_freq 80m 0x10000 build/wifi_softAP.bin
测试
为提升测试覆盖率,一共用了四台不同OS设备来测试:一台windows笔记本电脑,一台linux笔记本电脑,一部android手机,一部ipad平板电脑。首先这四个不同设备都能看到softap的ssid,其中linux笔记本电脑iw dev wlan0 scan结果如下:
但是只有windows笔记本电脑能连上softap,其它三设备都连不上,搜索后发现至少有人在linux下碰到同样问题Buildroot: wpa_supplicant cannot connect to ESP32 SoftAP,他用的应该和笔者一样esp-idf的master分支最新HEAD,巧的是笔者测试用linux笔记本电脑也是用wpa_supplicant, 后续可能去esp-idf发个issue来。windows笔记本电脑连上时,usb cdc串口的打印如图所示:
在windows笔记本电脑中查看wifi获得的ip地址确实就是192.168.4.2, 网关是192.168.4.1,ping网关也能ping通。
- 2024-05-01
-
回复了主题帖:
[FireBeetle 2 ESP32C6开发板] wifi sta模式 & iperf性能测试
chejm 发表于 2024-5-1 17:44
楼主分享的技术内容非常详细,图文并茂,虽然对我这样的新手理解起来有点困难,但还是认真学习以开阔眼界
-
回复了主题帖:
【FireBeetle 2 ESP32 C6】怎样编译esp32c6的micropython固件
wangerxian 发表于 2024-4-28 17:56
ESP32 C6好像支持5GHz,感觉可以测试一下。
看datasheet,提到2.4 GHz 频段但没提5GHZ频段
-
发表了主题帖:
[FireBeetle 2 ESP32C6开发板] wifi sta模式 & iperf性能测试
本帖最后由 xhackerustc 于 2024-5-1 11:52 编辑
据datasheet,ESP32C6支持IEEE 802.11b/g/n/ax,2.4 GHz 频段,1T1R。其中,802.11ax仅支持非接入点工作模式。今天我们就试试wifi station模式,再做做大家喜闻乐见的wifi iperf性能测试。因做wifi iperf测试时,要连接ap,所以iperf能工作证明sta就顺便过了。不过笔者家里还没有支持wifi6路由器,后面或许会找个wifi6路由器过来试试。
iperf的编译
iperf有iperf2和iperf3,它们两协议并不兼容。esp官方已经实现了和iperf2兼容的iperf工具,在目录examples/wifi/iperf下,配置一下:
cd examples/wifi/iperf
idf.py set-target esp32c6
idf.py menuconfig
idf.py build
menuconfig时主要注意三个地方:flash改QIO,4MB大小;console out改usb;确保gcc optimization是-O2。具体改法参考笔者第一篇测评贴[FireBeetle 2 ESP32C6开发板]linux下开发环境搭建,这里不再赘述。
iperf烧录和运行
esptool.py -p /dev/ttyACM0 --chip esp32c6 -b 460800 --before default_reset --after hard_reset write_flash --flash_mode qio --flash_size 4MB --flash_freq 80m 0x10000 build/iperf.bin
在pc机上运行iperf(pc端的iperf可从linux发行版安装)服务端:
iperf -s
在板子usb串口console中:
sta_connect your_wifi_ap_ssid your_wifi_ap_passwd
连上wifi ap以后如图所示:
现在可以运行iperf了
iperf -c YOUR_PC_IP_ADDR -i3 -t 60
板子供电不足重启
what?猛然发现板子重启了
Brownout是什么鬼?字面意思是停电、电压降低?猜测这可能是wifi iperf性能测试时耗电较大,和供电不足有关,搜索也发现一堆线索指明可能是供电不足,ldo电压猛掉。因是电脑usb口供电,个人先尝试下换个电脑usb口特别是支持usb3的,实在不行要用5v引脚单独供电了。幸运的是换了支持usb3的接口Brownout问题解决了,也证明了前面的电脑usb口供电不足猜想。
最终测试结果
最后把板子放在靠近路由器的地方,最终运行结果截图:
结果分析
吞吐量在12.62Mbits/s ~ 16.29Mbits/s变动,一个wifi 2.4GHZ频道占满冲突繁忙的地方取得这个性能还行,如果上了wifi6可能更好,或者在一个电磁环境优良屏蔽其它wifi 2.4ghz频道的环境中测会有更优表现。
-
回复了主题帖:
[FireBeetle 2 ESP32C6开发板]linux下开发环境搭建
xhackerustc 发表于 2024-5-1 10:12
要说方便那是python方便,但feature complete、性能综合考虑还是用官方的esp-idf,另外感觉要玩更复杂的 ...
PS:顺着这次测评把esp-idf升级了一把,发现esp-idf做得更好了,功能更多,很多以前要自己移植的现在官方直接弄好了更方便了。要发挥芯片最大功能,综合考虑方便程度还是得上esp-idf
-
回复了主题帖:
[FireBeetle 2 ESP32C6开发板]linux下开发环境搭建
秦天qintian0303 发表于 2024-5-1 08:48
还是感觉python比较方便
要说方便那是python方便,但feature complete、性能综合考虑还是用官方的esp-idf,另外感觉要玩更复杂的东东用python不太好做,后面评测可以看出来,敬请期待。
-
回复了主题帖:
[FireBeetle 2 ESP32C6开发板] coremark跑分
cpu主频高coremark分数也会高,所以有的时候计算coremark/MHZ
- 2024-04-30
-
发表了主题帖:
[FireBeetle 2 ESP32C6开发板] coremark跑分
本帖最后由 xhackerustc 于 2024-5-1 19:20 编辑
据官方datasheet,ESP32C6的主cpu是四级流水线支持160MHZ频率,RV32IMAC指令集,有32位乘法器和32位除法器。熟悉esp32c3的同学会发现这和esp32c3主cpu大体很像阿,所以一个问题是:抛开其它不谈,就主cpu性能来讲,它们两咋样?版上有位兄弟的帖子很好的回答了这个问题【FireBeetle 2 ESP32 C6】几种esp32性能对比测试。咱也跟着做做cpu性能pk,选用benchmark是coremark,不过手里板子只有esp32c3和esp32c6,比较穷。
大概在去年esp官方把coremark移植后加进idf-extra-components,所以这次比较幸福不用移植了。
cd /tmp
idf.py create-project-from-example "espressif/coremark:coremark_example"
这会在/tmp目录下生成一个名叫coremark_example的idf project,咱们配置一下:
cd /tmp/coremark_example
idf.py set-target esp32c6
idf.py menuconfig
menuconfig界面注意把console output改成USB Serial/JTAG Controller,-Og改成-O2, 具体改法可以参见本人第一篇测评贴 [FireBeetle 2 ESP32C6开发板]linux下开发环境搭建,这里不再叙述。flash大小和模式可改可不改,因为coremark比较特别,是全放进sram中运行的,所以flash用DIO还是QIO没区别。然后coremark_example中override了一些CFLAGS,比如用了-O3,所以前面的-Og改-O2也可以不改。
编译与烧录
idf.py build
esptool.py -p /dev/ttyACM0 --chip esp32c6 -b 460800 --before default_reset --after hard_reset write_flash --flash_mode qio --flash_size 4MB --flash_freq 80m 0x10000 build/coremark_example.bin
串口终端打开板子usb虚拟cdc串口/dev/ttyACM0,过一会串口输出如下:
CoreMark Size : 666
Total ticks : 13661
Total time (secs): 13.661000
Iterations/Sec : 439.206500
Iterations : 6000
Compiler version : GCC13.2.0
Compiler flags : -ffunction-sections -fdata-sections -gdwarf-4 -ggdb -nostartfiles -nost
artfiles -O2 -fstrict-volatile-bitfields -fno-jump-tables -fno-tree-switch-conversion -std
=gnu17 -O3 -fjump-tables -ftree-switch-conversion
Memory location : IRAM
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0xa14c
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 439.206500 / GCC13.2.0 -ffunction-sections -fdata-sections -gdwarf-4 -ggdb
-nostartfiles -nostartfiles -O2 -fstrict-volatile-bitfields -fno-jump-tables -fno-tree-swi
tch-conversion -std=gnu17 -O3 -fjump-tables -ftree-switch-conversion / IRAM
CPU frequency: 160 MHz
I (16259) main_task: Returned from app_main()
所以160MHZ频率下获得了439 Iterations/Sec。我们可以重复上述步骤在esp32c3上测下coremark,唯一区别就是idf选target时参数是esp32c3,其它步骤一样,这里不再重复步骤,只把数据贴出作为对比:esp32c3在160MHZ频率下获得了407 Iterations/Sec。所以esp32c6的cpu比esp32c3强了一些,略有提升,也交叉验证了上面兄弟的性能测试帖子中的结论。
-
回复了主题帖:
FireBeetle 2 ESP32 C6开发板_串口测试_板子上的虚拟串口不能用吗?
感觉你说的是usb虚拟出来的cdc串口,那个串口可以用,能用来打印/输入,在esp-idf中可以配置,见我的测评贴
-
回复了主题帖:
[FireBeetle 2 ESP32C6开发板]linux下开发环境搭建
damiaa 发表于 2024-4-30 10:26
linux下玩更方便!
确实是*nix系统下开发更方便,原厂开发工具就是esp-idf,它在*nix环境下支持得比较好