C函数基于指向const的指针

时间:2016-08-03 08:36:51

标签: c pointers pic

我已经开发了PIC代码,我很满意。 问题是我的变量是推送到RAM并且几乎已满。

我在数据数组前尝试过const,但是后来基于const数组指针的函数失败了。

有人可以告诉我如何定义指针吗?

这就是我现在所拥有的:

#define type     unsigned int8
#define memType  const type
memType n_006 = 2;
type l_006[n_006]={0x03, 0xFF};

功能:

void writeLine(type adress, type *send, int8 numS)
{
   int8 i = 0;
   i2c_start();
   i2c_write(adress);  
   for(i = 0; i < numS; i++)
   {
      int8 toSend = send[i];
      i2c_write(toSend);
   }
   i2c_stop();
}

主要是:

 writeLine(a1, &l_006[0], n_006);

主要目标是将数据保存在ROM中,我猜可以在前面使用const,但我确实无法正确地执行此操作。

提前致谢, 克里斯

3 个答案:

答案 0 :(得分:1)

您的编译器可能支持为全局变量显式分配存储空间的额外说明符(EEPROM等)。

使用typedef代替宏也好得多。

typedef unsigned int8 type, *ptype;
typedef const type memType;
memType n_006 = 2;
type l_006[n_006]={0x03, 0xFF};

你也可以完全摆脱n_006,只需使用众所周知的sizeof技巧:

writeLine(a1, l_006, sizeof l_006 / sizeof l_006[0]);

答案 1 :(得分:0)

正如serhio所说,检查您的特殊编译器说明符。例如在XC8编译器上(它没有int8,所以我必须使用char)

const unsigned char ylist[] = { 0x03, 0xFF };

生成

stringdir:  
    movlw   high stringdir
    movwf   10
    movf    4,w
    incf    4,f
    addwf   2,f
__stringbase:   
    retlw   0
__end_of__stringtab:    
_ylist: 
    retlw   3
    retlw   255
__end_of_ylist;

但是使用关键字eeprom而不是const

eeprom unsigned char ylist[] = { 0x03, 0xFF };

生成

_ylist: 
;initializer for _ylist
    db  3
    db  255

它占用了一半的空间,并且没有字符串转换例程。它的运行速度也可能更快。

答案 2 :(得分:0)

我使用CCS C编译器

我用过:

#define type     unsigned int8
#define memType  const type
#define tabType  rom type

并且有效

解决