www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]嵌入式Linux之我行,主要講述和總結(jié)了本人在學(xué)習(xí)嵌入式linux中的每個(gè)步驟。一為總結(jié)經(jīng)驗(yàn),二希望能給想入門嵌入式Linux的朋友提供方便。如有錯(cuò)誤之處,謝請(qǐng)指正。共享資源,歡迎轉(zhuǎn)載:http://hbhuanggang.cublog.cn一

嵌入式Linux之我行,主要講述和總結(jié)了本人在學(xué)習(xí)嵌入式linux中的每個(gè)步驟。一為總結(jié)經(jīng)驗(yàn),二希望能給想入門嵌入式Linux的朋友提供方便。如有錯(cuò)誤之處,謝請(qǐng)指正。


共享資源,歡迎轉(zhuǎn)載:http://hbhuanggang.cublog.cn


一、開發(fā)環(huán)境

主 機(jī):VMWare--Fedora 9

開發(fā)板:Mini2440--64MB Nand, Kernel:2.6.30.4

編譯器:arm-linux-gcc-4.3.2


二、相關(guān)概念

1、平臺(tái)設(shè)備及平臺(tái)設(shè)備驅(qū)動(dòng):

這個(gè)在前面篇幅:S3C2440上RTC時(shí)鐘驅(qū)動(dòng)開發(fā)實(shí)例講解中已經(jīng)講過了。這里只需了解一下系統(tǒng)為我們定義的看門狗(Watchdog)平臺(tái)設(shè)備及資源情況,在arch/arm/plat-s3c24xx/devs.c中,如下:


/* Watchdog */


/*定義了Watchdog平臺(tái)設(shè)備使用的資源,這些資源在驅(qū)動(dòng)程序中都會(huì)用到*/

static struct resource s3c_wdt_resource[] = {

[0] = { /*Watchdog所使用IO端口資源范圍*/

.start = S3C24XX_PA_WATCHDOG,

.end = S3C24XX_PA_WATCHDOG + S3C24XX_SZ_WATCHDOG - 1,

.flags = IORESOURCE_MEM,

},

[1] = {/*Watchdog中斷資源*/

.start = IRQ_WDT,

.end = IRQ_WDT,

.flags = IORESOURCE_IRQ,

}

};


/*定義了Watchdog平臺(tái)設(shè)備*/

struct platform_device s3c_device_wdt = {

.name = "s3c2410-wdt", /*設(shè)備名稱*/

.id = -1,

.num_resources= ARRAY_SIZE(s3c_wdt_resource), /*資源數(shù)量*/

.resource = s3c_wdt_resource, /*引用上面定義的資源*/

};

EXPORT_SYMBOL(s3c_device_wdt);



2、混雜設(shè)備(misc設(shè)備)

misc設(shè)備是Linux定義的主設(shè)備號(hào)為10的特殊字符設(shè)備,因?yàn)椴环献址O(shè)備的范疇,所以被歸納為misc設(shè)備,在Linux中有很多這種設(shè)備,例如:LED設(shè)備、Watchdog設(shè)備等等,系統(tǒng)會(huì)根據(jù)設(shè)備的次設(shè)備號(hào)來區(qū)分具體是哪個(gè)設(shè)備,通常這些次設(shè)備號(hào)被定義在include/linux/miscdevice.h中。在Linux中用miscdevice結(jié)構(gòu)體來描述一個(gè)misc設(shè)備,這就意味著被定義為misc設(shè)備的驅(qū)動(dòng)中就要實(shí)現(xiàn)該結(jié)構(gòu)體中的接口函數(shù)。該結(jié)構(gòu)體也定義在miscdevice.h中,如下:


struct miscdevice {

int minor;

const char *name;

const struct file_operations *fops;

struct list_head list;

struct device *parent;

struct device *this_device;

};



三、實(shí)例講解

1、Watchdog硬件結(jié)構(gòu)圖分析:

我們從結(jié)構(gòu)圖和數(shù)據(jù)手冊(cè)得知,看門狗Watchdog主要是實(shí)現(xiàn)系統(tǒng)自動(dòng)復(fù)位的功能,他是利用芯片內(nèi)部的定時(shí)器,定時(shí)輸出連接到電路的復(fù)位端,程序在一定時(shí)間范圍內(nèi)對(duì)定時(shí)器清零(俗稱“喂狗”),所以程序在正常工作時(shí),定時(shí)器總是不能溢出,也就不能產(chǎn)生復(fù)位信號(hào);如果程序出現(xiàn)錯(cuò)誤,不在定時(shí)周期內(nèi)復(fù)位看門狗,那么定時(shí)器就會(huì)溢出而產(chǎn)生復(fù)位信號(hào)使系統(tǒng)復(fù)位。

