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

登錄 免費(fèi)注冊(cè) 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場(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

CCS C編譯器vs PICC 指針不能指向常數(shù)數(shù)組原因初探

作者:lanyong 欄目:單片機(jī)
CCS C編譯器vs PICC 指針不能指向常數(shù)數(shù)組原因初探
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
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
p=&m[9]; ?
p=&m[9];

這種寫法和意圖不符吧!

p=m+9;即可

4樓: >>參與討論
lanyong
這樣
你指針要先指向m[]才可以。

我現(xiàn)在還沒有找到指針可以指向常數(shù)數(shù)組的方法。

5樓: >>參與討論
bolofeng
既然是常數(shù)數(shù)組,當(dāng)然用常數(shù)指針嘍!
const CHAR *ptr;

6樓: >>參與討論
小馬
同意樓上,數(shù)據(jù)類型也不符啊
 
7樓: >>參與討論
lanyong
確實(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
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
多謝各兄弟的指點(diǎn)
看來還是得多交流.

閉門造車是不行的,哈哈

10樓: >>參與討論
pubstar
優(yōu)化掉了
 
11樓: >>參與討論
yelongzhu

你好,我想請(qǐng)問一下PIC編譯器在哪里購買的,謝謝!我有急用。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
TLC5617兩個(gè)輸出端不能同時(shí)更新
關(guān)于PIC的復(fù)位端的處理
菜鳥問題~~pic 匯編指令~
請(qǐng)教關(guān)于異步通信的問題
有用過MCP23017/6的嗎?
免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


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