news 2026/4/15 13:16:02

【Embedded Development】嵌入式相关编程技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Embedded Development】嵌入式相关编程技巧

一、简介

此篇文章专用于记录以及汇总嵌入式高级编程技巧。当然这里面就不会去再单独讲解一次合理使用一些关键词(比如const、static、volital)去优化程序代码的情况了。

如有错误欢迎在评论区指出,或者有其他的小技巧,也欢迎在评论区分享,以便收录。

二、技巧汇总

2.1 基于面向对象的思想,使用C语言实现统一管理各模块的函数接口

2.1.1 来源

基于WM IoT SDK的架构设计中的驱动接口层编程方法进行技巧总结,得到使用结构体模拟面向对像的思想实现通过一个结构或者结构体指针的实例化来创建一个驱动功能对象进行后续操作。

2.1.2 实战

.h
// // Created by zky on 2025/12/12. // #ifndef LCKFB_SKY_STAR_PROJECT_LED_H #define LCKFB_SKY_STAR_PROJECT_LED_H #define LED_GPIO_PORT GPIOB #define LED_GPIO_PIN GPIO_PIN_2 #define LED_GPIO_ON GPIO_PIN_SET #define LED_GPIO_OFF GPIO_PIN_RESET #ifdef __cplusplus extern "C"{ #endif // LED接口结构体(完全复用参考架构的接口定义,确保兼容性) struct LedInterface{ void (*pfinit)(void); // 初始化接口 void (*pftask)(void); // FreeRTOS任务接口 void (*pfon)(void); // 点亮接口 void (*pfoff)(void); // 熄灭接口 void (*pftoggle)(void); // 翻转接口 }; // 外部声明接口实例(供其他模块调用,如main.c、按键模块) extern struct LedInterface led_interface; #ifdef __cplusplus } #endif #endif //LCKFB_SKY_STAR_PROJECT_LED_H
.c
// // Created by zky on 2025/12/12. // #include "led.h" #include "gpio.h" #include "freertos.h" #include "task.h" static void led_init(void); // 初始化实现 static void led_task(void); // FreeRTOS任务实现 static void led_on(void); // 点亮实现(带LED类型参数) static void led_off(void); // 熄灭实现(带LED类型参数) static void led_toggle(void); // 翻转实现(带LED类型参数) struct LedInterface led_interface = { .pfinit = led_init, .pftask = led_task, .pfon = led_on, .pfoff = led_off, .pftoggle = led_toggle, }; static void led_init() { led_off(); } static void led_task(void) { while(1) { led_toggle(); vTaskDelay(200); } } static void led_on(void) { HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, LED_GPIO_ON); } static void led_off(void) { HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, LED_GPIO_OFF); } static void led_toggle(void) { HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PIN); }

2.2 函数指针与回调

2.2.1 来源

基于STM32 HAL库中的多种串口中断类型的回调中断函数,和正点原子的Linux裸机教程中中断代码部分,而总结出。

函数指针:函数指针可以传递函数作为参数,实现回调机制。

回调函数的核心本质是:把函数作为参数传递给另一个函数,在特定事件触发时(如中断完成、任务执行结束、数据接收完毕),由被调用方反向调用这个函数

2.2.2 实战

callback.h

// // Created by zky on 2025/12/16. // #ifndef LCKFB_SKY_STAR_PROJECT_CALLBACK_H #define LCKFB_SKY_STAR_PROJECT_CALLBACK_H //用 typedef 定义函数指针,明确回调函数的格式(无参数、无返回值) typedef void (*CallbackFunc)(void); void register_callback(CallbackFunc cb); void trigger_callback(void); #endif //LCKFB_SKY_STAR_PROJECT_CALLBACK_H

callback.c

