新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2019-1-9
- 在线时间
- 10 小时
|
1金钱
在第四十九章 Linux 按键输入实验 中有如下代码
- static ssize_t key_read(struct file *filp, char __user *buf,
- size_t cnt, loff_t *offt)
- {
- int ret = 0;
- unsigned char value;
- struct key_dev *dev = filp->private_data;
- if (gpio_get_value(dev->key_gpio) == 0) { /* key0 按下 */
- while(!gpio_get_value(dev->key_gpio)); /* 等待按键释放 */
- <font color="#ff0000">atomic_set(&dev->keyvalue, KEY0VALUE);</font>
- } else { /* 无效的按键值 */
- <font color="#ff0000">atomic_set(&dev->keyvalue, INVAKEY);</font>
- }
- <font color="#ff0000">value = atomic_read(&dev->keyvalue); </font> /* 保存按键值 */
- ret = copy_to_user(buf, &value, sizeof(value));
- return ret;
- }
复制代码 标红的三行利用原子操作实保护共享资源,但是如果两个应用程序同时调用驱动,
当第一个程序先运行至 atomic_set(&dev->keyvalue, KEY0VALUE)赋值为KEY0VALUE
第二个程序运行atomic_set(&dev->keyvalue, INVAKEY)覆盖掉原值为INVAKEY
那第一个程序返回value = atomic_read(&dev->keyvalue)时,岂不是返回的INVAKEY,而不是期望的KEY0VALUE?这样考虑有什么问题吗,新人望大神解答
|
|