首页 > 其他分享 >嵌入式小技巧

嵌入式小技巧

时间:2023-08-01 22:35:27浏览次数:32  
标签:__ 技巧 ELOG FMT 嵌入式 elog TAG LVL

前言

最近有时上班摸鱼刷手的的时候,看到一些公众号里的有关嵌入式的一些文章,感觉有些文章写的还挺不错的,于是准备稍微整理记录一下。

① 固件版本信息

1.使用背景

在工作中对于版本信息管理十分重要,有时由于客户众多,如果没有有效的管理好软件版本,就会导致后期维护费时费力。

2.实现方式

1.定义一个结构体,里面定义一些软件版本相关的信息

typedef struct
{
    char szVersion[32];    // 软件版本
    char szBuildDate[32];  // 程序编译日期
    char szBuildTime[32];  // 程序编译时间
}AppInfo_t;

2.定义一个只读结构体变量(只读的目的:防止程序改变、节约RAM),赋初值(其中__DATE___TIME__是C语言中的内置宏,分别是当前的编译日期和编译时间)。

const AppInfo_t sg_tAppInfo =
{
    "MiniHeating_V0.1.0",
    __DATE__,
    __TIME__,
};

3.通过Easylogger初始化后打印,将版本信息输出到串口log上

void elog_system_init(void)
{
    /*init 初始化*/
    elog_init();
    /*配置不同输出基本的输出信息*/
    elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_DIR | ELOG_FMT_FUNC | ELOG_FMT_LINE);
    elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_DIR | ELOG_FMT_FUNC | ELOG_FMT_LINE);
    elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_DIR | ELOG_FMT_FUNC | ELOG_FMT_LINE);
    elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | ELOG_FMT_TAG);
    elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_LVL | ELOG_FMT_TAG);
    elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_LVL | ELOG_FMT_TAG);
    /*elog开始*/
    elog_start();

    /*打印版本信息*/
    elog_i(TAG,"Version  : %s",sg_tAppInfo.szVersion);
    elog_i(TAG,"buildDate  : %s",sg_tAppInfo.szBuildDate);
    elog_i(TAG,"buildTime  : %s",sg_tAppInfo.szBuildTime);
}

4.下载程序后,通过串口工具在MCU上电就能收到版本信息的打印

1690817214746

注意:若main文件没有重新编译,编译时间是不会发生改变的。

参考文章:单片机固件中加入版本信息的方式 (qq.com)

② 比较两个数大小宏定义

1.使用背景

常规方式:

#define MIN(a,b) ((a) < (b) ? (a) : (b))

在使用这个时候若这样写:

least = MIN(i++, j++);

就会出现错误

least = ((i++) < (j++) ? (i++) : (j++));

无论谁大谁小,最后结果都会多加一次。

2.优化后的方法

#define MIN(x,y) {
        typeof(x) _x = (x);   \
        typeof(y) _y = (y);   \
        (void)(&_x = &_y);    \
        _x < _y ? _x : _y;    \
              })

其中 (void)(&x==&y) 是用于检查 x 和 y 的类型是否相同。它有两个作用:

  • 一是用来给用户提示一个警告。对于不同类型的指针比较,编译器会发出一个警告,提示两种数据的类型不同。
  • 二是两个数进行比较运算,运算的结果却没有用到,有些编译器可能会给出一个 warning,加一个(void)后,就可以消除这个警告。

求最大值方法类似,可自行尝试。

参考文章:完美实现C语言比较两个数大小的宏定义 (qq.com)

标签:__,技巧,ELOG,FMT,嵌入式,elog,TAG,LVL
From: https://www.cnblogs.com/tangwc/p/17599297.html

