||
1.
关于C语言中数据类型的长度问题
我们应该比较熟悉51系列的C语言数据类型的长度,如下表所示:
数据类型 | 长 度 | 值 域 |
unsigned char | 单字节 | 0~255 |
signed char | 单字节 | -128~+127 |
unsigned int | 双字节 | 0~65535 |
signed int | 双字节 | -32768~+32767 |
unsigned long | 四字节 | 0~4294967295 |
signed long | 四字节 | -2147483648~+2147483647 |
float | 四字节 |
关于ARM的C语言数据类型的长度,如下表:
类型 | 数据宽度/bytes |
char | 1 |
unsigned char | 1 |
short | 2 |
unsigned short | 2 |
int | 4 |
unsigned int | 4 |
long | 4 |
unsigned long | 4 |
2.
关于位变量的定义
第一:如果只单纯的使用位变量,只需要添加#include<stdbool.h>,然后就可以使用bool进行定义;
第二:但是上面的这种方法有一种不可取的地方,如果需要对很多位变量同时赋同一个值的时候,需要书写多条语句,这个时候就可以使用下面的这种方法,这里支持32bit,16 bit,8bit同时定义。
volatile
union { INT8U Flag; __BITS8 Flag_bit; } ;
#define FlagBit0 Flag_bit.no0
#define FlagBit1 Flag_bit.no1
#define FlagBit2 Flag_bit.no2
#define FlagBit3 Flag_bit.no3
#define FlagBit4 Flag_bit.no4
#define FlagBit5 Flag_bit.no5
#define FlagBit6 Flag_bit.no6
#define FlagBit7 Flag_bit.no7
第三:对寄存器的位操作举例,在iolpc2103.h的头文件中,你可以发现如下的定义:
/* TIMER0
Interrupt Register */
typedef
struct{
__REG32
MR0INT : 1;
__REG32
MR1INT : 1;
__REG32
MR2INT : 1;
__REG32
MR3INT : 1;
__REG32
CR0INT : 1;
__REG32
CR1INT : 1;
__REG32 CR2INT : 1;
__REG32 :25;
} __ir0_bits;
__IO_REG32_BIT(T0IR, 0xE0004000,__READ_WRITE,__ir0_bits);
上面的定义,可以看出寄存器的位操作可以这样写T0IR_bit.MR0INT,同时我 们也可以再次重新定义一下这个位变量,这样更利于我们的使用。
#define ClrMR0Timer0Int() T0IR_bit.MR0INT = 1
在IAR中,关总中断和开总中断,有专用的函数可以调用,只是需要包含#include<intrinsics.h>就可以直接调用下面的语句:
__disable_interrupt();
__enable_interrupt();
4. 关于IAR中头文件的写法
在IAR原来的版本中,包含iolpc2103.h 文件可以这样写:
#include<iolpc2103.h>
但是我所使用的这个最新的版本V6.1,却不能这么写,这样会找不到这个头文件,这个版本需要按照下面的这种方法写(当然应该你人为改变iolpc2103.h 文件文件的位置也是可以的):
#include<NXP/iolpc2103.h>
另如果需要将自己的头文件都放入一个固定的文件夹中,便于管理的话,你需要将你自己定义的头文件写成下面这个样子:
#include"..\Head\config.h"