|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
CCS C编译器vs PICC 指针不能指向常数数组原因初探 |
作者:lanyong 栏目:单片机 |
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 于 2005/12/26 16:07:00 发布:
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 发布:
p=&m[9]; ? p=&m[9]; 这种写法和意图不符吧! p=m+9;即可 |
4楼: | >>参与讨论 |
作者: lanyong 于 2005/12/26 16:19:00 发布:
这样 你指针要先指向m[]才可以。 我现在还没有找到指针可以指向常数数组的方法。 |
5楼: | >>参与讨论 |
作者: bolofeng 于 2005/12/27 8:21:00 发布:
既然是常数数组,当然用常数指针喽! const CHAR *ptr; |
6楼: | >>参与讨论 |
作者: 小马 于 2005/12/27 16:16:00 发布:
同意楼上,数据类型也不符啊 |
7楼: | >>参与讨论 |
作者: lanyong 于 2005/12/27 19:44:00 发布:
确实如此:) *ptr应该是个16bit的东东吧,不然访问>255的地址如何访问. 这个我有点不太清楚. ? const CHAR *ptr; 是定义一个指针指向一个CHAR的空间,而它本身是16bit的. 估计这样才是正确的吧. picc中难道有默认指针为16bit的吗? 还是要看看picc的说明了哈. picc这个功能确实强大,哈哈. |
8楼: | >>参与讨论 |
作者: lanyong 于 2005/12/27 20:08:00 发布:
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 发布:
多谢各兄弟的指点 看来还是得多交流. 闭门造车是不行的,哈哈 |
10楼: | >>参与讨论 |
作者: pubstar 于 2006/1/12 22:25:00 发布:
优化掉了 |
11楼: | >>参与讨论 |
作者: yelongzhu 于 2009/6/22 14:23:44 发布:
你好,我想请问一下PIC编译器在哪里购买的,谢谢!我有急用。 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |