diff --git a/Chapter8_SOC_与_Linux/8.7_设备驱动中的并发控制.md b/Chapter8_SOC_与_Linux/8.7_设备驱动中的并发控制.md index 107160d..afcbee1 100644 --- a/Chapter8_SOC_与_Linux/8.7_设备驱动中的并发控制.md +++ b/Chapter8_SOC_与_Linux/8.7_设备驱动中的并发控制.md @@ -302,13 +302,13 @@ struct rw_semaphore my_rws; void init_rwsem(struct rw_semaphore *sem); // 获取读信号量 -void down_read(struct rw_semaphore *sem); +void down_read(struct rw_semaphore *sem); int down_read_trylock(struct rw_semaphore *sem); // 释放读信号量 void up_read(struct rw_semaphore *sem); // 获取写信号量 -void down_write(struct rw_semaphore *sem); +void down_write(struct rw_semaphore *sem); int down_write_trylock(struct rw_semaphore *sem); // 释放写信号量 void up_write(struct rw_semaphore *sem); @@ -316,7 +316,7 @@ void up_write(struct rw_semaphore *sem); ## 互斥体 -尽管信号量已经可以实现互斥的功能,而且包含 DECLARE_MUTEX()、init_MUTEX ()等定义信号量的宏或函数,从名字上看就体现出了互斥体的概念,但是 mutex 在 Linux 内核中还是真实地存在的。 +尽管信号量已经可以实现互斥的功能,而且包含 DECLARE_MUTEX()、init_MUTEX() 等定义信号量的宏或函数,从名字上看就体现出了互斥体的概念,但是 mutex 在 Linux 内核中还是真实地存在的。 ```cpp // 码定义名为互斥体 @@ -336,4 +336,50 @@ void fastcall mutex_unlock(struct mutex *lock); ## 并发控制示例 ```cpp +static ssize_t demo_read(struct file *filp, char __user *buffer, size_t count, loff_t *position) +{ + struct demo_dev *devp = filp->private_data; + loff_t p = *position; + ssize_t ret = 0; + + // This is a test. + // 分析和获取有效的读长度 + if(DEMO_DATA_SIZE<=p) // 要读的偏移位置越界 + return 0; // End of a file + if(DEMO_DATA_SIZE<(count+p)) // 要读的字节数太大 + count = DEMO_DATA_SIZE-p; + + if(copy_to_user((void*)buffer, &devp->demo_text[p], count)) + ret = -EFAULT; + else + { + *position += count; + ret = count; + } + return ret; +} + +static ssize_t demo_write(struct file *filp, const char __user *buffer, size_t count, loff_t *position) +{ + struct demo_dev *devp = filp->private_data; + const char __user *p = buffer; + + // This is a test. + // 分析和获取有效的写长度 + if(DEMO_DATA_SIZE<=p) // 要读的偏移位置越界 + return 0; // End of a file + if(DEMO_DATA_SIZE<(count+p)) // 要读的字节数太大 + count = DEMO_DATA_SIZE-p; + + if(copy_from_user(&devp->demo_text[p], (void*)buffer, count)) + ret = -EFAULT; + else + { + *position += count; + ret = count; + } + + (void)devp; + return p-buffer; +} ```