Keil中支持的变量类型和定义方法
在Keil开发环境中,支持多种变量类型以及灵活的定义方式。以下是详细的说明:
1. 变量类型
Keil支持的标准C语言变量类型包括以下几种:
-
整型(Integer Types) :
char
,short
,int
,long
-
浮点型(Floating Point Types) :
float
,double
-
无符号型(Unsigned Types) :
unsigned char
,unsigned short
,unsigned int
,unsigned long
-
指针型(Pointer Types) :
*
,例如int *p
-
结构体(Structures) :用于组合不同类型的数据,例如:
cstruct _pid { float aim; float real; float err; float err_last; float Kp, Ki, Kd; float total_err; float pwm_out; };
-
联合体(Unions):允许多个变量共享同一段内存。
-
枚举型(Enumerations):定义一组命名的整数值。
此外,Keil还支持特定于嵌入式系统的扩展类型,例如:
- bit类型:用于单比特操作,通常用于51单片机开发。
- sfr类型:特殊功能寄存器(Special Function Register),用于直接访问硬件寄存器。
2. 定义方法
在Keil中,变量可以通过以下几种方式进行定义:
(1)普通定义
在.c
文件中直接定义变量,这是最常见的方式。例如:
c
unsigned char g_var = 0; // 定义一个全局变量
(2)外部声明
如果需要在多个文件中使用同一个变量,可以使用extern
关键字进行声明。例如:
c
// 在h文件中声明
extern unsigned char g_var;
// 在c文件中定义
unsigned char g_var = 0;
(3)在头文件中定义变量
为了避免重复定义错误,可以在头文件中使用宏定义控制变量的定义与声明。例如:
c
#ifndef EXTERN
#define EXTERN extern
#else
#define EXTERN
#endif
EXTERN unsigned char g_var;
在包含该头文件的主文件中,通过重新定义EXTERN
为空来实现变量定义:
c
#define EXTERN
#include "header.h" // 实现变量定义
(4)特殊类型的定义
对于单片机开发,Keil提供了特定的类型定义方式。例如:
-
bit类型 :
csbit LED = P1^0; // 定义P1口第0位为LED
-
sfr类型 :
csfr P1 = 0x90; // 定义P1寄存器地址为0x90
(5)结构体和联合体定义
结构体和联合体是复杂数据类型的常用方式。例如:
c
struct _pid {
float aim;
float real;
float err;
float err_last;
float Kp, Ki, Kd;
float total_err;
float pwm_out;
};
union example {
int value;
float decimal;
};
(6)绝对地址定位
在某些情况下,可能需要将变量或函数定位到特定的内存地址。可以通过链接器配置实现。例如:
c
#pragma locate "?PR?_DELAY?DELAY" 0x8000
或者在链接器设置中手动指定地址。
示例代码
以下是一个完整的示例,展示如何在Keil中定义和使用不同类型的变量:
c
// header.h
#ifndef HEADER_H
#define HEADER_H
#ifndef EXTERN
#define EXTERN extern
#else
#define EXTERN
#endif
EXTERN unsigned char g_var;
struct _pid {
float aim;
float real;
float err;
float err_last;
float Kp, Ki, Kd;
float total_err;
float pwm_out;
};
#endif
// main.c
#define EXTERN
#include "header.h"
unsigned char g_var = 0;
struct _pid pid = {0.0, 0.0, 0.0, 0.0, 1.0, 0.1, 0.01, 0.0};
void main() {
pid.aim = 100.0;
g_var = 1;
}