单片机
返回首页

OK6410A 开发板 (八) 77 linux-5.11 OK6410A linux 内核同步机制 读写信号量的实现

2022-08-18 来源:csdn

解决了什么


实现

down_read/up_read


kernel/locking/rwsem.c

down_read

LOCK_CONTENDED(sem, __down_read_trylock, __down_read);


include/linux/lockdep.h

449 #define LOCK_CONTENDED(_lock, try, lock)                                        

450     lock(_lock)


kernel/locking/rwsem.c

1220 static inline void __down_read(struct rw_semaphore *sem)                         

1221 {                                                                                

1222     __down_read_common(sem, TASK_UNINTERRUPTIBLE);                               

1223 }


1205 /*                                                                               

1206  * lock for reading                                                              

1207  */                                                                              

1208 static inline int __down_read_common(struct rw_semaphore *sem, int state)        

1209 {                                                                                

1210     long count;                                                                  

1211                                                                                  

1212     if (!rwsem_read_trylock(sem, &count)) {                                      

1213         if (IS_ERR(rwsem_down_read_slowpath(sem, count, state)))                 

1214             return -EINTR;                                                       

1215         DEBUG_RWSEMS_WARN_ON(!is_rwsem_reader_owned(sem), sem);                  

1216     }                                                                            

1217     return 0;                                                                    

1218 }


 235 static inline bool rwsem_read_trylock(struct rw_semaphore *sem, long *cntp)      

 236 {                                                                                

 237     *cntp = atomic_long_add_return_acquire(RWSEM_READER_BIAS, &sem->count);      

 238                                                                                  

 239     if (WARN_ON_ONCE(*cntp < 0))                                                 

 240         rwsem_set_nonspinnable(sem);                                             

 241                                                                                  

 242     if (!(*cntp & RWSEM_READ_FAILED_MASK)) {                                     

 243         rwsem_set_reader_owned(sem);                                             

 244         return true;                                                             

 245     }                                                                            

 246                                                                                  

 247     return false;                                                                

 248 }  


include/asm-generic/atomic-long.h

 556 static __always_inline long                                                      

 557 atomic_long_add_return_acquire(long i, atomic_long_t *v)                         

 558 {                                                                                

 559     return atomic_add_return_acquire(i, v);                                      

 560 }


down_write/up_write


down_write

LOCK_CONTENDED(sem, __down_write_trylock, __down_write);

__down_write

__down_write_common

rwsem_write_trylock

atomic_long_try_cmpxchg_acquire

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 单稳态控制电路设计与分析

  • IGBT模块通过控制门极阻断过电流

  • 开关电源的基本组成及工作原理

  • 比较常见的功率整流器和滤波电路

  • 基于CA3193的热电偶放大器电路

  • 基于TDA1554的立体声放大器电路

    相关电子头条文章