一张图先看下pcm_write的调用流程
做的工作一是将数据送到dma 中,另外就是更新alsa的缓冲区指针
在snd_pcm_lib_write1接口中看到这样一个函数wait_for_avail
wait_for_avail函数将会将当前写或读数据的任务通过add_wait_queue加入一个队列中,等待被唤醒,如果有没有收到唤醒,schedule_timeout将会挂起直到设置的timeout时间后继续执行
而每次读、写在会又platform驱动主动调用snd_pcm_period_elapsed去唤醒
而这个调用通常是在一个中断处理中调用的,某些情况下中断不在工作,指针得不到更新,snd_pcm_lib_write1或snd_pcm_lib_read1将会被挂起,直到设置的10s timeout之后才会得到执行