国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

linux內(nèi)核中S3C6410 timer相關(guān)代碼理解

發(fā)布者:WanderlustSoul最新更新時(shí)間:2024-09-25 來(lái)源: elecfans關(guān)鍵字:linux內(nèi)核  S3C6410  timer 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

本文描述基于mini6410平臺(tái)的time.c中的相關(guān)代碼,主要描述下對(duì)部分代碼的理解。


先貼上代碼:


 1 /* we use the shifted arithmetic to work out the ratio of timer ticks

 2  * to usecs, as often the peripheral clock is not a nice even multiple

 3  * of 1MHz.

 4  *

 5  * shift of 14 and 15 are too low for the 12MHz, 16 seems to be ok

 6  * for the current HZ value of 200 without producing overflows.

 7  *

 8  * Original patch by Dimitry Andric, updated by Ben Dooks

 9 */

10 

11 /* timer_mask_usec_ticks

12  *

13  * given a clock and divisor, make the value to pass into timer_ticks_to_usec

14  * to scale the ticks into usecs

15 */

16 static inline unsigned long

17 timer_mask_usec_ticks(unsigned long scaler, unsigned long pclk)

18 {

19     unsigned long den = pclk / 1000;

20 

21     return ((1000 << TIMER_USEC_SHIFT) * scaler + (den >> 1)) / den;

22 }


該函數(shù)主要的功能為換算出在某個(gè)時(shí)鐘頻率下,每個(gè)時(shí)鐘周期所對(duì)應(yīng)的微秒數(shù),且該微秒數(shù)經(jīng)過(guò)放大處理。


首先第19行代碼將時(shí)鐘頻率由MHZ轉(zhuǎn)換為KHZ,當(dāng)然前提是pclk以MHZ為單位計(jì)算。


分析下一行代碼前,先看下頻率轉(zhuǎn)換為微秒的計(jì)算公式:t = (10^6)/(pclk/scaler),上述公式表示在分頻后的時(shí)鐘頻率下一個(gè)時(shí)鐘周期對(duì)應(yīng)的微秒數(shù)。顯然上述公式可能出現(xiàn)小數(shù)部分,在計(jì)算機(jī)中我們用整型變量來(lái)保存數(shù)據(jù)時(shí),為了不減小精度,一般會(huì)將數(shù)據(jù)放大處理,因此將上述公式放大一定的倍數(shù),在得到最后結(jié)果前,再縮小相應(yīng)的倍數(shù)得到最后結(jié)果。在這里將上述公式放大了2^16倍,得到公式:


t = (10^6)*(2^16)/(pclk/scaler),


對(duì)上述公式變量替換并推導(dǎo):t = ((10^6)/1000)*(2^16)/((pclk/1000)/scaler)


   = ((10^3)<<16)/(den/scaler)


   = ((1000<<16)*scaler)/den。


    為了減小誤差,對(duì)上述公式進(jìn)行四舍五入則得到公式:


  ((1000<<16)*scaler)/den + (1/2) = ((1000<<16)*scaler)/den + (den/2den)


  = ((1000<<16)*scaler+den/2)/den


  = ((1000<<16)*scaler+(den>>1))/den。


      TIMER_USEC_SHIFT宏定義為16,由此第21行代碼便不言而喻了。


關(guān)于第5、6行注釋的理解:12MHZ轉(zhuǎn)換為微秒為(10^6)/(12*10^6)=1/12=0.08333333333 將其放大保存在整型變量里,這里是說(shuō)放大系數(shù)為2^15或2^14顯得太低,精度不夠。因此設(shè)置放大系數(shù)為2^16,并且2^16不會(huì)導(dǎo)致200HZ的頻率上溢。200HZ頻率表示5毫秒產(chǎn)生一個(gè)中斷,假設(shè)時(shí)鐘頻率就是12M,則5毫秒需要12*(10^6)*(5/1000)=60000個(gè)時(shí)鐘周期。((10^6)/(12*10^6))*(2^16)=5462(約等于), 5462*60000=0x13889C40,沒(méi)有造成溢出。個(gè)人理解,如有錯(cuò)誤之處,還請(qǐng)多多提點(diǎn)。


接下來(lái)再看另一段代碼:


 1 /* timer_ticks_to_usec

 2  *

 3  * convert timer ticks to usec.

 4 */

 5 

 6 static inline unsigned long timer_ticks_to_usec(unsigned long ticks)

 7 {

 8     unsigned long res;

 9 

10     res = ticks * timer_usec_ticks;

11  

12     res += 1 << (TIMER_USEC_SHIFT - 4);    /* round up slightly */

13 

14     return res >> TIMER_USEC_SHIFT;

15 }


該函數(shù)的主要功能是將時(shí)鐘周期數(shù)轉(zhuǎn)換為微秒數(shù),第10行代碼中全局變量timer_usec_ticks為由timer_mask_usec_ticks函數(shù)返回得到的值。該值乘以具體時(shí)鐘周期數(shù)便得到該時(shí)鐘周期數(shù)對(duì)應(yīng)的微秒數(shù)。后面第12行又加上了一個(gè)值,該值目的是進(jìn)行向上取整處理,以提高精度。第14行代碼右移處理便是將上面進(jìn)行放大倍數(shù)處理后的值還原為實(shí)際的結(jié)果值。


