ESP-ADF 的例程中采用了pipeline 的设计模式(就是管道)。
具体还没搞清楚它的原理,相关链接如下,据说蕴藏着一种强大的哲学思想,后面有机会慢慢学习
https://blog.csdn.net/yanghua_kobe/article/details/7561016
https://coolshell.cn/articles/1351.html
下面说说 在看源码的时候,发现一个疑惑的点 “.” 对就是结构体初始化的问题~~~~
在ESP-ADF 的例程中充满了大量 的结构体初始化赋值。 如下:
一个结构体 采用一个宏的初始化方法, 这样看起来简洁 易懂~~~但是深究下去就有点奇怪了
i2s_stream_cfg_t i2s_cfg = I2S_STREAM_CFG_DEFAULT();
结构体定义
typedef struct {
audio_stream_type_t type; /*!< Type of stream */
i2s_config_t i2s_config; /*!< I2S driver configurations */
i2s_pin_config_t i2s_pin_config; /*!< I2S driver hardware pin configurations */
i2s_port_t i2s_port; /*!< I2S driver hardware port */
} i2s_stream_cfg_t;
宏定义
#define I2S_STREAM_CFG_DEFAULT() { \
.type = AUDIO_STREAM_WRITER, \
.i2s_config = { \
.mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX, \
.sample_rate = 44100, \
.bits_per_sample = 16, \
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, \
.communication_format = I2S_COMM_FORMAT_I2S, \
.dma_buf_count = 3, \
.dma_buf_len = 300, \
.use_apll = 1, \
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL2, \
}, \
.i2s_pin_config = { \
.bck_io_num = IIS_SCLK, \
.ws_io_num = IIS_LCLK, \
.data_out_num = IIS_DSIN, \
.data_in_num = IIS_DOUT, \
}, \
.i2s_port = 0, \
}
自己C语言功底一般,从来没见过这种“.” 的赋值方式~~~,群里问了一下大牛们,大牛说看看C99标准吧~~~~
这种结构体的初始化是C99标准中定义的。 目前了解到的 这样初始化的作用是:
1. 可以不用按顺序对结构体的小项进行初始化
2. 可以选择性的对结构体小项进行初始化
离线
感谢楼主分享!
还有这个: 装个VC2017试一试, 看看对C99的变长数组(柔性数组,零长数组)支持如何?
有些开源项目(如littevgl)大量用到变长数组(即用变量作为数组初始化长度),
用VC根本就编译通不过,
只能借道mingw: 一步一步分享在Windows QtCreator/Mingw平台编译运行调试LittleVGL
感觉晕哥 无所不能啊!!!
离线