目前个人实现了一套ESP32C3芯片的WIFI驱动和BLE驱动,但是在具体运行过程中存在一些问题,具体个人实现方式和问题描述如下所示。
根据esp-idf
库的CMake
编译系统配置以及idf.py build
所生成的编译日志编写Sconscript
文件,通过scons
编译系统来管理esp-idf
代码并且实现了利用scons
来编译RT-Thread
和esp-idf
。
根据esp-idf
库的wifi
组件的CMake
编译配置以及idf.py build
所生成的编译日志来配置Sconscript
将wifi
组件纳入RT-Thread
编译。撰写drv_wifi.h
和drv_wifi.c
搭建RT-Thread
和esp-idf
之间的桥梁,实现RT-Thread
中的WIFI
框架接口。
根据esp-idf
库的bluetooth
组件的CMake
编译配置以及idf.py build
所生成的编译日志来配置Sconscript
将bluetooth
组件纳入RT-Thread
编译。和WIFI
组件不同,我们采用esp-idf
所提供的nimble
组件来实现BLE
支持,通过使用es-idf
的nimble
组件和esp-idf
所提供的nimble
使用样例来实现ble
的支持。
rt_mq_send
等函数在ISR
中运行的问题在实现WIFI
驱动和BLE
驱动过程中出现了一种新的问题,在运行过程中出现断言错误,报错内容为在中断环境ISR
中使用了rt_mq_send
等函数,这些函数由于使用自旋锁等组件需要关闭中断进行操作从而使得这些函数不能在中断环境中进行调用。
报错截图:
WIFI
的ap
模式可以扫描到WIFI
但是无法连接在稳定情况下wifi
的ap
模式可以被手机扫描到但是无法获取ip
地址,个人猜测为lwip
和wifi
接口对接问题导致错误。
pc
跑飞现象该问题主要出现在BLE
驱动当中,具体表现为运行BLE
一段时间之后会出现取指错误中断,具体表现为pc
和sp
指针地址相同,本人猜测为栈溢出导致了上述错误。
除上面两个错误之外还有其他许多错误,例如报错Guru Meditation Error: Core 0 panic'ed (instruction access fault). Exception was unhandled.
等等,稳定性较差,但是有时还是可以扫描到并进行连接。
我的rt-thread
仓库地址在https://github.com/WCX1024979076/rt-thread/tree/esp32,packages/esp-idf
仓库在https://github.com/WCX1024979076/esp-idf,packages/freertos-wrapper
仓库在https://github.com/WCX1024979076/FreeRTOS-Wrapper
WIFI
组件启用只需要在menuconfig
中开启BSP_USING_WIFI
开关即可。
BLE
组件启用首先需要确保BSP_USING_WIFI
和RT_USING_WIFI
和lwip
组件关闭;之后打开BSP_USING_BLE
开关;最后是将样例程序加入到scons
编译并在bsp/ESP32_C3/main/main.c
中调用时钟初始化程序和样例程序入口,样例程序在bsp/ESP32_C3/packages/ESP-IDF-latest/examples/bluetooth/nimble
下。
由于乐鑫公司原厂的wifi
库和nimble
库和FreeRTOS
紧密绑定同时乐鑫公司也对FreeRTOS
进行相关定制,导致在实现WIFI
和BLE
驱动过程中使用FreeRTOS-Wrapper
出现了一些问题。另外由于乐鑫公司所使用的wifi
库是通过二进制静态链接库所实现导致调试难度提高。最后个人能力也有有限,对嵌入式这一块还不算太了解以及缺乏相关调试设备。如果各位能帮忙解决我将不胜感激,我的联系方式为timwcx@qq.com。
我遇到了 rt_mq_send等函数在ISR中运行的问题 这个问题并找到原因了,但是解决起来很麻烦
https://club.rt-thread.org/ask/article/27690a93a4369e76.html
简而言之,为了兼容乐鑫魔改的freertos,rtt自己写了一个兼容层,但是rtt使用驱动时会对资源加锁,这在兼容层是可以保证对资源访问需要解锁的,但是在兼容层之下的乐鑫的freertos则不能保证访问资源必须加锁,他们有他们的一套逻辑。于是就在乐鑫那边出了问题
好的,那我去试一下