当前位置:   article > 正文

spi sync async_spi_async

spi_async

 

spi 的同步和异步传输
spi_async spi_sync
先看 spi_sync
 return __spi_sync(spi, message, 0);
  DECLARE_COMPLETION_ONSTACK(done);
  status = __spi_queued_transfer(spi, message, false);//注意这个false
   list_add_tail(&msg->queue, &master->queue);
  __spi_pump_messages(master, false);//注意这个false
   queue_kthread_work(&master->kworker, &master->pump_messages);
  wait_for_completion(&done);
再看 spi_async
spi_async
 ret = __spi_async(spi, message);
  return master->transfer(spi, message);//注意: master->transfer = spi_queued_transfer;
   return __spi_queued_transfer(spi, msg, true);
    list_add_tail(&msg->queue, &master->queue);
    queue_kthread_work(&master->kworker, &master->pump_messages);  

可以看到
async的spi传输 直接用过工作队列启动work,不进行阻塞
sync的 spi传输通过 wait_for_completion 进行睡眠等待传输完成 通过一个 void complete(struct completion *c);来进行唤醒
这个 message->complete = spi_complete; 在spi_finalize_current_message中被调用 这个完成量为 message->context = &done;
done指示等待的事件是否完成。初始化时为0。如果为0,则表示等待的事件未完成。大于0表示等待的事件已经完成
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/205778
推荐阅读
相关标签
  

闽ICP备14008679号