
1、在linux系统中读取1-wire多进程读取温度时候会出现异常。原因按照DS18B20s传感器协议复位后需要750毫秒延时。在内核1-wire子系统中驱动读取时候会复位为何节省这750毫秒的延时内核会释放锁这样就会造成多个进程访问时候出现异常。解决方法锁注释掉如下if (external_power) { /*将这个锁注释掉 mutex_unlock(dev-bus_mutex); */ sleep_rem msleep_interruptible(tm); if (sleep_rem ! 0) { ret -EINTR; goto post_unlock; } /*将这个锁注释掉 ret mutex_lock_interruptible(dev-bus_mutex); if (ret ! 0) goto post_unlock; */ }static ssize_t w1_slave_show(struct device *device, struct device_attribute *attr, char *buf) { struct w1_slave *sl dev_to_w1_slave(device); struct w1_master *dev sl-master; u8 rom[9], crc, verdict, external_power; int i, ret, max_trying 10; ssize_t c PAGE_SIZE; u8 *family_data sl-family_data; ret mutex_lock_interruptible(dev-bus_mutex); if (ret ! 0) goto post_unlock; if (!sl-family_data) { ret -ENODEV; goto pre_unlock; } /* prevent the slave from going away in sleep */ atomic_inc(THERM_REFCNT(family_data)); memset(rom, 0, sizeof(rom)); while (max_trying--) { verdict 0; crc 0; if (!w1_reset_select_slave(sl)) { int count 0; unsigned int tm 750; unsigned long sleep_rem; w1_write_8(dev, W1_READ_PSUPPLY); external_power w1_read_8(dev); if (w1_reset_select_slave(sl)) continue; /* 750ms strong pullup (or delay) after the convert */ if (w1_strong_pullup 2 || (!external_power w1_strong_pullup)) w1_next_pullup(dev, tm); w1_write_8(dev, W1_CONVERT_TEMP); if (external_power) { /*将这个锁注释掉 mutex_unlock(dev-bus_mutex); */ sleep_rem msleep_interruptible(tm); if (sleep_rem ! 0) { ret -EINTR; goto post_unlock; } /*将这个锁注释掉 ret mutex_lock_interruptible(dev-bus_mutex); if (ret ! 0) goto post_unlock; */ } else if (!w1_strong_pullup) { sleep_rem msleep_interruptible(tm); if (sleep_rem ! 0) { ret -EINTR; goto pre_unlock; } } if (!w1_reset_select_slave(sl)) { w1_write_8(dev, W1_READ_SCRATCHPAD); count w1_read_block(dev, rom, 9); if (count ! 9) { dev_warn(device, w1_read_block() returned %u instead of 9.\n, count); } crc w1_calc_crc8(rom, 8); if (rom[8] crc) verdict 1; } } if (verdict) break; } for (i 0; i 9; i) c - snprintf(buf PAGE_SIZE - c, c, %02x , rom[i]); c - snprintf(buf PAGE_SIZE - c, c, : crc%02x %s\n, crc, (verdict) ? YES : NO); if (verdict) memcpy(family_data, rom, sizeof(rom)); else dev_warn(device, Read failed CRC check\n); for (i 0; i 9; i) c - snprintf(buf PAGE_SIZE - c, c, %02x , ((u8 *)family_data)[i]); c - snprintf(buf PAGE_SIZE - c, c, t%d\n, w1_convert_temp(rom, sl-family-fid)); ret PAGE_SIZE - c; pre_unlock: mutex_unlock(dev-bus_mutex); post_unlock: atomic_dec(THERM_REFCNT(family_data)); return ret; }