// // Created by zky on 2025/12/16. // #include "callback.h" #include "stdio.h" #include "stdint.h" // 全局函数指针:存储注册的回调函数地址(调用方持有指针) static CallbackFunc g_registered_cb = NULL; // 注册回调函数的接口:给上层调用,传入回调地址 void register_callback(CallbackFunc cb) { if (cb != NULL) { g_registered_cb = cb; // 保存回调函数地址 } } // 触发回调的逻辑:调用方在特定事件(如延时到期、硬件触发)时执行 void trigger_callback(void) { if (g_registered_cb != NULL) { g_registered_cb(); // 通过函数指针调用回调函数 } }

main.c

// 回调函数 1:打印信�?? void my_callback1(void) { printf("回调 callback1\r\n"); } // 回调函数 2:更新状态(嵌入式常用) uint8_t g_device_status = 0; void my_callback2(void) { g_device_status = 1; // 事件触发后,更新设备状�?? printf("callback2 : %d\r\n", g_device_status); } void app_callback(void* parameter) { printf("app_callback is running.\r\n"); // 1. 注册回调函数(�?�择要挂钩的逻辑�?? register_callback(my_callback2); // 2. 模拟事件触发(实际场景可能是中断、定时器超时�?? printf("moni test1\r\n"); trigger_callback(); // 触发回调,执�?? my_callback2 // 切换回调函数(灵活替换�?�辑,无�??修改调用方代码) register_callback(my_callback1); printf("moni test2\r\n"); trigger_callback(); // 触发回调,执�?? my_callback1 while (1) { } }

2.3

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 4:42:51

11、Linux RPM 打包与文件系统层级标准详解

Linux RPM 打包与文件系统层级标准详解 1. RPM 打包相关宏与操作 在创建 RPM 软件包时,有几个关键的宏起着重要作用。 - %files 宏 :用于列出要包含在 RPM 包中的文件列表。在该宏之后,需列出不同的文件,包含其完整路径名。 - %config 宏 :可用于列出配置文件,这…

作者头像 李华
网站建设 2026/4/14 3:16:51

15、Linux系统存储管理与RAID配置指南

Linux系统存储管理与RAID配置指南 在Linux系统中,对于存储管理和数据备份等操作有着丰富的工具和方法。下面将详细介绍CD-ROM镜像制作、数据备份以及RAID和LVM相关的知识。 1. CD-ROM镜像制作与写入 在Linux中,我们可以使用Red Hat发行版文件创建CD-ROM镜像。以下是使用 …

作者头像 李华
网站建设 2026/4/14 6:51:53

6、JavaScript在Mozilla平台中的应用与实践

JavaScript在Mozilla平台中的应用与实践 1. JavaScript简介与在Mozilla中的角色 JavaScript是一种轻量级的编程语言,语法类似C语言,是Mozilla平台的重要组成部分。在Mozilla应用中,根据应用的复杂度,JavaScript脚本可遵循不同的编程风格: - 轻量级应用 :脚本与网页中…

作者头像 李华
网站建设 2026/4/10 14:46:21

8、XUL表单与菜单:功能、比较与应用

XUL表单与菜单:功能、比较与应用 在开发基于Mozilla的应用程序时,表单和菜单是用户交互的重要组成部分。它们不仅提供了数据输入和操作的界面,还影响着用户体验的质量。本文将深入探讨XUL(XML User Interface Language)中的表单和菜单,包括它们与HTML表单的比较、基本概…

作者头像 李华
网站建设 2026/4/8 13:30:50

16、深入探索XBL绑定:增强用户界面开发的利器

深入探索XBL绑定:增强用户界面开发的利器 1. XBL绑定简介 XBL(XML Binding Language)是一种基于XML的语言,专门用于Mozilla平台。它允许开发者向XUL、HTML和XML中添加全新且功能完备的标签,是创建新GUI小部件的高效系统。与普通的XUL用户自定义标签不同,XBL能够创建具有…

作者头像 李华
网站建设 2026/4/14 20:20:02

BetterNCM插件:网易云音乐终极增强方案

还在忍受网易云音乐原版客户端的各种限制吗?🤔 BetterNCM插件将彻底改变你的音乐体验!这款强大的增强工具通过一键式安装程序,为你带来前所未有的个性化音乐世界。 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 …

作者头像 李华