![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
os
liuxs1998
物联网 Android Linux 安全
展开
-
数据通信过程的免锁设计
在多核情况下,用自旋锁实现原子操作,在中断里面是可以用的。自旋锁要求每个核持有时间必须尽可能短,否则多核运行都被自旋锁串行化了,多核的性能就体现不出来了。对于uart通信来说,中断处理程序就是其接收buffer唯一的生存者,发送buffer唯一的消费者,这样,它就可以自由的在buffer的一端进行操作,而不会对数据产生影响。环形buffer有一个head和end指针分别用于生产者和消费者操作buffer的输入和输入的其中一端,只要这个环形buffer设计的没问题,就不用担心数据一致性问题。原创 2023-02-07 14:39:39 · 338 阅读 · 0 评论 -
正确使用自旋锁、互斥锁
最近在看alios-things的代码发现驱动程序中大量使用了自旋锁 。如tty.c里面的函数实现都是通过自旋锁来实现对资源的访问保护。看到这里首先会有疑问,自旋锁能保护临界区吗?一般来说,自旋锁是用于多核系统的不同核心之间对同一个数据区的竞争访问,对于同一个核上的不同线程是不具备防护功能的。(网上有文章解析自旋锁是让线程原地等待,并没有突出smp环境下的核间竞争,似乎要达到不关中断情况下实现临界区保护,可能也有这种自旋锁吧,没见过,见过的请在下面留言,谢谢)怀着上述疑问,打开aos_spinlo原创 2022-06-28 19:20:16 · 661 阅读 · 0 评论 -
多核自旋锁
ldrex、strex 独占存储指令pld 预加载指令owner,nextowner指示自旋锁当前拥有者序号,next 表示当前线程等待序号每次进入等待next序号加一;如果next和owner不等,则循环查询等待。。。每次释放锁owner加一,指示下一个等待线程可以继续运行...原创 2021-09-26 18:31:25 · 668 阅读 · 0 评论