1<<(TIMER_USEC_SHIFT - 4) = 2^12,  (2^12/2^16) 小于 1,因此起到向上取整的作用。


關(guān)鍵字:linux內(nèi)核  S3C6410  timer 引用地址:linux內(nèi)核中S3C6410 timer相關(guān)代碼理解

上一篇:ARM11 S3C6410 硬件浮點(diǎn)(VFP)實(shí)現(xiàn)
下一篇:玩轉(zhuǎn)S3C6410之一 交叉工具鏈制作(gcc4.5.1-armv6-vfp)

推薦閱讀最新更新時(shí)間:2025-06-30 12:55

S3C6410的PWM驅(qū)動(dòng)實(shí)例
我們使用PWM來(lái)控制蜂鳴器,主要是兩種功能,一是使能蜂鳴器,并設(shè)置其頻率;二是禁止蜂鳴器。這些操作均可通過(guò)ioctl來(lái)完成。所以在pwm的設(shè)備驅(qū)動(dòng)中,主要也就是ioctl這個(gè)函數(shù)。 首先,我們要定義兩個(gè)命令,用在ioctl函數(shù)中的switch語(yǔ)句中,至于怎么來(lái)定義這兩個(gè)命令呢?其實(shí)簡(jiǎn)單的做法,我們可以將其定義為兩個(gè)不同的常量,能用在switch語(yǔ)句中即可,但是這樣會(huì)造成一定的問(wèn)題。例如,其他的設(shè)備也有支持設(shè)個(gè)命令的,例如串口支持設(shè)置波特率等,很有可能在寫代碼時(shí)不小心,寫成了串口,結(jié)果調(diào)用的時(shí)候,驅(qū)動(dòng)沒(méi)報(bào)錯(cuò),因?yàn)榇谝仓С诌@個(gè)命令,解決辦法就是不同的設(shè)備支持不同的命令號(hào),及時(shí)目前有一部分驅(qū)動(dòng)依舊是使用之前的那種簡(jiǎn)單定義命令號(hào)的方
[單片機(jī)]
基于S3C6410的ARM11學(xué)習(xí)(十五) MMU來(lái)了
如今,已經(jīng)是到了main的世界了。下面就要來(lái)體驗(yàn)ARM11的MMU,這個(gè)東西在STM32中是沒(méi)有的。之前在核心初始化過(guò)程中,是將MMU功能給關(guān)閉的。那是因?yàn)槟莻€(gè)時(shí)候,操作的都是物理地址,所以需要將MMU關(guān)閉。 MMU,內(nèi)存管理單元。主要是有兩個(gè)作用: 1、 將虛擬地址轉(zhuǎn)化為物理地址 2、 內(nèi)存的訪問(wèn)權(quán)限管理 上面這個(gè)圖就說(shuō)明了MMU的作用。 有三個(gè)任務(wù)在運(yùn)行,運(yùn)行的地址都是0x400000,如果不進(jìn)行處理,這肯定是不行的。所以加入了MMU,MMU其實(shí)就是一個(gè)頁(yè)表。將虛擬地址通過(guò)查表的方式,對(duì)應(yīng)到物理地址去。雖然三個(gè)任務(wù)的運(yùn)行地址都是0x400000,但是這個(gè)地址是虛擬地址,在頁(yè)表中,將每個(gè)任務(wù)的虛擬地址對(duì)
[單片機(jī)]
基于<font color='red'>S3C6410</font>的ARM11學(xué)習(xí)(十五) MMU來(lái)了
基于S3C6410的ARM11學(xué)習(xí)(六) 核心初始化之關(guān)閉所有中斷
上一次,我們完成了核心初始化之關(guān)閉看門狗了。下面就要關(guān)閉所有中斷了。因?yàn)檫@個(gè)時(shí)候還在初始化整個(gè)硬件環(huán)境,應(yīng)用程序還沒(méi)有開(kāi)始跑,所以是不希望有中斷產(chǎn)生來(lái)打斷CPU工作的。 中斷是嵌入式系統(tǒng)中很重要的東西了。因?yàn)橛辛诉@個(gè)東西,可以使CPU解放出來(lái),做更多的事。 學(xué)單片機(jī)的時(shí)候,對(duì)于按鍵,我們可以采用輪詢檢測(cè),隔一段時(shí)間就去檢測(cè)看看按鍵有沒(méi)有按下,有按下的話就進(jìn)行處理。沒(méi)有的話就跳過(guò)。而使用外部中斷后,就不必檢測(cè)了,外部中斷會(huì)自動(dòng)檢測(cè),就不用CPU檢測(cè)了。當(dāng)外部中斷有效后,外部中斷模塊就會(huì)產(chǎn)生一個(gè)中斷源給CPU,CPU檢測(cè)到這個(gè)中斷源,再去執(zhí)行對(duì)應(yīng)的中斷處理函數(shù)。比輪詢法效率 要高很多了。 至于S3C6410的中斷的具體的一
[單片機(jī)]
基于<font color='red'>S3C6410</font>的ARM11學(xué)習(xí)(六) 核心初始化之關(guān)閉所有中斷
s3c6410 s3c2440串口發(fā)送接收數(shù)據(jù)的實(shí)現(xiàn)(輪詢)及相關(guān)寄存器
1 6410與串口相關(guān)寄存器 一 需要設(shè)置的寄存器(其實(shí)進(jìn)入uboot后,串口已經(jīng)設(shè)置好了,直接發(fā)送數(shù)據(jù)就行了,) 1)模式 UCON (輪詢,中斷,DMA等) 2)相關(guān)參數(shù) ULCON0 定義了串口數(shù)據(jù)的幀格式,數(shù)據(jù)位長(zhǎng)度,奇偶校驗(yàn)位,停止位(8-N-1) BRDIV 定義了波特率的計(jì)算公式所得結(jié)果的整數(shù)部分 UDIVSLOT0 定義了波特率的計(jì)算公式所得結(jié)果的小數(shù)部分 3)高級(jí)選項(xiàng)(串口的發(fā)送接收緩沖的大?。╢ifo)默認(rèn)是1B,可改成64B 二 發(fā)送接收數(shù)據(jù) 相關(guān)的寄存器 UTXH0 UART channel 0 transmit buffer register URXH0 UART chan
[單片機(jī)]
Samsung_tiny4412(驅(qū)動(dòng)筆記08)----jiffies,timer,kthread,workqueue,tasklet
/*********************************************************************************** * * jiffies,timer,kthread,workqueue,tasklet * * 聲明: * 1. 本系列文檔是在vim下編輯,請(qǐng)盡量是用vim來(lái)閱讀,在其它編輯器下可能會(huì) * 不對(duì)齊,從而影響閱讀. * 2. 本文中有些源代碼沒(méi)有全部帖出來(lái),主要是因?yàn)槠蟮脑? * 3. 基于2中的原因,本文借鑒了python中的縮進(jìn)代碼風(fēng)格進(jìn)行代碼的體現(xiàn): *
[單片機(jī)]
s3c6410硬件RTC實(shí)時(shí)時(shí)鐘
1、OVERVIEW綜述 The Real Time Clock (RTC) unit can be operated by the backup battery when the system power is off. The data include the time by second, minute, hour, date, day, month, and year. The RTC unit works with an external 32.768 KHz crystal and can perform the alarm function. 當(dāng)系統(tǒng)電源關(guān)閉時(shí),通過(guò)備用電源可以運(yùn)行實(shí)時(shí)時(shí)鐘(RTC)單元。數(shù)據(jù)包含的
[單片機(jī)]
<font color='red'>s3c6410</font>硬件RTC實(shí)時(shí)時(shí)鐘
MSP430——Timer(輸出比較編碼器測(cè)速)
之前寫過(guò)關(guān)于定時(shí)器輸出PWM波的簡(jiǎn)便方法和利用定時(shí)器測(cè)量頻率,由于之前采用的測(cè)周法,這個(gè)方法當(dāng)時(shí)測(cè)量的頻率是非常精準(zhǔn)的,但是對(duì)于測(cè)速度而言,我們采用PID算法的話,就會(huì)使得輪子停止響應(yīng)非常的迅速,在之前算法的基礎(chǔ)上,這個(gè)當(dāng)輪子突然停止,也就是說(shuō)突然一下沒(méi)有外來(lái)脈沖了,會(huì)導(dǎo)致頻率計(jì)算出錯(cuò),維持一個(gè)定值,按理來(lái)說(shuō)應(yīng)該是零的(如果能夠從算法上解決這個(gè)問(wèn)題的話,麻煩大佬們?cè)u(píng)論區(qū)傳授一下方法),因此,今天開(kāi)始嘗試?yán)脺y(cè)頻法進(jìn)行速度測(cè)量,相應(yīng)的使用的就是定時(shí)器的輸出比較功能,即開(kāi)一定時(shí)間的定時(shí)器,再打開(kāi)IO中斷捕捉上升沿或者下降沿,每隔一定時(shí)間,獲取IO中斷捕獲的上升沿或者下降沿的脈沖數(shù),從而達(dá)到計(jì)算速度的目的。 第一步:初始化對(duì)應(yīng)定時(shí)器
[單片機(jī)]
MSP430 G2553 Timer 中斷總結(jié)
目前總共用到了四個(gè)中斷向量,我覺(jué)得已經(jīng)把G2553的所有定時(shí)器中斷都用到了。 定時(shí)器有兩個(gè),TA0與TA1,每個(gè)定時(shí)器又有兩個(gè)中斷向量 1,CCR0到達(dá)時(shí)的中斷,在計(jì)數(shù)模式時(shí)候很有用,平時(shí)定時(shí)器的基本功能。 2,CCR1,CCR2,以及 overflow時(shí)候的中斷向量,這里面又有三個(gè)中斷標(biāo)志。 #define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0 Timer0)A CC1, TA0 */ #define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */ . . #define TIMER1_A1_VECTOR (12 *
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved