ICCAVR 7.22 如何通过字符串函数将入口参数中的字符串常量编译到FLASH空间

本文介绍了如何通过修改编译器设置和使用特定的字符串函数,将字符串常量从SRAM移到FLASH空间,以节省嵌入式系统的RAM资源。方法包括在ICCAVR7.22编译器中启用StringsinFLASHonly选项,以及使用如csprintf和cstrcat等专门针对FLASH空间的字符串处理函数。
摘要由CSDN通过智能技术生成

    使用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空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值