|
|||||||||||
| 技術(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)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 于 2005/6/11 20:56:00 發(fā)布:
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 于 2005/6/11 22:07:00 發(fā)布:
謝! net_walker大哥: 你這一說,我一下子明白了,多謝啊! |
|
| 4樓: | >>參與討論 |
| 作者: iamatyro 于 2005/6/11 22:36:00 發(fā)布:
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 于 2005/6/12 13:47:00 發(fā)布:
ding |
|
| 6樓: | >>參與討論 |
| 作者: net_walker 于 2005/6/12 19:18:00 發(fā)布:
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 于 2005/6/12 21:19:00 發(fā)布:
是這樣的 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 于 2005/6/12 21:48:00 發(fā)布:
re 作為函數(shù)的參數(shù) SubFun(RB_WriteByte(0x1234,0x55)); /*SubFun(0|0x12,0x34,0X55);*/ 宏定義只起一個(gè)替代的作用,把原型放到程序中,具體看一下,程序中是如何使用的就知道了。 |
|
| 9樓: | >>參與討論 |
| 作者: iamatyro 于 2005/6/12 22:12:00 發(fā)布:
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 于 2005/6/12 22:34:00 發(fā)布:
哦! 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 于 2005/6/13 11:00:00 發(fā)布:
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 于 2005/6/13 20:00:00 發(fā)布:
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 于 2005/6/13 20:14:00 發(fā)布:
還有 還有一個(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 于 2005/6/14 20:42:00 發(fā)布:
ding |
|
| 15樓: | >>參與討論 |
| 作者: iamatyro 于 2005/6/15 22:06:00 發(fā)布:
再頂一下 |
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |