博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OK6410A 开发板 (八) 68 linux-5.11 OK6410A linux 内核同步机制 atomic 的实现
阅读量:4285 次
发布时间:2019-05-27

本文共 4822 字,大约阅读时间需要 16 分钟。

  • 解决的问题是什么
所有竞态原因

实现

  • 32bit
// 下面为 atomic_add 的定义arch/arm/include/asm/atomic.h 36 #define ATOMIC_OP(op, c_op, asm_op)                 \                             37 static inline void atomic_##op(int i, atomic_t *v)          \                     38 {
\ 39 unsigned long tmp; \ 40 int result; \ 41 \ 42 prefetchw(&v->counter); \ 43 __asm__ __volatile__("@ atomic_" #op "\n" \ 44 "1: ldrex %0, [%3]\n" \ 45 " " #asm_op " %0, %0, %4\n" \ 46 " strex %1, %0, [%3]\n" \ 47 " teq %1, #0\n" \ 48 " bne 1b" \ 49 : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) \ 50 : "r" (&v->counter), "Ir" (i) \ 51 : "cc"); \ 52 }...218 #define ATOMIC_OPS(op, c_op, asm_op) \ 219 ATOMIC_OP(op, c_op, asm_op) \ 220 ATOMIC_OP_RETURN(op, c_op, asm_op) \ 221 ATOMIC_FETCH_OP(op, c_op, asm_op)...223 ATOMIC_OPS(add, +=, add)
  • 64bit
arch/arm/include/asm/atomic.h304 #define ATOMIC64_OP(op, op1, op2)                   \                            305 static inline void atomic64_##op(s64 i, atomic64_t *v)          \                306 {
\ 307 s64 result; \ 308 unsigned long tmp; \ 309 \ 310 prefetchw(&v->counter); \ 311 __asm__ __volatile__("@ atomic64_" #op "\n" \ 312 "1: ldrexd %0, %H0, [%3]\n" \ 313 " " #op1 " %Q0, %Q0, %Q4\n" \ 314 " " #op2 " %R0, %R0, %R4\n" \ 315 " strexd %1, %0, %H0, [%3]\n" \ 316 " teq %1, #0\n" \ 317 " bne 1b" \ 318 : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) \ 319 : "r" (&v->counter), "r" (i) \ 320 : "cc"); \ 321 }
  • 1bit
arch/arm/include/asm/bitops.h 31 /*                                                                                32  * These functions are the basis of our bit ops.                                  33  *                                                                                34  * First, the atomic bitops. These use native endian.                             35  */                                                                               36 static inline void ____atomic_set_bit(unsigned int bit, volatile unsigned long *p) 37 {
38 unsigned long flags; 39 unsigned long mask = BIT_MASK(bit); 40 41 p += BIT_WORD(bit); 42 43 raw_local_irq_save(flags); 44 *p |= mask; 45 raw_local_irq_restore(flags); 46 }...180 #define ATOMIC_BITOP(name,nr,p) \ 181 (__builtin_constant_p(nr) ? ____atomic_##name(nr, p) : _##name(nr,p)) ...189 #define set_bit(nr,p) ATOMIC_BITOP(set_bit,nr,p)

转载地址:http://fnigi.baihongyu.com/

你可能感兴趣的文章
探究 Android MVC、MVP、MVVM 的区别以及优缺点
查看>>
深入分析 Handler 内存泄露
查看>>
解决 windows 文件被占用的问题 -- The action can‘t be completed because the folder is open in another program
查看>>
Tencent/matrix错误:Cause: need sign apk but apksigner *\Sdk/build-tools/*/apksigner was not exist
查看>>
Android6.0运行时权限详解
查看>>
Android 开机启动过程
查看>>
View 的事件分发机制(一)
查看>>
Android 面试题整理(一)
查看>>
Android 项目中打印Log的优化
查看>>
Github 客户端安装失败解决办法
查看>>
android studio:###Error:Dependency :common:unspecified on project resource resolves to an APK
查看>>
异常统一处理的一些思路
查看>>
Android studio中快速try catch的快捷键
查看>>
Dialog 和 Toast
查看>>
队列在Http请求中的一点理解
查看>>
好想在你身边
查看>>
写给还在迷茫中挣扎的你
查看>>
在迷茫中执着前行
查看>>
笔记本连接无线但不能上网,网速极慢
查看>>
小蜗牛,慢慢爬
查看>>