S3C2440的Watchdog模塊提供了三個(gè)寄存器來對(duì)Watchdog進(jìn)行操作,他們分別是:定時(shí)器控制寄存器WTCON、定時(shí)器數(shù)據(jù)寄存器WTDAT和定時(shí)器計(jì)數(shù)寄存器WTCNT。注意:在對(duì)定時(shí)器數(shù)據(jù)寄存器WTDAT進(jìn)行操作時(shí)必須在定時(shí)器控制寄存器WTCON使能之前寫入一個(gè)計(jì)數(shù)目標(biāo)值,當(dāng)Watchdog使能開啟后,WTDAT中的值會(huì)自動(dòng)被加載到計(jì)數(shù)寄存器WTCNT中,然后Watchdog從CPU內(nèi)部的時(shí)鐘分頻和時(shí)鐘除數(shù)因子得到一個(gè)工作周期,當(dāng)每個(gè)周期結(jié)束時(shí)計(jì)數(shù)寄存器WTCNT中的值會(huì)1,直到遞減為0時(shí),如果還不重新往WTCNT中寫入新的計(jì)數(shù)目標(biāo)值(即“喂狗”),則Watchdog就產(chǎn)生復(fù)位信號(hào)使系統(tǒng)復(fù)位。關(guān)于這些寄存器的功能和寄存器的各個(gè)位的操作值請(qǐng)參考數(shù)據(jù)手冊(cè)。

2、Watchdog驅(qū)動(dòng)程序具體實(shí)現(xiàn)步驟(建立驅(qū)動(dòng)文件my2440_watchdog.c):

注意:在每步中,為了讓代碼邏輯更加有條理和容易理解,就沒有考慮代碼的順序,比如函數(shù)要先定義后調(diào)用。如果要編譯此代碼,請(qǐng)嚴(yán)格按照C語言的規(guī)范來調(diào)整代碼的順序。

①、依然是驅(qū)動(dòng)程序的最基本結(jié)構(gòu):Watchdog驅(qū)動(dòng)的初始化和卸載部分及其他,如下:



#include

#include

#include

#include


/*Watchdog平臺(tái)驅(qū)動(dòng)結(jié)構(gòu)體,平臺(tái)驅(qū)動(dòng)結(jié)構(gòu)體定義在platform_device.h中,該結(jié)構(gòu)體內(nèi)的接口函數(shù)在第②、④步中實(shí)現(xiàn)*/

static struct platform_driver watchdog_driver =

{

.probe= watchdog_probe,/*Watchdog探測(cè)函數(shù),在第②步中實(shí)現(xiàn)*/

.remove= __devexit_p(watchdog_remove),/*Watchdog移除函數(shù), 在第④步中實(shí)現(xiàn)*/

.shutdown= watchdog_shutdown,/*Watchdog關(guān)閉函數(shù),在第④步中實(shí)現(xiàn)*/

.suspend= watchdog_suspend,/*Watchdog掛起函數(shù),在第④步中實(shí)現(xiàn)*/

.resume= watchdog_resume,/*Watchdog恢復(fù)函數(shù),在第④步中實(shí)現(xiàn)*/

.driver=

{

/*注意這里的名稱一定要和系統(tǒng)中定義平臺(tái)設(shè)備的地方一致,這樣才能把平臺(tái)設(shè)備與該平臺(tái)設(shè)備的驅(qū)動(dòng)關(guān)聯(lián)起來*/

.name= "s3c2410-wdt",

.owner= THIS_MODULE,

},

};

static int __init watchdog_init(void)

{

/*將Watchdog注冊(cè)成平臺(tái)設(shè)備驅(qū)動(dòng)*/

return platform_driver_register(&watchdog_driver);

}

static void __exit watchdog_exit(void)

{

/*注銷Watchdog平臺(tái)設(shè)備驅(qū)動(dòng)*/

platform_driver_unregister(&watchdog_driver);

}

module_init(watchdog_init);

