將DHT11移植到Linux系統上

2021-07-10 07:13:39 字數 2441 閱讀 9695

由於專案需要,需要將dht11移植到linux。驅動程式如下

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define device_name "dht11"

#define pin s5pv210_gph0(0)

typedef unsigned char u8;

unsigned char buf[6];

unsigned char check_flag;

//spinlock_t lock=spin_lock_unlocked;

//spinlock_t lock=spin_lock_unlocked;

//define_spinlock(lock);

static define_mutex(mutex);

int read_one_bit(void) //從io口中讀乙個位元組

void gpio_out(int value) //將io口設定為輸出,並設定電平

unsigned char humidity_read_byte(void)

flag=0x0;

udelay(28);

if(gpio_get_value(pin))

i=0;

while(gpio_get_value(pin))

data<<=1;

data|=flag;

} return data;

}void humidity_read_data(void)

} i=0;

while(gpio_get_value(pin))

}for(i=0;i<5;i++)

buf[i]=humidity_read_byte();

buf[5]=buf[0]+buf[1]+buf[2]+buf[3];

if(buf[4]==buf[5])

else

}}static ssize_t humidiy_read(struct file *file, char __user *buffer, size_t size, loff_t *off)

else

return 0;

}else

return -eagain;

}static int humidiy_open(struct inode *inode, struct file *file)

static int humidiy_release(struct inode *inode, struct file *file)

static struct file_operations humidity_dev_fops=;

static struct miscdevice humidity_dev = ;

static int __init humidity_dev_init(void)

gpio_direction_output(pin, 1);

ret = misc_register(&humidity_dev);

printk("humidity_dev_init\n");

return ret;

}static void __exit humidity_dev_exit(void)

module_init(humidity_dev_init);

module_exit(humidity_dev_exit);

module_license("gpl");

module_author("www")

測試程式如下

#include#includeint main()

while(1)

sleep(2);

} close(humidityfd);

return 0;

}

本想,這驅動除錯起來應該簡單的。但在除錯到過程中,發現採集到的資料有時正確,有時錯誤,成功率約為50%。於是按照手冊微調一下時序,並沒有解決問題。網上查閱相關資料,發現都是用微控制器來程式設計的。當程式本來就是以裸奔的思想跑的,為什麼移植到linux會出錯呢?從dht11出來的訊號都正常啊。誤打誤撞,使用local_irq_disable這個函式後,讀出的資料都正常啦。local_irq_disable通過遮蔽中斷標誌位,從而禁止核心的搶占。我猜測是linux是個多工系統,該系統按照一定的演算法(每隔一段時間就會去跑另一段程式,時間不固定),呼叫一次驅動去讀取資料的過程中(時間較長相對於時間片),這期間cpu去做其他事情了,等重新回來讀取資料時,有可能錯過了時序中的某個片段,從而出現有時讀取資料正常,有時錯誤這種現象。

將 MFC 應用程式移植到 Linux

第一種方法 找乙個類似mfc框架的程式庫。您可能仍然在維護用微軟基礎類庫 microsoft foundation classes mfc 構建的舊的 windows 應用程式,而現在卻有客戶要求 linux 版本,該怎麼辦呢?在您的團隊中可能有技術熟練的 mfc 開發人員,但如何達到加速 linu...

將 Win32 程式移植到 Linux

分類 c c c linux shell 2011 03 23 17 01 2899人閱讀 收藏舉報 linux windows 平台service 指令碼程式設計 對於這個問題,網上已經有很多資料給予了介紹,但是相比於這些資訊,本文立足於個人的實踐,將內容具體到開發環境和源 我覺得還是有很多值得總...

將 Win32 程式移植到 Linux

首先宣告開發環境。win32程式的開發環境是vs.net 2008,程式語言是c linux使用的rhel 5.4,gcc的版本是4.1.2,程式語言也是c。然後依次說明移植的物件 資料型別 字串處理 系統呼叫 套接字 程序 程序鎖 執行緒 執行緒鎖 訊號量 事件鎖 條件鎖 系統服務。1.資料型別 ...