前几天有朋友问, CSR和RDA软件, 假设在上层用一个while(1), 会不会死掉; 另外, A2DP音频流数据是如何到DSP的. 还有CSR和RDA CPU架构是如何? 这些都是不错的问题, 因为这对于study现已成熟产品的系统架构有帮助.
1. 上层使用while(1)会不会死掉.
分为两方面来讨论, 一方面是CSR, 另一方面是RDA, GO!
方法: 当音乐开始播放后, 进入while(1).
1.1 CSR
以ADK2.5.1为例, 在以下函数最后添加一行:
void handleA2DPStartStreaming(uint16 DeviceId, uint16 StreamId, a2dp_status_code status)
{
...
while(1);
}
实验结果: 蓝牙不会断开连接, 但声音不出来, 串口发AT指令无作用
.
之前以为会死掉,并断开连接, 但实际上只是死掉, 不会断开连接.
分析: CSR上层的代码全部在void app_handler(Task task, MessageId id, Message message);
上层代码死在while(1)中, 底层系统可能在等app_handler回调完成. 但是Controller可能是独立运行的, 故和手机的交互还在, 所以没有表现出断开连接.
1.2 RDA
void app_a2dp_msg_handle(COS_EVENT *ev)
{
case RDABT_A2DP_SEND_SEP_START_IND_MSG:
{
stateManagerEnterA2dpStreamingState();
while(1);
}
break;
case RDABT_A2DP_SEND_SEP_PAUSE_IND_MSG:
....
}
结果: 串口程序不响应, 无声音, 没有断开连接, 但是大约1分钟后, 程序重启了. 自然, 蓝牙连接也断开重连了.
分析: 软件task(任务)实现架构和A2DP/串口数据流向如下:
BAL_TaskInit生成了许多子任务, 主要如下图所示:
串口中断服务是独立的.