module_exit(watchdog_exit);

/*驅(qū)動(dòng)程序模塊參數(shù),如果在加載驅(qū)動(dòng)模塊時(shí)沒有設(shè)定這些參數(shù),則這些參數(shù)將采用默認(rèn)值,

這些參數(shù)在接下來的步驟中將被一一用到,參數(shù)具體作用也將在各步驟中來說明*/

module_param(tmr_margin, int, 0);

module_param(tmr_atboot, int, 0);

module_param(nowayout, int, 0);

module_param(soft_noboot,int, 0);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Huang Gang");

MODULE_DESCRIPTION("My2440 Watchdog Driver");



②、Watchdog平臺(tái)驅(qū)動(dòng)結(jié)構(gòu)中探測(cè)函數(shù)watchdog_probe的實(shí)現(xiàn)。探測(cè)就意味著在系統(tǒng)總線中去檢測(cè)設(shè)備的存在,然后獲取設(shè)備有用的相關(guān)資源信息,以便我們使用這些信息。代碼如下:



#include

#include

#include

#include

#include

#include

/*定義了一個(gè)用來保存watchdog的IO端口占用的IO空間和經(jīng)過虛擬映射后的內(nèi)存地址*/

static struct resource *wdt_mem;

static void __iomem *wdt_base;

/*保存watchdog中斷號(hào),NO_IRQ宏定義在irq.h中*/

static int wdt_irqno = NO_IRQ;

/*保存從平臺(tái)時(shí)鐘隊(duì)列中獲取watchdog的時(shí)鐘*/

static struct clk *wdt_clock;

#define CONFIG_WATCHDOG_ATBOOT(0)

#define CONFIG_WATCHDOG_DEFAULT_TIME(15)

static int tmr_atboot = CONFIG_WATCHDOG_ATBOOT;

static int tmr_margin = CONFIG_WATCHDOG_DEFAULT_TIME;

static int soft_noboot;

static unsigned int wdt_count;/*用于保存經(jīng)計(jì)算后得到的計(jì)數(shù)寄存器WTCNT的計(jì)數(shù)值*/

/*申明并初始化一個(gè)自旋鎖wdt_pie_lock,對(duì)Watchdog資源進(jìn)行互斥訪問*/

static DEFINE_SPINLOCK(wdt_pie_lock);

static int __devinit watchdog_probe(struct platform_device *pdev)

