c語言沒有錯誤處理機制,所以一旦程式某個部分出錯,需要退出的時候,就需要先把之前分配的資源先釋放掉再退出。
而釋放的過程是很有講究的。
一般我們遵循先申請的資源後釋放,後申請的資源先釋放的原則。和棧比較像。
舉個例子
struct _c_tag
;struct _b_tag
;struct _a_tag
;void func()
可以看到,如果先free掉_a_value就無法訪問 b,c兩個裡面分配的資源的。
一般情況下我們是這樣做的。
下面是我寫的乙個led驅動註冊的例子,可以發現若是在程式的越後面出錯,錯誤處理就會變得越冗餘一些。
static int s5pv210_led_probe(struct platform_device *pdev)
/* 使用gpiolib庫,申請gpio */
if(gpio_request(pdata->gpio,pdata->name))
else
/* 把動態申請到的driver data繫結到相應的裝置的私有資料中 */
platform_set_drvdata(pdev, led);
led->cdev.name = pdata->name;
led->cdev.brightness_set = s5pv210_led_brightness_set;
led->cdev.brightness = 0;
// led->cdev.flags = pdata->flags; //這個標誌必須用核心定義的,自己定義的可能會和核心的重複
led->pdata = pdata;
/* 利用led裝置類模型註冊該裝置 */
ret = led_classdev_register(&pdev->dev,&led->cdev );
if(ret)
return 0;
}
**核心**,發現核心的錯誤處理更簡潔一些。
下面是我借用核心驅動錯誤處理機制實現的乙個驅動註冊函式。
//註冊字元檔案
static int __init chrdev_init(void)
printk(kern_info"alloc_chrdev_region success... major = %d,minor = %d \n",major(dev_num),minor(dev_num));
//初始化裝置fops到cdev
cdev_init(&test_cdev, &test_fops);
//裝置操作資訊註冊到核心中去
ret = cdev_add(&test_cdev, dev_num, 1);
if(ret)
//動態請求記憶體使用
if(!request_mem_region(gpj0con_pa_addr, 8, "led dynamic map"))
//得到實體地址對應的虛擬位址
pgpj0con = ioremap(gpj0con_pa_addr, 8);
if(!pgpj0con)
pgpj0dat = pgpj0con + 1;
return 0;
err_ioremap:
release_mem_region(gpj0con_pa_addr, 8);
err_request_mem_region:
cdev_del(&test_cdev);
err_cdev_add:
unregister_chrdev_region(dev_num, 1);
err_alloc_chrdev_region:
return -einval;
}
可以發現,雖然要處理的錯誤更多了,但不像上面的那樣,在每個return 裡面處理錯誤,而是歸結到程式最後統一處理。使得整個錯誤處理不會顯得很冗餘。
這裡使用goto語句也並不會顯的**很亂。
Linux驅動之 經典方式註冊
雜項方式註冊生成的裝置檔案會自動掛載在 dev目錄下面,經典方式註冊的裝置不會自動掛載在 dev目錄下面 雜項裝置註冊的主裝置號只能為10,經典方式註冊主裝置號可以指定或者系統自動分配乙個除了 10 以外的任意乙個裝置號。雜項方式只暫用乙個子裝置號,經典方式占用當前主裝置號所有的子裝置號 0 254...
linux驅動之 驅動開發常見錯誤彙總
1.2 錯誤原因 1.3 解決辦法 2 error implicit declaration of function class create 序言 剛開始學驅動,期間會遇到大大小小的坑,這裡作為典型問題記錄彙總,以便後續查詢。root am437x evm first drv insmod fir...
Linux 驅動之字元裝置註冊
目的 給空模組新增驅動殼子 核心工作量 file operations及其元素填充 註冊驅動。腦海裡先有框架,知道自己要幹嘛 細節 不需要乙個字乙個字敲,可以到核心中去尋找參考 複製過來改 寫下的所有 必須心裡清楚明白,不能似懂非懂。先定義file operations結構體變數 自定義乙個file...