嵌入式杂谈(问题解决一:使用HAL库时keil中代码的分区)

 如图,代码分区

代码区域作用
Private includes引入所需头文件,提供函数声明、类型定义和宏等
Private typedef创建自定义数据类型,增强代码可读性与维护性
Private define定义常量和宏,方便代码修改与简化
Private macro实现简单代码替换,简化代码逻辑
Private variables声明和初始化程序所需变量
Private function prototypes声明函数原型,让编译器知晓函数存在
Private user code完成具体函数实现,编写核心业务逻辑

1.include

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>          // 标准输入输出库,可用于打印调试信息等
#include <stdlib.h>         // 标准库,包含一些通用函数,如内存分配、转换函数等
#include <string.h>         // 字符串处理库,包含字符串操作函数,如 strcpy、strlen 等
#include <stdbool.h>        // 布尔类型库,提供 bool 类型及其值 true 和 false
#include "my_custom_lib.h"   // 自定义库,用于项目中特定功能的实现
/* USER CODE END Includes */

解释

  • #include 语句用于引入所需的头文件,为后续代码提供所需的函数声明、类型定义和宏等。引入不同的标准库可以方便使用各种基本功能,而自定义库则可以根据项目需求添加。

2.typedef 

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
typedef struct {
    int id;
    char name[50];
    float value;
} MyStruct;  // 自定义结构体,用于存储复杂的数据结构

typedef enum {
    STATE_IDLE,
    STATE_RUNNING,
    STATE_ERROR
} SystemState;  // 自定义枚举,用于表示系统的不同状态
/* USER CODE END PTD */

解释

  • typedef 关键字用于创建自定义的数据类型。这里创建了一个结构体 MyStruct 用于存储具有多个成员的复杂数据,还创建了一个枚举 SystemState 用于表示系统的不同状态,使代码更具可读性和可维护性。

 3.define

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define MAX_BUFFER_SIZE 1024  // 定义最大缓冲区大小
#define PI 3.14159265359     // 定义常量 PI
#define DEBUG_MODE 1        // 定义调试模式开关
/* USER CODE END PD */

解释

  • #define 用于创建常量和宏。常量可以使代码中的常数值具有明确的意义,便于修改和维护,而宏可以实现一些简单的代码替换功能,提高代码的简洁性和可读性。

4.Private variables

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
int global_variable = 0;    // 全局变量,可在整个程序中访问
char buffer[MAX_BUFFER_SIZE];  // 字符数组,用于存储数据,大小为 MAX_BUFFER_SIZE
MyStruct my_struct;        // 自定义结构体变量
SystemState system_state = STATE_IDLE;  // 自定义枚举变量,初始化为 STATE_IDLE 状态
/* USER CODE END PV */

解释

  • 这个区域用于声明和初始化程序所需的变量,包括全局变量、数组和自定义类型的变量等。

 5.Private function prototypes(PFP)

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
void initialize_system(void);  // 初始化系统的函数原型
void process_data(int data);  // 处理数据的函数原型
void print_status(void);     // 打印系统状态的函数原型
/* USER CODE END PFP */

解释

  • 在此处声明函数的原型,使编译器知道这些函数的存在,以便在后续的代码中调用这些函数,这些函数的具体实现可以在其他地方完成。

 6.Private user code

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void initialize_system(void) {
    // 初始化系统的具体代码,例如设置变量初始值,初始化硬件等
    system_state = STATE_IDLE;
    global_variable = 100;
    memset(buffer, 0, MAX_BUFFER_SIZE);  // 清空缓冲区
}

void process_data(int data) {
    // 处理数据的具体代码,例如对数据进行计算、存储或修改
    if (IS_EVEN(data)) {
        global_variable += SQUARE(data);
    } else {
        global_variable -= data;
    }
}

void print_status(void) {
    // 打印系统状态的具体代码,例如使用 printf 输出系统状态信息
    if (DEBUG_MODE) {
        printf("System state: %d\n", system_state);
        printf("Global variable value: %d\n", global_variable);
    }
}
/* USER CODE END 0 */

解释

  • 这里是具体函数的实现,包括初始化系统、处理数据和打印状态的函数。根据之前声明的函数原型,在此处完成具体的函数逻辑。可以使用之前定义的常量、宏、结构体和枚举,也可以调用其他标准库或自定义库的函数。

在实际编写嵌入式代码时,不同的项目和硬件平台可能会有不同的需求,但总体上这些区域可以帮助你组织代码,使代码结构清晰,易于维护和扩展。请根据具体的项目需求灵活运用这些区域,确保代码的正确性和可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值