嵌入式系統中實時時問的獲取
Linux系統中有三種類型的設備:字符設備、塊設備和網絡設備。字符設備是指發送和接收數據以字符的形式進行,無需緩沖直接存取,在對字符設備發出讀寫請求后,實際的硬件I/0隨即發生;而塊設備則是對數據緩沖區進行讀寫并可以隨機訪問,操作是以塊為單位。而網絡設備與字符設備、塊設備有很大的不同,用于對網絡設備的控制和管理。DSl302顯然屬于字符設備。
2.6版本的Linux內核和2.4版本存在很大的不同,在模塊的開發和設計上也是如此。在這里使用的內核版本是Linux一2.6.13。首先,驅動程序作為一個模塊可以動態加載進內核也可以動態的從內核中卸載掉,在加載和卸載的過程中實際伴隨的是驅動程序向內核的注冊與注銷。在驅動程序的代碼中會有兩個函數分別在模塊加載和卸載過程中調用DSl302_init()、DSl302_exit(),在其中再調用register_chrdev()、unregister_chrdev()用以向內核注冊和注銷一個設備驅動程序。在2.6內核版本中,用如下方法聲明這兩個函數給內核:
Module_init(DS1302_init):
Module_exit(DSl302_exit):
在DSl302_init()函數中除調用字符設備的注冊函數外,還有一個重要任務,就是配置需要用到的三條I/0口線:PBO、PBl0、PBll。配置過程包括:B端口控制器時鐘使能、通用I/O口使能、輸出使能、上拉電阻使能、三個口線上的同步數據輸出使能,另外通過置PIOB_CODR寄存器使三個引腳輸出低電平。代碼如下:本文引用地址:http://www.104case.com/article/152515.htm
其中va_sys是一個結構體,包含了AT9lRM9200處理器內的全部寄存器,通過一條語句:AT91PS_SYS va_sys=(AT91PS SYS)AT91C_VA_BASE_SYS,把所有寄存器的最低地址賦給va_sys,這樣結構體中的寄存器名稱就和實際的地址對應起來了。注意:這里用到的地址都是經過映射過的虛擬地址,在實際運行中會通過處理器內部的MMU單元轉換為實際的物理地址發往地址總線。上述代碼中的AT91C_PI0_PBO等等是一些常數的宏定義用于寄存器賦值,比如:#define AT9lC_PIO_PBO(10),它們定義在AT91RM9200.h頭文件中。
在驅動程序中,file_operations是一個重要的結構體,通過它把針對設備的具體操作注冊給內核的統一接口。結構體中全是函數指針,DSl302驅動程序中用到的函數有:open、release、ioctl,用于設備的打開與釋放、設備的讀寫以及設備的控制。對DSl302的讀寫都是在dsl302_ioctl()中調用相應的讀寫函數實現的。
下面具體分析一下驅動程序中向DSl302發送單個字
代碼中用到的at91_set_gpi0_value()函數定義在內核的Gpio.c文件中,最終是對10控制器的PIO_SODR(置位輸出數據寄存器)或PIO_CODR(清零輸出數據寄存器)賦值以使相應引腳輸出需要的電平。
經過測試,短時間內誤差不明顯,但時鐘芯片存在積累誤差并且易受環境影響,連續幾天運行下來,誤差有數秒之多。所以,嵌入式系統需要通過某種方法定期使用標準時間向時鐘芯片對時,以消除誤差。下面要介紹的GPS接收機方案就可以做到這點。
評論