嵌入式中常用的巧妙方法 - (汇总)

news2024/11/24 20:24:41

概述

        做项目,掌握以下方法,可提高开发效率,把时间全部放在需求上。

1、快速获取结构体成员大小

#include <stdio.h>   

// 获取结构体成员大小
#define  GET_MEMBER_SIZE(type, member)   sizeof(((type*)0)->member)

// 获取结构体成员偏移量
#define  GET_MEMBER_OFFSET(type, member)  ((size_t)(&(((type*)0)->member)))

typedef struct _test_struct0
{
	char x;
	char y;
	char z;
}test_struct0;

typedef struct _test_struct1
{
	char a;
	char c;
	short b;
	int d;
	test_struct0 e;
}test_struct1;

int main(int arc, char* argv[])
{
	printf("GET_MEMBER_SIZE(test_struct1, a) = %ld\n", GET_MEMBER_SIZE(test_struct1, a));
	printf("GET_MEMBER_SIZE(test_struct1, c) = %ld\n", GET_MEMBER_SIZE(test_struct1, c));
	printf("GET_MEMBER_SIZE(test_struct1, b) = %ld\n", GET_MEMBER_SIZE(test_struct1, b));
	printf("GET_MEMBER_SIZE(test_struct1, d) = %ld\n", GET_MEMBER_SIZE(test_struct1, d));
	printf("GET_MEMBER_SIZE(test_struct1, e) = %ld\n", GET_MEMBER_SIZE(test_struct1, e));
	printf("test_struct1 size = %ld\n", sizeof(test_struct1));

	printf("GET_MEMBER_OFFSET(a): %ld\n", GET_MEMBER_OFFSET(test_struct1, a));
	printf("GET_MEMBER_OFFSET(c): %ld\n", GET_MEMBER_OFFSET(test_struct1, c));
	printf("GET_MEMBER_OFFSET(b): %ld\n", GET_MEMBER_OFFSET(test_struct1, b));
	printf("GET_MEMBER_OFFSET(d): %ld\n", GET_MEMBER_OFFSET(test_struct1, d));
	printf("GET_MEMBER_OFFSET(e): %ld\n", GET_MEMBER_OFFSET(test_struct1, e));

	return 0;
}

运行结果: 

 

2、文件操作

文件操作平时用得很多,为了方便使用,可以自己根据实际需要再封装一层:

#include <stdio.h>   

static int file_opt_write(const char* filename, void* ptr, int size)
{
	FILE* fp;
	size_t num;

	fp = fopen(filename, "wb");
	if (NULL == fp)
	{
		printf("open %s file error!\n", filename);
		return -1;
	}

	num = fwrite(ptr, 1, size, fp);
	if (num != size)
	{
		fclose(fp);
		printf("write %s file error!\n", filename);
		return -1;
	}

	fclose(fp);

	return num;
}

static int file_opt_read(const char* filename, void* ptr, int size)
{
	FILE* fp;
	size_t num;

	fp = fopen(filename, "rb");
	if (NULL == fp)
	{
		printf("open %s file error!\n", filename);
		return -1;
	}

	num = fread(ptr, 1, size, fp);
	if (num != size)
	{
		fclose(fp);
		printf("write %s file error!\n", filename);

		return -1;
	}
	fclose(fp);

	return num;
}

typedef struct _test_data_info
{
	char a;
	char c;
	short b;
	int d;
}test_data_info;

int main(int arc, char* argv[])
{
#define FILE_NAME  "./test_file"

	test_data_info write_data = { 0 };
	write_data.a = 1;
	write_data.b = 2;
	write_data.c = 3;
	write_data.d = 4;
	printf("write_data.a = %d\n", write_data.a);
	printf("write_data.b = %d\n", write_data.b);
	printf("write_data.c = %d\n", write_data.c);
	printf("write_data.d = %d\n", write_data.d);
	file_opt_write(FILE_NAME, (test_data_info*)&write_data, sizeof(test_data_info));

	test_data_info read_data = { 0 };
	file_opt_read(FILE_NAME, (test_data_info*)&read_data, sizeof(test_data_info));
	printf("read_data.a = %d\n", read_data.a);
	printf("read_data.b = %d\n", read_data.b);
	printf("read_data.c = %d\n", read_data.c);
	printf("read_data.d = %d\n", read_data.d);

	return 0;
}

运行结果:

 

3、进度条

有时候,加上进度条可以比较方便知道当前的下载进度、写入文件的进度等。

#include <stdio.h>    
#include <string.h>    
#include <windows.h>

typedef struct _progress_t
{
	int cur_size;
	int sum_size;
}progress_t;

