花了半年時間在QNX系統上,這是一個RTOS,這個系統是高安全級別的系統,在核物理站/天文空間站/電站/地鐵/交通運輸(飛機/汽車/地鐵)等工業系統領域占有70%以上的市場份額。
背景:本文將我個人在QNX上移植內核和開發驅動以及應用程序的部分經驗記錄在此,因公司商業機密,部分源碼不便公開。我會框架性的講解開發思路。為了簡化文章復雜性,我只討論相同板子的平台驅動轉移,我手中是at91sam9260-ek的板子。外部設備是公司硬件部單獨添加的。
目的:利用已有的Linux驅動,簡化QNX的驅動編寫。
大致思路:Linux的驅動是基於模塊的,每個驅動作為內核的擴展放進內存中,QNX的驅動就是一個進程,需要將模塊改為一個應用程序。調整內核與驅動的通信機制。
以RTC驅動為例子:
Linux的驅動開發框架為:
1.填充read/write/ioctl/probe等驅動回調函數,設置對應的接口。
static struct file_operations rtc8025_fops = {
.owner = THIS_MODULE,
.open = rtc_open,
.release = rtc_release,
.read = rtc_read,
.write = rtc_write,
.ioctl = rtc_ioctl,
};
2.編寫每個部分的硬件相關代碼。以write為例:
static ssize_t rtc_write(struct file *filp, __user const char *buf,
size_t len,loff_t *ppos){
char buff[16];
VR_TIME *tm;
tm = kmalloc(sizeof(VR_TIME),GFP_KERNEL);
if ( NULL == tm ){
printk("Memory error!\n");
return -1;
}
if ( copy_from_user(buff, buf, len) )
return -EFAULT;
buff[len] = '\0';
set_time_value(tm, buff);
set_sys_time(tm);
kfree(tm);
return len;
}