启用const数组的部分
我有四个启用const数组的部分,c,multidimensional-array,embedded,C,Multidimensional Array,Embedded,我有四个const char[][]数组,每个数组大约有50个元素,每个元素包含另外40个值,这些值将被发送到图形LCD,以绘制特定的字母、数字、符号 现在,问题是,我正在用非常有限的资源开发一个嵌入式系统。虽然这四个数组在我之前工作的项目中都很有用,我需要大部分字符,但现在我只需要5到10个字符 我可以从数组中删除我不需要的字符,但我希望有更好的方法来禁止这些字符写入RAM/FLASH 我正在考虑使用#ifdef和#endif。但是对每个元素这样做,代码就会变得混乱 还有别的办法吗 提前谢谢
const char[][]
数组,每个数组大约有50个元素,每个元素包含另外40个值,这些值将被发送到图形LCD,以绘制特定的字母、数字、符号
现在,问题是,我正在用非常有限的资源开发一个嵌入式系统。虽然这四个数组在我之前工作的项目中都很有用,我需要大部分字符,但现在我只需要5到10个字符
我可以从数组中删除我不需要的字符,但我希望有更好的方法来禁止这些字符写入RAM/FLASH
我正在考虑使用#ifdef
和#endif
。但是对每个元素这样做,代码就会变得混乱
还有别的办法吗
提前谢谢
编辑:
现在,我有#ifdef
和#endif
用于更大的部件,如:
#define ARRAY1_BIG_LETTERS
#define ARRAY1_SMALL_LETTERS
#define ARRAY1_NUMBERS
#define ARRAY1_OTHER
#define ARRAY2_BIG_LETTERS
#define ARRAY2_SMALL_LETTERS
#define ARRAY2_NUMBERS
#define ARRAY2_OTHER
...
但是,我仍然需要对内容进行更精细的控制
EDIT2:
这是(较小)阵列之一:
我预先选择要使用的值。因此,这可能需要以某种方式使用预处理器来完成…首先,我建议您创建结构列表。此外,您的显示器是8x8,但您只使用6x8(您的边框始终为0),如果您将第一个替换为简单的字符,则不必写注释“它实际上是什么字母”。还有一个技巧可以将“终止符”(或停止序列)添加到表中。然后您不必知道数组大小(我假设您正在循环数组以找到正确的字母)。因此: 而使用类似于:
int i = 0;
while (writing[i].ascii != 0) {
// do stuff, add if or anything
++i;
}
这种改变需要改变显示功能,但节省的内存可能是值得的
这是一部分。
这就是他们之间的区别
常量字符str[]=“str”;
和
const char*pStr=“Str”;
?
尺寸
在运行时写入数据时,const char str[]在堆栈上分配,实际上是数组
const char*pStr在堆上分配,并且在运行时只向其写入指向数据的指针,数据位于应用程序的全局内存中
这是什么意思?
onst char writing_8x8[][9]={…};正在分配大量内存。在嵌入式设备上,这可能是。。。好吧,假设我不推荐
怎么办?
您可以将所有大阵列拆分为较小的阵列
typedef struct _dsp_letter {
const char ascii;
const char pixels[6];
} dsp_letter_t;
#ifdef ADD_OTHER
const dsp_letter_t other[] = {
{' ', { 0 , 0 , 0 , 0 , 0 , 0 } },
{'-', { 0 , 0 , 0 , 0 , 0 , 0 } },
{'.', { 0 , 96 , 96 , 0 , 0 , 0 } },
{':', { 0 , 108 , 108 , 0 , 0 , 0 } },
{'=', { 36 , 36 , 36 , 36 , 36 , 0 } },
{ 0 }
};
#endif ADD_OTHER
#ifdef ADD_SMALL
const dsp_letter_t small[] = {
{'a', { 0 , 0 , 0 , 0 , 0 , 0 } },
{'b', { 0 , 0 , 0 , 0 , 0 , 0 } },
{'c', { 0 , 96 , 96 , 0 , 0 , 0 } },
{'d', { 0 , 108 , 108 , 0 , 0 , 0 } },
{ 0 }
};
#endif ADD_SMALL
现在,您可以在编译时或运行时在一个位置获得所有这些文件
编译时(与您以前的编译时一样):
或运行时:
#define ADD_OTHER 1
#define ADD_SMALL 0
int size = ADD_OTHER + ADD_SMALL;
int i = 0;
dsp_letter_t **writting = (dsp_letter_t *writting(malloc)(size* sizeof (dsp_letter_t *writting));
#ifdef ADD_OTHER
writting[i++] = other;
#endif
#ifdef ADD_SMALL
writting[i++] = small;
#endif
你可以这样做:)
不幸的是,我不知道如何在不使用#ifdef。。。endif所有位置://首先,我建议您创建结构列表。此外,您的显示器是8x8,但您只使用6x8(您的边框始终为0),如果您将第一个替换为简单的字符,则不必写注释“它实际上是什么字母”。还有一个技巧可以将“终止符”(或停止序列)添加到表中。然后您不必知道数组大小(我假设您正在循环数组以找到正确的字母)。因此: 而使用类似于:
int i = 0;
while (writing[i].ascii != 0) {
// do stuff, add if or anything
++i;
}
这种改变需要改变显示功能,但节省的内存可能是值得的
这是一部分。
这就是他们之间的区别
常量字符str[]=“str”;
和
const char*pStr=“Str”;
?
尺寸
在运行时写入数据时,const char str[]在堆栈上分配,实际上是数组
const char*pStr在堆上分配,并且在运行时只向其写入指向数据的指针,数据位于应用程序的全局内存中
这是什么意思?
onst char writing_8x8[][9]={…};正在分配大量内存。在嵌入式设备上,这可能是。。。好吧,假设我不推荐
怎么办?
您可以将所有大阵列拆分为较小的阵列
typedef struct _dsp_letter {
const char ascii;
const char pixels[6];
} dsp_letter_t;
#ifdef ADD_OTHER
const dsp_letter_t other[] = {
{' ', { 0 , 0 , 0 , 0 , 0 , 0 } },
{'-', { 0 , 0 , 0 , 0 , 0 , 0 } },
{'.', { 0 , 96 , 96 , 0 , 0 , 0 } },
{':', { 0 , 108 , 108 , 0 , 0 , 0 } },
{'=', { 36 , 36 , 36 , 36 , 36 , 0 } },
{ 0 }
};
#endif ADD_OTHER
#ifdef ADD_SMALL
const dsp_letter_t small[] = {
{'a', { 0 , 0 , 0 , 0 , 0 , 0 } },
{'b', { 0 , 0 , 0 , 0 , 0 , 0 } },
{'c', { 0 , 96 , 96 , 0 , 0 , 0 } },
{'d', { 0 , 108 , 108 , 0 , 0 , 0 } },
{ 0 }
};
#endif ADD_SMALL
现在,您可以在编译时或运行时在一个位置获得所有这些文件
编译时(与您以前的编译时一样):
或运行时:
#define ADD_OTHER 1
#define ADD_SMALL 0
int size = ADD_OTHER + ADD_SMALL;
int i = 0;
dsp_letter_t **writting = (dsp_letter_t *writting(malloc)(size* sizeof (dsp_letter_t *writting));
#ifdef ADD_OTHER
writting[i++] = other;
#endif
#ifdef ADD_SMALL
writting[i++] = small;
#endif
你可以这样做:)
不幸的是,我不知道如何在不使用#ifdef。。。endifall over the place://据我所知,在C语言中,所有字符串文本都存储在程序开始时的只读内存中。唯一的解决方法是使用字符文本。如果不知道
const char[]
的内容以及与LCD的对话方式,就很难找到解决方法。它真的是嵌入式系统吗?在大多数嵌入式系统中,常量变量存储在闪存中,而不是RAM中。在开始优化之前,了解这些阵列的最终位置非常重要。若它们最终变成闪存,而您需要更多的RAM,那个么摆弄阵列将解决不了任何问题。您可以选择是将其存储到程序内存还是RAM中。我只是在寻找一个预处理器技巧,类似于我所发布的,但具有更多“精细控制”的东西。据我所知,在C语言中,所有字符串文本在程序开始时都存储在只读内存中。唯一的解决方法是使用字符文本。如果不知道const char[]
的内容以及与LCD的对话方式,就很难找到解决方法。它真的是嵌入式系统吗?在大多数嵌入式系统中,常量变量存储在闪存中,而不是RAM中。在开始优化之前,了解这些阵列的最终位置非常重要。若它们最终变成闪存,而您需要更多的RAM,那个么摆弄阵列将解决不了任何问题。您可以选择是将其存储到程序内存还是RAM中。我只是在寻找一个预处理器技巧,类似于我发布的东西,但有更多的“精细控制”
#define ADD_OTHER 1
#define ADD_SMALL 0
int size = ADD_OTHER + ADD_SMALL;
int i = 0;
dsp_letter_t **writting = (dsp_letter_t *writting(malloc)(size* sizeof (dsp_letter_t *writting));
#ifdef ADD_OTHER
writting[i++] = other;
#endif
#ifdef ADD_SMALL
writting[i++] = small;
#endif