写在梦想边上 https://bbs.21ic.com/?583043 [收藏] [复制] [RSS]

日志

利用proteus学习ARM(LPC2103)之二:熟悉IAR C语言开发环境

已有 2043 次阅读2010-12-28 09:03 |系统分类:嵌入式系统| IAR, ARM, 入门

    



1.      
关于C语言中数据类型的长度问题



我们应该比较熟悉51系列的C语言数据类型的长度,如下表所示:







  
  
  


  
  
  


  
  
  


  
  
  


  
  
  


  
  
  


  
  
  


  
  
  


  

数据类型


  

  

长 度


  

  

值 域


  

  

unsigned char


  

  

单字节


  

  

0255


  

  

signed char


  

  

单字节


  

  

-128+127


  

  

unsigned int


  

  

双字节


  

  

065535


  

  

signed int


  

  

双字节


  

  

-32768+32767


  

  

unsigned long


  

  

四字节


  

  

04294967295


  

  

signed long


  

  

四字节


  

  

-2147483648+2147483647


  

  

float


  

  

四字节


  

  

 


  

 


  




关于ARMC语言数据类型的长度,如下表:







  
  


  
  


  
  


  
  


  
  


  
  


  
  


  
  


  
  


  

 类型


  

  

数据宽度/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进行定义;



第二:但是上面的这种方法有一种不可取的地方,如果需要对很多位变量同时赋同一个值的时候,需要书写多条语句,这个时候就可以使用下面的这种方法,这里支持32bit16 bit8bit同时定义。



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



 3.       关于开关总中断的内部函数



       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" 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)