音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

C語(yǔ)言中的難點(diǎn)

作者:iamatyro 欄目:單片機(jī)
C語(yǔ)言中的難點(diǎn)
C語(yǔ)言中的難點(diǎn)1#
各路大俠有下面的一個(gè)宏定義:
// Read or Write to a given register
#define   ReadRegByte(W_RegAddr)    \
    (*(BYTE volatile* volatile)(W_RegAddr))

小弟的C語(yǔ)言基礎(chǔ)不好,請(qǐng)教各路大俠,上面的宏定義中的:
(*(BYTE volatile* volatile)(W_RegAddr))
是定義了一個(gè)指向指針的指針W_RegAddr,還是定義了一個(gè)指針變量W_RegAddr?
小弟最為不懂的是(BYTE volatile* volatile)中的第二個(gè)volatile,前面已有了一個(gè)volatile了,為何還要后面的這個(gè)volatile?我認(rèn)為可以把這第二個(gè)volatile省掉。因?yàn)槲覍W(xué)習(xí)的C語(yǔ)言教材對(duì)一般指向指針的指針定義是:
          類型名 ** 指針變量名
在指針變量名前,**后并沒有再要一個(gè)類型名啊!


* - 本貼最后修改時(shí)間:2005-6-11 22:38:04 修改者:iamatyro

2樓: >>參與討論
net_walker
re
我的理解是:
#define   ReadRegByte(W_RegAddr)    \
    (*(BYTE volatile* volatile)(W_RegAddr))
是一個(gè)宏定義,把W_RegAddr強(qiáng)制轉(zhuǎn)換成一個(gè)指針,然后取指針內(nèi)容,也就是讀W_RegAddr寄存器內(nèi)容。
指針定義時(shí),有修飾符部分可以對(duì)變量做修飾說明,當(dāng)然修飾部分是可選的。

BYTE volatile* volatile)(W_RegAddr))
第一個(gè)volatile說明指針的對(duì)象。第二個(gè)volatile用來(lái)說明指針本身。


* - 本貼最后修改時(shí)間:2005-6-11 20:58:03 修改者:net_walker

3樓: >>參與討論
iamatyro
謝!
net_walker大哥:
你這一說,我一下子明白了,多謝啊!

4樓: >>參與討論
iamatyro
C語(yǔ)言中的難點(diǎn)2#
下面的這個(gè)宏定義右邊的值是不是通過逗號(hào)表達(dá)式來(lái)求解?
#define RB_WriteByte(address,bdata) \
            (BYTE) RBWriteByte | END_MASK((BYTE)byte1(address)), (BYTE) byte0(address), (BYTE) (bdata)
注:其中
#define RBWriteByte         0
#define END_MASK(a)        ((a) & 0x7F)
#define byte1(a)           (((a) >> 8) & 0xff)
#define byte0(a)           (0xff & (a))

* - 本貼最后修改時(shí)間:2005-6-11 22:45:06 修改者:iamatyro

5樓: >>參與討論
iamatyro
ding
 
6樓: >>參與討論
net_walker
re
#define RB_WriteByte(address,bdata) \
            (BYTE) RBWriteByte | END_MASK((BYTE)byte1(address)), (BYTE) byte0(address), (BYTE) (bdata)
這個(gè)定義是想說明什么?向address中寫入bdata嗎?
程序中
RB_WriteByte(0x1234,0x55);
/*(BYTE)0|0x12,0x34,0X55  */
不知道你程序具體實(shí)現(xiàn)了什么功能?
看起來(lái)好像是作為函數(shù)的參數(shù)用。
SubFun(RB_WriteByte(0x1234,0x55));

* - 本貼最后修改時(shí)間:2005-6-12 19:21:37 修改者:net_walker

7樓: >>參與討論
iamatyro
是這樣的
net_walker大哥:原來(lái)的程序是這樣的:

