|
|||||||||||
| 技術(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 |
CCS C編譯器vs PICC 指針不能指向常數(shù)數(shù)組原因初探 |
| 作者:lanyong 欄目:單片機(jī) |
CCS C編譯器指針不能指向常數(shù)數(shù)組原因初探 Lan Yong 2005.11.15 剛才玩了下CCS C編譯器指針,發(fā)現(xiàn)了指針不能指向常數(shù)數(shù)組原因。 舉例如下: #include "D:\ccs_test\test.h" unsigned int8 y; unsigned int16 *p;//=&y; const unsigned int8 m[10]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9}; void main() { while(1) { //p=&m[0]; //error! y=m[0]; y=m[1]; y=m[2]; y=m[3]; y=m[4]; y=m[5]; y=m[6]; y=m[7]; y=m[8]; y=m[9]; } } --------------------------------------------------- .................... y=m[0]; 0015: MOVLW F0 0016: MOVWF y .................... y=m[1]; 0017: MOVLW F1 0018: MOVWF y .................... y=m[2]; 0019: MOVLW F2 001A: MOVWF y .................... y=m[3]; 001B: MOVLW F3 001C: MOVWF y .................... y=m[4]; 001D: MOVLW F4 001E: MOVWF y .................... y=m[5]; 001F: MOVLW F5 0020: MOVWF y .................... y=m[6]; 0021: MOVLW F6 0022: MOVWF y .................... y=m[7]; 0023: MOVLW F7 0024: MOVWF y .................... y=m[8]; 0025: MOVLW F8 0026: MOVWF y .................... y=m[9]; 0027: MOVLW F9 0028: MOVWF y 由此可見,m[]并非是以字節(jié)的形式順序?qū)懙?a target="_blank" href="http://m.58mhw.cn/stock-ic/FLASH.html">FLASH rom中。而是將數(shù)據(jù)固化到以14/16bit命令中。 如: MOVLW 0xf0 機(jī)器碼為:30f0; 所以ccs c對(duì)常數(shù)數(shù)組的處理并不是我們通常所使用的查表的方式。正因?yàn)檫@樣的緣故,不能對(duì)其進(jìn)行尋址。而ccs這樣處理應(yīng)該來說是高效率的。 不過, 我估計(jì),我們可以用一些預(yù)先處理的方式,把該數(shù)組寫到指定的FLASH rom空間。然后通過某些芯片所支持的FLASH rom讀功能。這樣就能達(dá)到查表的目的。不過這樣做,效率不是很高,但可以節(jié)省寶貴的ram空間。 * - 本貼最后修改時(shí)間:2005-12-26 16:11:56 修改者:lanyong |
| 2樓: | >>參與討論 |
| 作者: lanyong 于 2005/12/26 16:07:00 發(fā)布:
picc的指針仍然無法訪問程序空間 #include "pic.h" unsigned CHAR y; unsigned int *p; const unsigned CHAR m[10]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9}; void main() { while(1) { p=&m[9]; //error! //Warning[000] TEST.C 15 : illegal conversion between pointer types y=*p; y=m[0]; y=m[1]; y=m[2]; y=m[3]; y=m[4]; y=m[5]; y=m[6]; y=m[7]; y=m[8]; y=m[9]; } } ///////////////////////// --- TEST.C ----------------------------- 1: #include "pic.h" 2: 3: 4: unsigned int y; 5: 6: unsigned int *p; 7: 8: const unsigned CHAR m[10]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9}; 9: 10: void main() 11: { 12: 13: while(1) 07FF 2FB3 GOTO 0x7b3 14: { 15: p=&m[9]; //error! 07B3 301D MOVLW 0x1d 07B4 00F0 MOVWF 0x70 07B5 3000 MOVLW 0 07B6 00F1 MOVWF 0x71 07B7 0870 MOVF 0x70, W 07B8 1283 BCF 0x3, 0x5 07B9 1303 BCF 0x3, 0x6 07BA 00A0 MOVWF 0x20 16: 17: y=*p; 07BB 0084 MOVWF 0x4 07BC 1383 BCF 0x3, 0x7 07BD 0800 MOVF 0, W 07BE 00A1 MOVWF 0x21 07BF 0A84 INCF 0x4, F 07C0 0800 MOVF 0, W 07C1 00A2 MOVWF 0x22 18: 19: y=m[0]; 07C2 120A BCF 0xa, 0x4 07C3 118A BCF 0xa, 0x3 07C4 2014 CALL 0x14 07C5 00A1 MOVWF 0x21 07C6 01A2 CLRF 0x22 20: y=m[1]; 07C7 3000 MOVLW 0 07C8 008A MOVWF 0xa 07C9 3001 MOVLW 0x1 07CA 2013 CALL 0x13 07CB 00A1 MOVWF 0x21 07CC 01A2 CLRF 0x22 21: y=m[2]; 07CD 3000 MOVLW 0 07CE 008A MOVWF 0xa 07CF 3002 MOVLW 0x2 07D0 2013 CALL 0x13 07D1 00A1 MOVWF 0x21 07D2 01A2 CLRF 0x22 22: y=m[3]; 07D3 3000 MOVLW 0 07D4 008A MOVWF 0xa 07D5 3003 MOVLW 0x3 07D6 2013 CALL 0x13 07D7 00A1 MOVWF 0x21 07D8 01A2 CLRF 0x22 23: y=m[4]; 07D9 3000 MOVLW 0 07DA 008A MOVWF 0xa 07DB 3004 MOVLW 0x4 07DC 2013 CALL 0x13 07DD 00A1 MOVWF 0x21 07DE 01A2 CLRF 0x22 24: y=m[5]; 07DF 3000 MOVLW 0 07E0 008A MOVWF 0xa 07E1 3 |
|
| 3樓: | >>參與討論 |
| 作者: xf.zhu 于 2005/12/26 16:12:00 發(fā)布:
p=&m[9]; ? p=&m[9]; 這種寫法和意圖不符吧! p=m+9;即可 |
|
| 4樓: | >>參與討論 |
| 作者: lanyong 于 2005/12/26 16:19:00 發(fā)布:
這樣 你指針要先指向m[]才可以。 我現(xiàn)在還沒有找到指針可以指向常數(shù)數(shù)組的方法。 |
|
| 5樓: | >>參與討論 |
| 作者: bolofeng 于 2005/12/27 8:21:00 發(fā)布:
既然是常數(shù)數(shù)組,當(dāng)然用常數(shù)指針嘍! const CHAR *ptr; |
|
| 6樓: | >>參與討論 |
| 作者: 小馬 于 2005/12/27 16:16:00 發(fā)布:
同意樓上,數(shù)據(jù)類型也不符啊 |
|
| 7樓: | >>參與討論 |
| 作者: lanyong 于 2005/12/27 19:44:00 發(fā)布:
確實(shí)如此:) *ptr應(yīng)該是個(gè)16bit的東東吧,不然訪問>255的地址如何訪問. 這個(gè)我有點(diǎn)不太清楚. ? const CHAR *ptr; 是定義一個(gè)指針指向一個(gè)CHAR的空間,而它本身是16bit的. 估計(jì)這樣才是正確的吧. picc中難道有默認(rèn)指針為16bit的嗎? 還是要看看picc的說明了哈. picc這個(gè)功能確實(shí)強(qiáng)大,哈哈. |
|
| 8樓: | >>參與討論 |
| 作者: lanyong 于 2005/12/27 20:08:00 發(fā)布:
ccs的help How can a constant data table be placed in ROM? The compiler has SUPPORT for placing any data structure into the DEVICE ROM as a constant read-only element. Since the ROM and RAM data paths are separate in the PIC®, there are restrictions on how the data is accessed. For example, to place a 10 element BYTE array in ROM use: BYTE CONST TABLE [10]= {9,8,7,6,5,4,3,2,1,0}; and to access the table use: x = TABLE [i]; OR x = TABLE [5]; BUT NOT ptr = &TABLE [i]; In this case, a pointer to the table cannot be constructed. Similar constructs using CONST may be used with any data type including structures, longs and floats. Note that in the implementation of the above table, a function call is made when a table is accessed with a subscript that cannot be evaluated at compile time. |
|
| 9樓: | >>參與討論 |
| 作者: lanyong 于 2005/12/27 20:12:00 發(fā)布:
多謝各兄弟的指點(diǎn) 看來還是得多交流. 閉門造車是不行的,哈哈 |
|
| 10樓: | >>參與討論 |
| 作者: pubstar 于 2006/1/12 22:25:00 發(fā)布:
優(yōu)化掉了 |
|
| 11樓: | >>參與討論 |
| 作者: yelongzhu 于 2009/6/22 14:23:44 發(fā)布:
你好,我想請(qǐng)問一下PIC編譯器在哪里購買的,謝謝!我有急用。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |