登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

CCS C编译器vs PICC 指针不能指向常数数组原因初探

作者:lanyong 栏目:单片机
CCS C编译器vs PICC 指针不能指向常数数组原因初探
CCS C编译器指针不能指向常数数组原因初探

     Lan Yong
     2005.11.15    

刚才玩了下CCS C编译器指针,发现了指针不能指向常数数组原因。

举例如下:

#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[]并非是以字节的形式顺序写到FLASH rom中。而是将数据固化到以14/16bit命令中。
如:
MOVLW 0xf0
机器码为:30f0;

所以ccs c对常数数组的处理并不是我们通常所使用的查表的方式。正因为这样的缘故,不能对其进行寻址。而ccs这样处理应该来说是高效率的。


不过, 我估计,我们可以用一些预先处理的方式,把该数组写到指定的FLASH rom空间。然后通过某些芯片所支持的FLASH rom读功能。这样就能达到查表的目的。不过这样做,效率不是很高,但可以节省宝贵的ram空间。



* - 本贴最后修改时间: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[]才可以。

我现在还没有找到指针可以指向常数数组的方法。

5楼: >>参与讨论
bolofeng
既然是常数数组,当然用常数指针喽!
const CHAR *ptr;

6楼: >>参与讨论
小马
同意楼上,数据类型也不符啊
 
7楼: >>参与讨论
lanyong
确实如此:)
*ptr应该是个16bit的东东吧,不然访问>255的地址如何访问.

这个我有点不太清楚.

?  const CHAR *ptr;
是定义一个指针指向一个CHAR的空间,而它本身是16bit的.

估计这样才是正确的吧.

picc中难道有默认指针为16bit的吗?

还是要看看picc的说明了哈.

picc这个功能确实强大,哈哈.

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
多谢各兄弟的指点
看来还是得多交流.

闭门造车是不行的,哈哈

10楼: >>参与讨论
pubstar
优化掉了
 
11楼: >>参与讨论
yelongzhu

你好,我想请问一下PIC编译器在哪里购买的,谢谢!我有急用。

参与讨论
昵称:
讨论内容:
 
 
相关帖子
TLC5617两个输出端不能同时更新
关于PIC的复位端的处理
菜鸟问题~~pic 汇编指令~
请教关于异步通信的问题
有用过MCP23017/6的吗?
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号