当前位置: 首页 > news >正文

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):用于组合不同类型的数据,例如:
    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文件中直接定义变量,这是最常见的方式。例如:

unsigned char g_var = 0; // 定义一个全局变量
(2)外部声明

如果需要在多个文件中使用同一个变量,可以使用extern关键字进行声明。例如:

// 在h文件中声明
extern unsigned char g_var;// 在c文件中定义
unsigned char g_var = 0;
(3)在头文件中定义变量

为了避免重复定义错误,可以在头文件中使用宏定义控制变量的定义与声明。例如:

#ifndef EXTERN
#define EXTERN extern
#else
#define EXTERN
#endifEXTERN unsigned char g_var;

在包含该头文件的主文件中,通过重新定义EXTERN为空来实现变量定义:

#define EXTERN
#include "header.h" // 实现变量定义
(4)特殊类型的定义

对于单片机开发,Keil提供了特定的类型定义方式。例如:

  • bit类型
    sbit LED = P1^0; // 定义P1口第0位为LED
    
  • sfr类型
    sfr P1 = 0x90; // 定义P1寄存器地址为0x90
    
(5)结构体和联合体定义

结构体和联合体是复杂数据类型的常用方式。例如:

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)绝对地址定位

在某些情况下,可能需要将变量或函数定位到特定的内存地址。可以通过链接器配置实现。例如:

#pragma locate "?PR?_DELAY?DELAY" 0x8000

或者在链接器设置中手动指定地址。


示例代码

以下是一个完整的示例,展示如何在Keil中定义和使用不同类型的变量:

// header.h
#ifndef HEADER_H
#define HEADER_H#ifndef EXTERN
#define EXTERN extern
#else
#define EXTERN
#endifEXTERN 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;
}

http://www.xdnf.cn/news/971857.html

相关文章:

  • 美业门店/个案疗愈门店管理系统具备「活动促销」功能有哪些优势?
  • 多面体编译的循环分块
  • iOS和桌面双端抓包实战经验总结:Sniffmaster与常见工具组合解析
  • 算法工程师工作面试常考问题汇总
  • HarmonyOS 应用开发学习记录 - 从Windows开发者视角看鸿蒙开发
  • RabbitMQ的使用--Spring AMQP(更新中)
  • 期末考试复习总结-《从简单的页面开始(上)》
  • CentOS7下的Nginx部署
  • 行业 |5G六年,互联网改变了什么?
  • WHAT - 组件库开发场景 - 完全无样式的 UI 组件库 Headless UI
  • 看板更新不及时该如何规范
  • jQuery带动画特效的圆形导航菜单特效
  • Playwright 与 Selenium:自动化测试的两大主流工具对比
  • iOS超级签申请流程及环境部署
  • 从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
  • 二叉树进阶:经典算法题详解
  • AD8539ARZ ADI 精密放大器 电子元器件解析
  • 判断素数两种方法【自用】
  • 【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
  • 工作中开发的sql总结
  • LeetCode 200.岛屿数量
  • 天猫官方认证TP服务商——品融电商代运营全链路解析
  • 无需安装!在线 SQL 数据库工具实战 :经典 SQL 语句案例
  • NY167NY171美光固态闪存NY176NY180
  • 《炒股进阶:MACD交易技术从入门到精通》速读笔记
  • Nature子刊|ChatNT:生物多模态LLM破壁者!统一DNA/RNA/蛋白质分析的对话式AI
  • JAVA中的多线程
  • 常见算法题目6 - 给定一个字符串,输出其最长的回文子串
  • F5 BIG IP show running config
  • 模型参数、模型存储精度、参数与显存