单片机的RAM是非常少的,像新唐,STC,合泰等一些国产的51单片机,RAM 512 byte,1k,2k,非常常见, 有时候我们的串口接收一串数据,或AD连续采集,这些数据是不能放到 flash 里的,没办法,只能想法节约一些变量空间了. 标志位很多时候只有两种状态,就像bool型一样,真/假,这样的话,我们可以用下面的方式定义, typedef union uFLG{ char Flg ; //定义整形数据 联合体成员 struct FLAG{ //位域定义 u8 Flg1 : ; u8 F…
对着代码说话: #include <stdio.h> #include <stdlib.h> struct test { int abc; }; enum _enum {A,B,C}; union _union { int abc; double cdf; }; int main() { struct test t; enum _enum a; union _union u; printf("Hello world!\n"); return 0; } 在C中声明…
VC,C++ Builder和lcc三个编译器 间枚举类型enum长度的情况. 各种C编译器默认的字节对齐数不一致,要写通用的代码,经常就是使用 #pragma pack(1) ... #pragma pack() 来使编译器以单字节对齐. 今天在bcb5中调用vc6的dll时出现错误,但在VC中调用dll却很正常,说明很有可能是编译器之间的差异造成.仔细debug后发现bcb和vc的枚举类型长度不一样,即便使用了#pragma pack(1)编译开关. 如以下程序: /*-----------…
转自:http://blog.sina.com.cn/s/blog_a575eb9401014tam.html 单片机内程序运行的时候ram空间是如何分配的?我现对一个程序进行减少片内ram的使用的优化,有一些效果,同时也产生了些疑问,在此向各位大虾请教:一.现象:1.    我在通过减少全局变量.函数内变量的使用,减少函数间参数传递等手段来优化,发现某些时候我减少一个变量的使用,keil编译的结果就显示data减少了一字节,有时候这样一直减少几个变量的使用,data值一直都不会变,接着再减少变…
转自:http://blog.sina.com.cn/s/blog_94994f7b01010s1h.html 数组前不加“code”或“data”,则默认将数组存放在程序存储器中:code 指定数据是存储在代码区,数据是在编程的时候跟代码一起写入代码存储器,运行过程中不能改变:xdata 指定数据是存储在外部数据存储器了:data 指定数据存储在内部低128字节数据存储器里,如果变量不指定存储位置,默认就是data型,这部分存储器寻址速度最快:idata 指定数据存储在内部低256字节数据存储…
之前一直是用v5编译,编译速度慢,换成V6编译速度差不多快50% ,而且arm后期只维护v5编译器不在更新v5编译器.切换到V6编译器大势所趋,把之前v5且换到v6需要如下更改: 1. CMSIS包需要更新到5.0以上 2. v5在指定地址定义常量: const uint32_t AppStartCfg[2] __attribute__((at(0x0))) = {0xffffffff,0xaaaaaaaa}; v6在指定地址定义常量: const uint32_t AppStartCfg[2]…
struct/union/class内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/uinon/class. 2).结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"…
/* 本例程是C语言的位域操作示例 这里为什么位域结构体与联合体一起使用? -->因为这样定义后,即可以单独使用标志位 也可同时使用整个字节数据 主要应用:单片机C语言 好处:用标志位可以节省RAM空间 操作灵活 执行速度快 */ //====标志位应用 定义联合体实体==== typedef union uFLG{ uint8 Flg ; //定义整形数据 struct FLAG{ //位域定义 uint8 Flg1 : 1; uint8 Flg2 : 1; uint8 Flg3 : 1; u…
C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念:1.数据类型自身的对齐值:对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节. 2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值. 3.指定对齐值:#pragma pack (value)时的指定对齐值value. 4.数据成员.结构体和类的有效对齐值:自身对齐值…
传送门:http://www.eeworld.com.cn/mcu/2011/0411/article_3928.html 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份.下面是volatile变量的几个例子:      1). 并行设备的硬件寄存器(如:状态寄存器)      2). 一个中断服务子程序中会访问到的非自动变量(Non…