linux驅動註冊之倒影式錯誤處理機制

2021-08-21 03:30:24 字數 2010 閱讀 7120

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...