Linux下MII總線驅動不穩定

一、硬件環境配置:

          PowerPC+BCM芯片

二、軟件環境配置

          Linux+C語言

三、問題

          Linux內核在增加實時補丁後(make menuconfig選擇了選項“”)後,在MII總線壓力讀寫時出現連續讀取數據不一致問題。

四、分析和解決

         Linux內核版本區別:增加了編譯選項如下

         Kernel options->Preemption Model (Fully Preemptible Kernel (RT))  --->

            

        該選項打開後會直接提升linux內核服務的優先級,設備資源的控制權也依據優先級配置。

         因此,需要在linux內核空間建立一個互斥鎖,在編寫ko時引用同一互斥鎖資源,保證硬件資源互斥訪問即可。

解決辦法:

在linux內添加互斥鎖

相應的模塊添加:struct mutex drv_mutex_locker;

將相應的接口生成系統符號表,以供用戶寫的ko調用: EXPORT_SYMBOL_GPL(drv_mutex_locker);

修改完成後,在編譯好的內核啓動後,可以在符號表中找到對應的接口描述:

[root@localhost]#cat /proc/kallsyms | grep mutex_locker

f158cd4c b drv_mutex_locker     [drv_mdio]

同時在用戶編寫的ko中聲明外部變量(引用內核空間的變量)

extern struct mutex drv_mutex_locker;

  在引用同一locker情況下,硬件資源可以互斥地訪問。

五、小結

         Linux的RT打開後,系統的信號類型及名稱、系統服務優先級等都會改變,RT上的驅動程序需要考慮是否和系統的衝突,一旦衝突需要依據實際情況改相應的代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章