我已经开发了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,但我确实无法正确地执行此操作。
提前致谢, 克里斯
答案 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
并且有效
解决