{

int ret;

int started = 0;

struct resource *res;/*定義一個(gè)資源,用來保存獲取的watchdog的IO資源*/

/*在系統(tǒng)定義的watchdog平臺(tái)設(shè)備中獲取watchdog中斷號(hào)

platform_get_irq定義在platform_device.h中*/

wdt_irqno = platform_get_irq(pdev, 0);

if(wdt_irqno < 0)

{

/*獲取watchdog中斷號(hào)不成功錯(cuò)誤處理

dev_err定義在device.h中,在platform_device.h中已經(jīng)引用,所以這里就不需再引用了*/

dev_err(&pdev->dev, "no irq for watchdogn");

return -ENOENT;

}

/*申請(qǐng)Watchdog中斷服務(wù),這里使用的是快速中斷:IRQF_DISABLED。

中斷服務(wù)程序?yàn)?wdt_irq,將Watchdog平臺(tái)設(shè)備pdev做參數(shù)傳遞過去了*/

ret = request_irq(wdt_irqno, wdt_irq, IRQF_DISABLED, pdev->name, pdev);

if(ret)

{

/*錯(cuò)誤處理*/

dev_err(dev, "IRQ%d error %dn", wdt_irqno, ret);

return ret;

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

在嵌入式系統(tǒng)開發(fā)中,看門狗(Watchdog Timer, WDT)是保障系統(tǒng)可靠性的核心組件,其初始化時(shí)機(jī)的選擇直接影響系統(tǒng)抗干擾能力和穩(wěn)定性。本文從硬件架構(gòu)、軟件流程、安全規(guī)范三個(gè)維度,系統(tǒng)分析看門狗初始化的最佳實(shí)踐...

關(guān)鍵字: 單片機(jī) 看門狗 嵌入式系統(tǒng)

看門狗是實(shí)現(xiàn)嵌入式計(jì)算機(jī)系統(tǒng)運(yùn)行狀態(tài)監(jiān)控的一種措施 , 能夠有效提高系統(tǒng)運(yùn)行可靠性 。針對(duì)HKSP6102處理器在嵌入式計(jì)算機(jī)中的應(yīng)用 ,分析了通用看門狗的設(shè)計(jì)方法及其特點(diǎn);最后介紹了數(shù)據(jù)處理模塊的看門狗設(shè)計(jì)方法 ,基于...

關(guān)鍵字: 看門狗 嵌入式計(jì)算機(jī) 監(jiān)控

在嵌入式系統(tǒng)開發(fā)中,看門狗(Watchdog Timer, WDT)是一種重要的故障檢測(cè)和恢復(fù)機(jī)制。當(dāng)系統(tǒng)因軟件錯(cuò)誤、硬件故障或外部干擾而陷入異常狀態(tài)時(shí),看門狗能夠自動(dòng)觸發(fā)復(fù)位操作,使系統(tǒng)恢復(fù)到正常運(yùn)行狀態(tài)。本文將深入探...

關(guān)鍵字: 嵌入式系統(tǒng) 看門狗

為了保護(hù)個(gè)人信息和網(wǎng)絡(luò)設(shè)備的安全,專家們致力于開發(fā)各種安全技術(shù)和工具。其中,路由器看門狗功能成為了網(wǎng)絡(luò)安全領(lǐng)域的一大創(chuàng)新。

關(guān)鍵字: 路由器 看門狗

STM32有兩個(gè)看門狗,獨(dú)立看門狗和窗口看門狗。其實(shí)兩者的功能是類似的,只是喂狗的限制時(shí)間不同。

關(guān)鍵字: 看門狗 窗口看門狗

在由單片機(jī)構(gòu)成的微型計(jì)算機(jī)系統(tǒng)中,由于單片機(jī)的工作常常會(huì)受到來自外界電磁場(chǎng)的干擾,造成程序的跑飛,而陷入死循環(huán)。程序的正常運(yùn)行被打斷,由單片機(jī)控制的系統(tǒng)無法繼續(xù)工作,會(huì)造成整個(gè)系統(tǒng)的陷入停滯狀態(tài),發(fā)生不可預(yù)料的后果。所以...

關(guān)鍵字: 單片機(jī) 看門狗 計(jì)算機(jī)

STC單片機(jī)是一款增強(qiáng)型51單片機(jī),完全兼容MCS-51,還增加了新的功能,比如新增兩級(jí)中斷優(yōu)先級(jí),多一個(gè)外中斷,內(nèi)置EEPROM,硬件看門狗,具有掉電模式,512B內(nèi)存等。還支持ISP下載,不用編程器,只要一個(gè)MAX2...

關(guān)鍵字: 單片機(jī) 看門狗 中斷

今天要學(xué)習(xí)的是獨(dú)立看門狗,看門狗電路的應(yīng)用,使單片機(jī)可以在無人狀態(tài)下實(shí)現(xiàn)連續(xù)工作,其 工作原理是:看門狗芯片和單片機(jī)的一個(gè)I/O引腳相連,該I/O引腳通過程序控制它定時(shí)地往看門狗的 這個(gè)引腳上送入高電平(或低電平),這一...

關(guān)鍵字: 看門狗 中斷函數(shù) 單片機(jī)

看門狗(watch dog)是一個(gè)定時(shí)器,可以設(shè)置一個(gè)定時(shí)時(shí)間,計(jì)時(shí)到時(shí)會(huì)把MCU復(fù)位,所以MCU必須要在定時(shí)時(shí)間到之前將計(jì)數(shù)值重置(這個(gè)動(dòng)作通常稱為喂狗)。在嵌入式系統(tǒng)中加入看門狗,可以監(jiān)測(cè)MCU是否還在正常運(yùn)行,如果...

關(guān)鍵字: 看門狗 定時(shí)器

我們是否因系統(tǒng)上出現(xiàn)意外的電壓尖峰或電流浪涌而擔(dān)心系統(tǒng)安全?電流浪涌和電壓尖峰可能是由系統(tǒng)上運(yùn)行的軟件引起的。來自軟件的意外命令會(huì)使系統(tǒng)陷入無限循環(huán),從而導(dǎo)致電源軌上出現(xiàn)電流浪涌或電壓尖峰,并可能損壞設(shè)備。

關(guān)鍵字: 看門狗 電流浪涌
關(guān)閉