首先聊一聊
大家都知道进行单片机编程和计算机编程有个最大的差别就是单片机的资源非常的有限,并且对于大部分低端单片机而言都没有操作系统。除了一些嵌入式级的芯片用了Linux系统外,其他大部分操作都是比较简单的RTOS,可能还有一些简单的应用或者芯片根本不用系统,直接是裸机程序。
那么,主控芯片换不了我们还有什么办法呢?那我们应该从原本的程序中挤出资源来使用了,下面我总结了几种常总方法供大家参考(具体内容可以网络查找)。
共联体-union
union结构体由于是共用同一片内存可以大大节省内存空间,那一般什么情况下使用union?又或者union还有什么特点?
下面将用几点为大家解答:
1)所有的union的成员及本身的地址是一样的;
2)union的存储模型受大小端的影响,我们可以通过下面的代码进行测试(如果输出结果为1,表示小端模式,否则为大端模式)。
大小端小知识
3)union不同于结构体struct,union对成员的改变可能会影响到其他成员变量,所以我们要形成一种互斥使用,比如说我们的顺序执行其实就是每个代码都是互斥的,所以我们可以用union进行函数处理缓存等(个人觉得也可以认为是分时复用,并且是不会受内存初值影响的处理)。
#include<stdio.h>
typedef union _tag_test
{
char a;
int b;
}uTest;
uTest test;
unsigned char Checktype(void);
int main(void)
{
printf("%x\n",(unsigned int)&test.a);
printf("%x\n",(unsigned int)&test.b);
printf("%x\n",(unsigned int)&test);
printf("%d\n",Checktype());
}
unsigned char Checktype(void)
{
uTest chk;
chk.b = 0x01;
if(chk.a == 0x01)return 1;
return 0;
}
位域
因为在我们平时编程过程中,我们使用的变量与实际情况是息息相关的,就比如说开关的状态,我们一般就是0或者是1分别表示打开和关闭,那么我们用一个bit就能表示,假如说我们用一个char来存储就几乎浪费了7个bit,如果以后也有类似的的情况,那么大部分内存都得不到有效的应用。所以C语言的位域就是用来解决这个问题。
不过,我们需要注意如下几点:
1)位域是在结构体中实现的,其中位域规定的长度不能超过所定义类型,且一个位域只能定义在同一个存储单元中。
2)无名位域的使用,可以看下面的代码。
3)由于位域与数据类型有关系,那么他的内存占用情况也与平台的位数相关(相关内容可网络查找)。
#include<stdio.h>
//结果:编译通过
//原因:常规形式(结构体占用两个字节)
typedef struct _tag_test1
{
char a:1;
char b:1;
char c:1;
char d:6;
}sTest1;
//结果:编译无法通过
//原因:d的位域长度10超过了char类型长度
/*
typedef struct _tag_test2
{
char a:1;
char b:1;
char c:1;
char d:10;
}sTest2;
*/
//结果:编译可通过
//原因:下面使用无名位域,且占8个字节
typedef struct _tag_test3
{
int a:1;
int b:1;
int :0;//无名位域
int c:1;
}sTest3;
int main(void)
{
printf("%d\n",sizeof(sTest1));
printf("%d\n",sizeof(sTest3));
printf("欢迎关注公众号:最后一个bug\n");
}
结构体对齐
结构体对齐问题可能大部分人关注的不是很多,可能在通讯领域进行内存的copy时候接触得比较多。结构体对齐问题也是与平台相关,CPU为了提高访问内存的效率,一次性可能读取2个字节,4个字节,8个字节等,所以编译器会自动对结构体内存进行对齐。
废话不多说,代码说明一切:
#include<stdio.h>
#pragma pack(1)
//有字节对齐预编译结果为:12,8
//无字节对齐预编译结果为:6,6
typedef struct _tag_test1{
char a;
int b;
char c;
}STest1;
typedef struct _tag_test2{
int b;
char a;
char c;
}STest2;
int main(void)
{
printf("%d\n",sizeof(STest1));
printf("%d\n",sizeof(STest2));
printf("欢迎关注公众号:最后一个bug\n");
}
算法优化
其实,算法优化主要是我们通过修改一些算法的实现一种效率与内存使用的一个平衡。我们都知道,算法都存在着复杂度的问题,我们大部分高效率的算法都是通过使用内存来换效率,也就是一种用空间换时间的概念。那么,当我们内存使用有限的时候,可以适当的用时间来换空间的方法,腾出更多的空间来实现更多的功能。
同样,我们在进行相关设计的时候,可以尽量使用局部变量来减少全局变量的使用!
END
→点关注,不迷路←
文章引用微信公众号"嵌入式微处理器",如有侵权,请联系管理员删除!