使用strcpy、strcat、sprintf等常规字符串函数,编译后发现SRAM空间爆增,原来编译器会把字符串 "x2.bco=RED\xff\xff\xff"编译到SRAM空间。
sprintf(HMI_string , "x2.bco=RED\xff\xff\xff");
如何让编译器把字符串 "x2.bco=RED\xff\xff\xff"编译到FLASH空间呢?
一、勾选 Strings in FLASH only
ICCAVR 7.22编译器勾选 Strings in FLASH only,表示所有的字符串定义在FLASH空间。
二、使用支持FLASH空间字符串函数
在C:\iccv7avr\include\STRING.H文件中,包含有二套字符串函数,一套是常规的字符串函数(例如:strcpy、strcat、sprintf),编译后会将入口参数的字符串常量编译到SRAM空间;另外一套是FLASH字符串函数(例如:cstrcpy、cstrcat、csprintf),编译后会将入口参数的字符串常量编译到FLASH空间。
1、使用支持FLASH空间字符串函数。
说明:支持FLASH空间字符串函数以字母c打头。
size_t cstrlen(__flash char *cs);
char *cstrcpy(char *, __flash char *cs);
char *cstrncpy(char *, __flash char *cs, size_t);
int cstrcmp(__flash char *cs, char *);
char *cstrcat(char *, __flash char *);
void *cmemcpy(void *, __flash void *, size_t);
void *cmemchr(__flash void *, int, size_t);
int cmemcmp(__flash void *, void *, size_t);
char *cstrncat(char *, __flash char *cs, size_t);
int cstrncmp(__flash char *cs, char *, size_t);
size_t cstrcspn(char *, __flash char *cs);
size_t cstrspn(char *, __flash char *cs);
char *cstrstr(char *, __flash char *cs);
char *cstrpbrk(char *, __flash char *cs);
警告:不能使用占用SRAM空间的字符串函数,占用SRAM空间的字符串函数如下所示。
size_t strlen(CONST char *);
char *strcpy(char *, CONST char *);
int strcmp(CONST char *, CONST char *);
char *strcat(char *, CONST char *);
三、具体使用
csprintf(HMI_string , "x2.bco=RED\xff\xff\xff");
当使用csprintf函数后,入口参数中的字符串常量"x2.bco=RED\xff\xff\xff"编译到FLASH空间。
cstrcat(HMI_string , "x0.bco=WHITE\xff\xff\xff");
当使用cstrcat函数后,入口参数中的字符串常量"x0.bco=WHITE\xff\xff\xff"编译到FLASH空间。