void progress_bar(progress_t* progress_data)
{
	int percentage = 0;
	int cnt = 0;
	char proBuf[102];

	memset(proBuf, '\0', sizeof(proBuf));

	percentage = (int)(progress_data->cur_size * 100 / progress_data->sum_size);
	printf("percentage = %d %%\n", percentage);

	if (percentage <= 100)
	{
		while (cnt <= percentage)
		{
			printf("[%-100s] [%d%%]\r", proBuf, cnt);
			fflush(stdout);
			proBuf[cnt] = '#';
			Sleep(1);
			cnt++;
		}

	}
	printf("\n");
}

int main(int arc, char* argv[])
{
	progress_t progress_test = { 0 };
	progress_test.cur_size = 82;
	progress_test.sum_size = 100;
	progress_bar(&progress_test);

	return 0;
}

运行结果:

4、日志输出

日志输出常常需要带一些格式。最简单的方式如:

// 定义日志等级
typedef enum {
    LOG_DEBUG,
    LOG_INFO,
    LOG_WARNING,
    LOG_ERROR,
} log_level_t;

// 封装的日志函数
void log_message(log_level_t level, const char* message, const char* file, int line) {
    switch (level) {
    case LOG_DEBUG:
        printf("DEBUG: %s (%s:%d)\n", message, file, line);
        break;
    case LOG_INFO:
        printf("INFO: %s (%s:%d)\n", message, file, line);
        break;
    case LOG_WARNING:
        printf("WARNING: %s (%s:%d)\n", message, file, line);
        break;
    case LOG_ERROR:
        printf("ERROR: %s (%s:%d)\n", message, file, line);
        break;
    default:
        break;
    }
}

// 在代码中使用封装的日志函数
int main() {

    log_message(LOG_INFO, "This is an info message", __FILE__, __LINE__);
    log_message(LOG_DEBUG, "This is a debug message", __FILE__, __LINE__);
    log_message(LOG_WARNING, "This is a warning message", __FILE__, __LINE__);
    log_message(LOG_ERROR, "This is an error message", __FILE__, __LINE__);

    return 0;
}

运行结果:

5、总结 

        介绍完毕,希望能帮助到你,蟹蟹参阅!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1589829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024 大模型面试指南:兄弟们,冲啊

前言 老宋这俩月又跳槽了&#xff0c;自从去年从百度出来来到新公司&#xff0c;躺了一年&#xff0c;最近因为大模型技术发展&#xff0c;重新有了奋斗的方向和动力。 大模型的诞生必然会重塑整个 NLP 方向&#xff0c;因此&#xff0c;必须参与到这波浪潮中&#xff0c;果然…

HTTP快速面试笔记(速成版)

文章目录 1. HTTP概述1.1 HTTP简介1.2 HTTP的版本1.3 URL语法简介 2. HTTP报文2.1 HTTP报文格式2.2 HTTP的方法&#xff08;Method&#xff09;2.3 HTTP响应码2.4 HTTP请求头与响应头 3. HTTPS详解3.1 HTTPS介绍3.2 与HTTPS相关的加解密知识3.3 HTTPS交互流程 参考资料 1. HTTP…

2 万字 42 道Java经典面试题总结(2024修订版)- Java集合篇

目录 1、Java中常用的集合有哪些&#xff1f;2、Collection 和 Collections 有什么区别&#xff1f;3、为什么集合类没有实现 Cloneable 和 Serializable 接口&#xff1f;4、数组和集合有什么本质区别&#xff1f;5、数组和集合如何选择&#xff1f;6、list与Set区别7、HashMa…

基于深度学习的人脸表情识别系统(PyQT+代码+训练数据集)

基于深度学习的人脸表情识别系统&#xff08;PyQT代码训练数据集&#xff09; 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现 前言 本项目是基于mini_Xception深度学习网络模型的人脸表情识别系统&#x…

el-upload文件缩略图只显示一张图片

采用elementui库vue2版本&#xff0c;flask后端 el-upload组件上传一张图片之后不在出现新增加号 可以实现

基于公共转点的Alpha shapes有序边缘点提取

1、原理介绍 由Edelsbrunner H提出的alpha shapes算法是一种简单、有效的快速提取边界点算法。其克服了点云边界点形状影响的缺点,可快速准确提取边界点,其原理如下:对于任意形状的平面点云,若一个半径为a的圆,绕其进行滚动,其滚动的轨迹形成的点为轮廓点。需要注意的是,…

深入理解计算机系统 家庭作业 2.84