相关文章

  • MySQL 连接语句优化技巧的示例和代码
    当涉及到实际案例时,以下是一些可以帮助实现快速查找的MySQL连接语句优化技巧的示例和代码:1.使用索引:CREATEINDEXidx_nameONyour_table(name);上述代码在名为your_table的表的name列上创建了一个索引。这将加快对该列的查询速度。2.编写有效的查询语句:SELECT*......
  • 提供高达400MHz性能ADBF704WCCPZ411、ADBF705WCBCZ411嵌入式处理器(DSP)
    这些器件是ADSP-BF70xBlackfin数字信号处理器(DSP)产品系列中的一员。新款Blackfin+处理器内核将16位双MAC、32位MAC和16位复杂MAC结合为先进的信号处理引擎。它还将干净且正交的RISC式微处理器指令集的优势和单指令、多数据流(SIMD)多媒体能力结合为一个指令集架构。而且Blac......
  • 白日梦的Elasticsearch实战笔记,32个查询案例、15个聚合案例、7个查询优化技巧。
    目录一、导读二、福利:账号借用三、_searchapi搜索api3.1、什么是querystringsearch?3.2、什么是querydsl?3.3、干货!32个查询案例!四、聚合分析4.1、什么是聚合分析?4.2、干货!15个聚合分析案例五、7个查询优化技巧公众号、欢迎关注一、导读Hi!大家久等了!时隔10天,白日梦的Elasticsea......
  • 白日梦的Elasticsearch实战笔记,ES账号免费借用、32个查询案例、15个聚合案例、7个查询
    目录一、导读二、福利:账号借用三、_searchapi搜索api3.1、什么是querystringsearch?3.2、什么是querydsl?3.3、干货!32个查询案例!四、聚合分析4.1、什么是聚合分析?4.2、干货!15个聚合分析案例五、7个查询优化技巧欢迎关注一、导读Hi!大家久等了!时隔10天,白日梦的Elasticsearch笔记......
  • 探索嵌入式世界:51单片机的魅力与应用
    导语:嵌入式系统在现代科技发展中扮演着至关重要的角色,而51单片机作为其中的经典代表,其广泛应用和强大的性能备受业界推崇。本文将深入探讨51单片机的特点、应用以及未来的发展趋势,通过全面解析带领读者进入这个扣人心弦的嵌入式世界。一、51单片机的背景及特点51单片机是最早由Inte......
  • SQL总结-MySQL索引使用和优化技巧
    本文将全面介绍MySQL索引的使用技巧,并提供多种优化索引的方法,帮助读者提高数据库查询性能。MySQL索引基础知识索引的工作原理索引就像书的目录,可以帮助MySQL快速定位数据,从而加速查询。索引类型MySQL支持多种索引类型:B树索引(B-Tree):最常见的索引类型,可以对值进行排......
  • ADO.NET的最佳实践技巧
    ADO.NET的最佳实践技巧简介本文为您提供了在MicrosoftADO.NET应用程序中实现和获得最佳性能、可伸缩性以及功能的最佳解决方案;同时也讲述了使用ADO.NET中可用对象的最佳实践;并提出一些有助于优化ADO.NET应用程序设计的建议。本文包含:•有关.NET框架包含的.NET框架数据......
  • SAS 编程技巧 - PROC SQL(二)
    上一节中,我们介绍了如何使用SQL创建和删除数据集、视图和索引。这一节我们介绍如何使用SQL修改数据集的结构和更新数据集中的数据。修改数据集结构使用ALTERTABLE可以修改数据集的结构,包括增加、删除变量、修改变量属性,以及对数据完整性约束(integrityconstraints)的操作......
  • 链表双指针技巧汇总 [labuladong-刷题打卡 day1]
    双指针合并21.合并两个有序链表比较简单的双指针比较算法,两个指针分别指向待合并链表/序列,比较后选择符合条件的指针移动Trick:链表在实现时,带头节点的链表在操作中更方便题解/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNo......
  • SAS 编程技巧 - PROC SQL(一)
    SAS编程技巧-PROCSQL(一)SQL全称StrucuredQueryLanguage,即结构化查询语言,广泛应用于关系型数据库中。SASBase使用PROCSQL提供了对SQL的实现。PROCSQL过程可以帮助你完成以下任务:创建数据集、视图和索引删除数据集、视图和索引修改数据集的结构更新数据集的......