2013-02-26 162 views
1

我有一段我不確定的代碼會非常欣賞它的工作方式。類型轉換和指針

第一點是關於類型轉換。誰能告訴我,如果我正確地閱讀下面的代碼:

#define A_TIME   0xC0500000 
#define B_TIME   *(UINT_8 *)(A_TIME + 0x00002909) 

這是該B_TIME的輸出是一個指向8位= 0×09的無符號整數? 我不確定類型鑄造是如何工作的?它是否將8 LSB分配給B_TIME?另外,我很困惑*(UINT_8 *)?這到底意味着什麼?它是一個指向8位無符號整數的指針?

第二部分可能會清楚地知道,一旦我知道上面,但無論如何,我會張貼:

UINT_8 Timer = 0; 
Input_Time (&Timer); 



#define C_TIME     *(UINT_16 *)0xC0C0B000 
#define MASK      0x003F 

void Input_Time (UINT_8 *Time) 
{ 
    *Time = 0xC0; 
    *Time |= (UINT_8)((C_TIME >> 4) & MASK); 

    return; 
} 

什麼是*時間之後Input_Time功能的價值?有人能夠通過代碼併爲我解釋每一步嗎?

道歉的新手(這是一個字?!)的問題。

非常感謝。 詹姆斯

編輯:

OK,我很高興與以上。謝謝。現在我很困惑,在代碼中碰巧以下,Input_Time()被調用後:

#define OUT_TIME *(UINT_8 *)0xC0411297 
OUT_TIME = Timer; 

這怎麼可能?是不是OUT_TIME地址0XC0411297內的8位值?這是如何運作的?

回答

2

您正在查看的代碼看起來像訪問memory mapped registers

  1. B_TIME將訪問位於地址A_TIME一個8位的寄存器加上指定的偏移量 - 在這種情況下,這意味着0xC0502909。實際讀取的內容取決於您使用的硬件。讓我們分解一下發生的事情。B_TIME,無論在何處使用,獲取與文字代替:

    *(UINT_8 *)(A_TIME + 0x00002909) 
    

    而反過來,在A_TIME被替換爲0xC0500000,得到以下特性:

    *(UINT_8 *)(0xC0500000 + 0x00002909) 
    

    一個小工作了運算得出:

    *(UINT_8 *)(0xC0502909) 
    

    這意味着「將0xC0502909視爲指向8位值的指針,然後對其進行解引用」。

  2. 你的第二個問題遵循相同的行爲。映射爲0xC0C0B000的寄存器在調用Input_Time()時正在讀取。從該地址讀取16位值,向下降低4,然後被屏蔽。假設本實施例中的16位值,使用字母來唯一地表示該位:

    abcdefghijklmnop 
    

    降檔以4:

    0000abcdefghijkl 
    

    然後掩模(3f六角是00111111二進制)施加:

    0000000000ghijkl 
    

    然後,該結果與0xc011000000二進制)進行「或」運算,得出:

    0000000011ghijkl 
    

    該值被存儲回8位傳入的字節,返回:

    11ghijkl 
    

    給調用者。

  3. 您的新例子:

    #define OUT_TIME *(UINT_8 *)0xC0411297 
    OUT_TIME = Timer; 
    

    寫作一個值,內存地址。

+0

非常感謝你,這使得現在更有意義! 1.因此,B_TIME的值等於地址0xC0502909中存儲的任何8位值(在RAM中)。 2.你清除了我對第1部分的理解之後,很直白地理解了。 我不得不感謝您抽出時間來解釋這一點,尤其是考慮到它只有這麼短的時間。 – James 2013-02-26 18:53:54

+0

@詹姆斯,它可能不是內存,但是。 – 2013-02-26 18:55:52

+0

@詹姆斯 - 用你的新問題的答案更新。 – 2013-02-26 21:19:19

0

B_TIME的值是UINT8類型的值。

#define B_TIME *(UINT_8 *)(A_TIME + 0x00002909) 

*操作者解除引用指針UINT8在下面的表達式:

(UINT_8 *)(A_TIME + 0x00002909)

在以上表達式中的整數常量表達式A_TIME + 0x00002909通過的平均值轉換爲指針UINT8演員(UINT8 *)