typedef unsigned CHAR   gm_RegBlockType;
    
    // macros to generate regblock array of opcode, address, data tuples
    //  note that each tuple may consist of between 3 and 6 bytes.
    #define gm_DefineRegBlock(NAME) \
       gm_RegBlockType ROM NAME [] = {
    //  Caution, address should be <= 0x3ff as address does not get masked before being ored with command
    //    if register NAMEs from gmax_reg.h are used this constraint will be enforced automatically
    #define RB_Delay(ms2delay) \
         (BYTE) RBDelay, (BYTE) (ms2delay)
    
    #define RB_DelayEnd(ms2delay) \
         (BYTE) (RBDelay | RegBlockEnd), (BYTE) (ms2delay) };
    
    #define RB_WriteByte(address,bdata) \
            (BYTE) RBWriteByte | END_MASK((BYTE)byte1(address)), (BYTE) byte0(address), (BYTE) (bdata)
    
    #define RB_WriteWord(address,wdata) \
            (BYTE) RBWriteWord | END_MASK((BYTE)byte1(address)), (BYTE) byte0(address), \
            (BYTE) byte1(wdata), (BYTE) byte0(wdata)
    
    #define RB_WriteTriBytes(address,ddata) \
            (BYTE) RBWriteTriBytes | END_MASK((BYTE)byte1(address)), (BYTE) byte0(address), \
            (BYTE) byte2(ddata), (BYTE) byte1(ddata), (BYTE) byte0(ddata)
    
    #define RB_WriteDWord(address,ddata) \
            (BYTE) RBWriteDWord | END_MASK((BYTE)byte1(address)), (BYTE) byte0(address), \
            (BYTE) byte3(ddata), (BYTE) byte2(ddata), (BYTE) byte1(ddata), (BYTE) byte0(ddata)
    
    #define RB_WriteByteEnd(address,bdata) \
            (BYTE) RegBlockEnd | RBWriteByte | END_MASK((BYTE)byte1(address)), (BYTE) byte0(address), (BYTE) (bdata) };
    
    #define RB_WriteWordEnd(address,wdata) \
            (BYTE) RegBlockEnd | RBWriteWord | END_MASK((BYTE)byte1(address)), (BYTE) byte0(address), \
            (BYTE) byte1(wdata), (BYTE) byte0(wdata) };
    
    #define RB_WriteTriBytesEnd(address,ddata) \
            (BYTE) RegBlockEnd | RBWriteTriBytes | END_MASK((BYTE)byte1(address)), (BYTE) byte0(address), \
            (BYTE) byte2(ddata), (BYTE) byte1(ddata), (BYTE) byte0(ddata) };
我理解是用宏定義定義了一個(gè)龐大的數(shù)組的開始"{"和結(jié)束"}"符以及數(shù)組內(nèi)的各數(shù)組元數(shù),為了用簡(jiǎn)單的表達(dá)方式來(lái)表達(dá)復(fù)雜的表達(dá)式,故用了宏定義.但宏定義右邊的值是不是通過逗號(hào)表達(dá)式來(lái)求解?


8樓: >>參與討論
net_walker
re
作為函數(shù)的參數(shù)
SubFun(RB_WriteByte(0x1234,0x55));
/*SubFun(0|0x12,0x34,0X55);*/
宏定義只起一個(gè)替代的作用,把原型放到程序中,具體看一下,程序中是如何使用的就知道了。

9樓: >>參與討論
iamatyro
net_walker大哥,下面是一個(gè)具體.c文件中的應(yīng)用
      .
      .
      .
void fun1(void)
{...}
//******************************************************************
// STRUCTURE    :   SystemInitBlock
// USAGE        :   Describes required initial register cotent
// DESCRIPTION  :   -Initializes SYSTEM clocks
//******************************************************************
gm_DefineRegBlock(SystemInitBlock)

    /********************************************************************/
    /*    Initialize:  GPIO                                            */
    /********************************************************************/
    // enable OUTPUT and use TCLK/512 as clock
    RB_WriteByte( PWM0_CONFIG,        PWM0_GPIOn_EN | PWM0_CLKSEL | PWM0_TCLK_DIV),
    RB_WriteByte( PWM0_PERIOD,        0xFF), // set period to max ie. about 54.62 hz for 14.318 Mhz tclk
    RB_WriteByte( PWM0_PULSE,        0xFF),
            .
            .
            .
RB_WriteByteEnd(HOST_CONTROL,    IPFORCE_UPDATE | DPFORCE_UPDATE)
void fun2(void)
{...}

* - 本貼最后修改時(shí)間:2005-6-12 22:22:10 修改者:iamatyro

10樓: >>參與討論
iamatyro
哦!
net_walker大哥,上面的應(yīng)用好象是在程序中對(duì)一個(gè)大型數(shù)組進(jìn)行初始化,數(shù)組中各元素也就是數(shù)組中的各宏定義實(shí)際上完成了對(duì)MCU的寄存器的集體初始化,也就是用一個(gè)大型數(shù)組完成了對(duì)一批寄存器的初始化,對(duì)不對(duì)?因?yàn)槲以诔绦蛑胁]有看到它出現(xiàn)在函數(shù)中或哪個(gè)函數(shù)的參數(shù)中.不過這個(gè)初始化為何沒有出現(xiàn)在某個(gè)函數(shù)中,或出現(xiàn)在所有的函數(shù)之前,而是出現(xiàn)在兩個(gè)函數(shù)之間呢?

