MCU Keil中支持的变量类型和定义方法

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) :用于组合不同类型的数据,例如:

    c 复制代码
    struct _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类型

    c 复制代码
    sbit LED = P1^0; // 定义P1口第0位为LED
  • sfr类型

    c 复制代码
    sfr 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;
}

相关推荐
AUTO_150756759651 小时前
XS2186 是一个八通道、供电设备(PSE)电源控制器,设计用于IEEE® 802.3at/af兼容PSE,用于交换机/路由器
单片机·嵌入式硬件·芯片
SY师弟5 小时前
台湾TEMI协会竞赛——1、龙舟机器人组装教学
c语言·单片机·嵌入式硬件·机器人·嵌入式·台湾temi协会
星宇CY5 小时前
STM32 定时器应用:从精准延时到智能控制的实战指南
stm32·单片机·嵌入式硬件
WIZnet 中国社区官方博客5 小时前
第二章 开发板与芯片介绍
嵌入式硬件·wiznet·高性能以太网单片机·w55mh32·系统框架·开发板介绍·硬件资源
学习噢学个屁5 小时前
基于STM32音频频谱分析设计
c语言·stm32·单片机·嵌入式硬件·音视频
电子科技圈7 小时前
IAR开发平台升级Arm和RISC-V开发工具链,加速现代嵌入式系统开发
arm开发·嵌入式硬件·设计模式·性能优化·软件工程·代码规范·risc-v
位东风8 小时前
【凌智视觉模块】rv1106 部署 ppocrv4 检测模型 rknn 推理
c++·人工智能·嵌入式硬件
智驾9 小时前
电机控制基础,小白入门篇
嵌入式硬件·电机·电机控制
Peter_Deng.10 小时前
单片机 - STM32 非阻塞式编程详解:以 LED 和按键为例(附超详细寄存器级代码)
stm32·单片机·嵌入式硬件
平凡灵感码头10 小时前
基于 STM32 的四路 PWM 控制智能小车运动的模块化控制程序
stm32·单片机·嵌入式硬件