这题没有这个要求所以可以用 ? > : < 这种运算 以下代码用的是位级运算.因为我误解了题意 呜呜呜 想看用判断的代码请自行百度 ((((ux<<9>>9)<<((ux<<1>>24)-127)) - ((uy<<9>>9)<<((uy<<1>>24)-127)))>…

TMS320F280049 EPWM模块--TZ子模块(6)

下图是TZ子模块在epwm中的位置&#xff0c;可以看到TZ子模块接收内外部多种信号&#xff0c;经过处理后生成最终epwm波形&#xff0c;然后通过gpio向外发出。 TZ的动作有4个&#xff1a;拉高/拉低/高阻/不变。 TZ的内部框图见下图&#xff0c;可以看出&#xff1a; 1&#xf…

每日一题 — 水果成篮

思路&#xff1a; 通过阅读上面文字得出问题&#xff1a;就去只有两个种类的最大长度的连续子数组&#xff0c;这时我们可以想到用哈希表来存储数据&#xff0c;记录数据的种类和每个种类的数量。 解法一&#xff1a;暴力递归&#xff08;right每次遍历完都回退&#xff09; 解…

windows本地运行dreamtalk踩坑总结

dreamtalk是一个语音图片转视频的一个工具&#xff0c;就是给一段语音加一个头像图片&#xff0c;然后生成一段头像跟语音对口型的视频&#xff0c;其实还是很有意思的&#xff0c;最近阿里发布了一个类似的模型&#xff0c;但是还没开源&#xff0c;从展示视频看&#xff0c;阿…

Day31:贪心 LeedCode 455.分发饼干 376. 摆动序列 53. 最大子序和 蓝桥杯.填充

贪心算法一般分为如下四步&#xff1a; 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 做题的时候&#xff0c;只要想清楚 局部最优 是什么&#xff0c;如果推导出全局最优&#xff0c;其实就够了。 假设你是一位很棒的家…

场景文本检测识别学习 day04(目标检测的基础概念)

经典的目标检测方法 one-stage 单阶段法&#xff1a;YOLO系列 one-stage方法&#xff1a;仅使用一个CNN&#xff0c;直接在特征图上预测每个物体的类别和边界框输入图像之后&#xff0c;使用CNN网络提取特征图&#xff0c;不加入任何补充&#xff08;锚点、锚框&#xff09;&…

QT系列教程(2) 创建项目和编译

新建Qt Widgets应用 我们启动qt creator 创建项目&#xff0c;选择Qt Widgets应用 接下来选择项目目录&#xff0c;项目名字就叫helloworld 构建系统选择qmake 我们创建一个名字为HelloDialog的类&#xff0c;继承于QDialog 构建套件选择你们安装的就行了&#xff0c;我这里选…

SV-704XT 100W网络有源音柱 校园广播音柱

SV-704XT 100W网络有源音柱 一、描述 SV-704XT是深圳锐科达电子有限公司的一款壁挂式网络有源音柱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;其采用防水设计&#xff0c;功率100W。SV-704XT作为网络广播播放系统的终…

嵌入式:第二天(C语言入门)

目录 一、基础语法 位运算符&#xff1a; & -&#xff08;与运算&#xff09; | -&#xff08;或运算&#xff09; ^ -&#xff08;异或运算&#xff09; ~ -&#xff08;取反运算&#xff09; << -&#xff08;左移运算符&#xff09; >> -&#xff0…

MyBatis 中的动态 SQL 的相关使用方法

为什么会有动态SQL&#xff0c;把SQL写死不是比较方便吗&#xff1f;其实有很多的举例&#xff0c;这里我那一个常见的来说&#xff0c;像我们用户注册&#xff0c;会有必填字段和非必填字段&#xff0c;有些传来的参数不一样&#xff0c;那对应的SQL也不一样&#xff0c;因此&…

【ctf.show】获得百分之百的快乐

1.打开靶场 2.根据页面代码&#xff0c;get请求值只能小于4位数&#xff0c;否则会回显hack&#xff01; 尝试后确实是这样的&#xff1a; 请求值小于4位数&#xff0c;页面无变化&#xff1a; 发送请求值ls查看内容 3.根据2返回的值&#xff0c;发送值为?1>nl 创建一个nl…

每日一练(力扣)

我的思路是暴力枚举: 情况1:相同&#xff0c;就让子串和原串同时后移继续比较 情况2:不相同&#xff0c;就只让原串后移 public int strStr(String haystack, String needle) {if (haystack.length() < needle.length()){return -1;}for (int i 0; i < h…

Java | Leetcode Java题解之第15题三数之和

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> threeSum(int[] nums) {int n nums.length;Arrays.sort(nums);List<List<Integer>> ans new ArrayList<List<Integer>>();// 枚举 afor (int first 0;…

Harmony鸿蒙南向外设驱动开发-Audio

Audio驱动概述 多媒体系统是物联网设备开发中不可缺少的一部分&#xff0c;Audio作为其中重要的一个模块&#xff0c;Audio驱动模型的构建显得尤为重要。 本文主要介绍基于HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架开发的Audio驱动&#xff0c;包括Aud…