我们当前使用的芯片属于 LN882HKI 系列,根据官方手册说明,其内置 Flash 容量为 2MB。此外,按照官方 SDK 示例中相关注释来看,采用的是 W25Q16 SPI Flash 作为存储器。
任务划分
- socket_task_entry:
- 职责:Socket 连接管理、数据接收和发送。
- 数据流:
- 接收:音频数据写入 PCMBuffer_rx,打印数据写入 print_buffer。
- 发送:从 PCMBuffer_tx 读取 ADC 数据,发送给服务端。
- 同步:
- 写入 PCMBuffer_rx 后,通过 rx_data_ready_sem 通知 audio_task。
- 写入 print_buffer 后,通过 print_data_ready_sem 通知 print_task。
- 等待 tx_data_ready_sem,从 PCMBuffer_tx 读取数据。
- audio_task:
- 职责:ADC 采集和音频播放。
- 功能:
- 定时器中断(40kHz)采集 ADC 数据,写入 PCMBuffer_tx,通知 socket_task_entry。
- 以 40kHz 频率从 PCMBuffer_rx 读取数据,通过 PWM 播放。
- 同步:
- 等待 rx_data_ready_sem,读取 PCMBuffer_rx。
- 写入 PCMBuffer_tx 后,通过 tx_data_ready_sem 通知 socket_task_entry。
- print_task:
- 职责:处理打印逻辑。
- 功能:从 print_buffer 读取数据,执行打印(已实现)。
- 同步:等待 print_data_ready_sem,读取 print_buffer。
缓冲区
- PCMBuffer_tx:环形缓冲区,4096 个样本(8KB),存储 ADC 数据。
- PCMBuffer_rx:环形缓冲区,4096 个样本(8KB),存储服务端音频数据。
- print_buffer:环形缓冲区,30000 字节,存储打印数据。
任务优先级
- audio_task:tskIDLE_PRIORITY + 3。
- socket_task_entry:tskIDLE_PRIORITY + 2。
- print_task:tskIDLE_PRIORITY + 1。
同步机制
- 信号量:
- tx_data_ready_sem:通知 socket_task_entry 有 ADC 数据可发送。
- rx_data_ready_sem:通知 audio_task 有服务端音频数据可播放。
- print_data_ready_sem:通知 print_task 有打印数据可处理。
- 临界区:
- 中断和任务间访问缓冲区时,使用 taskENTER_CRITICAL 保护。
LOG(LOG_LVL_INFO, “Data %x,%x,%x,%x,%x,%x\n”, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);