* - 本貼最后修改時(shí)間:2005-6-12 22:42:37 修改者:iamatyro

11樓: >>參與討論
sanzoh
1
就照你自己理解
但要說“寄存器”恐怕不對(duì)吧?都“rom”了寫不了吖?
我看也就是注冊(cè)一些信息供初始化
每個(gè)元組3-6個(gè)字節(jié)不等,有一個(gè)元組結(jié)束位標(biāo)志,使用宏的時(shí)候要自己寫,號(hào)
特定塊的最后一個(gè)元組還要有塊結(jié)束位標(biāo)志,自動(dòng)加};號(hào)
讀每一個(gè)元組后 當(dāng)然還要分析上面兩個(gè)標(biāo)志位的情況

出現(xiàn)位置 哪里后面要用那就定義 但是絕不會(huì)在函數(shù)里面,那個(gè)地方只有局部數(shù)據(jù)!棧塌人亡!

12樓: >>參與討論
iamatyro
re:
sanzoh大哥的眼睛毒啊,"但要說“寄存器”恐怕不對(duì)吧?都“rom”了寫不了吖?"我通過一步步展開,從最后展開的情況看,數(shù)組確實(shí)不是對(duì)一批寄存器的初始化(已固定在rom中了,如何還初始化?不過從另個(gè)角度也可認(rèn)為是初始化,可不可這樣理解?),而是一張表,后來(lái)我又從其它地方看到有
gm_WriteRegBlock(SystemInitBlock);顯然將數(shù)組名作為函數(shù)參數(shù).現(xiàn)在我算徹底明白了,謝謝net_walker,sanzoh兩位大哥!

舉一例,上述所說的寄存器數(shù)組及其中第一個(gè)和最后一個(gè)元素分別是:
gm_DefineRegBlock(SystemInitBlock)
        .
        .
        .
RB_WriteByte( PWM0_PULSE,    0xFF),
RB_WriteByteEnd(HOST_CONTROL,    IPFORCE_UPDATE | DPFORCE_UPDATE)
則這它們展開分別為:
gm_RegBlockType ROM SystemInitBlock[]={
        .
        .
        .
(BYTE)0 | (((BYTE)(((PWM0_PULSE) >> 8) & 0xff)) & 0x7F),(BYTE)(0xff & (PWM0_PULSE)),(BYTE)(0xFF),
(BYTE)(1<<7) | (BYTE)0 | (((BYTE)(((OST_CONTROL) >> 8) & 0xff)) & 0x7F),(BYTE)(0xff & (OST_CONTROL)),(BYTE)((0x08)|0x10)}
其中:
/****************************************************************************/
/*  REGISTER   DEFINITION                              */
/****************************************************************************/

#define HOST_CONTROL    0x8000
#define PWM0_PULSE    0x8032
    
/****************************************************************************/
/*  B I T   D E F I N I T I O N S                                           */
/****************************************************************************/

#define IPFORCE_UPDATE  0x08
#define DPFORCE_UPDATE  0x10
顯然這個(gè)數(shù)組進(jìn)一步展開為:
gm_RegBlockType ROM SystemInitBlock[]={
                寄存器高字節(jié)地址  寄存器低字節(jié)地址   寄存器數(shù)據(jù)
                    0x00,            0x32,           0xff,
                                      .
                                      .
                                      .
                    0x80,            0x00,           0x18
                    }

* - 本貼最后修改時(shí)間:2005-6-13 20:20:19 修改者:iamatyro

13樓: >>參與討論
iamatyro
還有
還有一個(gè)問題請(qǐng)教,就是一個(gè)無(wú)符號(hào)的長(zhǎng)整數(shù),通過類型BYTE強(qiáng)制轉(zhuǎn)換后是不是無(wú)論這個(gè)無(wú)符號(hào)的長(zhǎng)整數(shù)有多長(zhǎng),都是取該長(zhǎng)整數(shù)的最后一個(gè)字節(jié)的數(shù)據(jù),如:
(BYTE)(0x123456UL)=0x56
因我沒有仿真手段,不能通過仿真來(lái)看到結(jié)果,故請(qǐng)教.謝謝!

14樓: >>參與討論
iamatyro
ding
 
15樓: >>參與討論
iamatyro
再頂一下
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
89C52I/O口輸出狀態(tài),求救!急…………
我是一名即將畢業(yè)的大四生,我想搞技術(shù)......
簡(jiǎn)單程序,為什么老通不過編譯呢?
求救:Mifare RC500 讀卡器芯片總是不能復(fù)位
關(guān)于5045存儲(chǔ)數(shù)據(jù)被隨機(jī)修改的問題,有興趣的進(jìn)來(lái)看看!!!
免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)