一、硬件環境配置:
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上的驅動程序需要考慮是否和系統的衝突,一旦衝突需要依據實際情況改相應的代碼。