嵌入式大杂烩
一位喜欢分享的嵌入式软件工程师
一位全网累计6万+粉丝的嵌入式博主
一位能源专业转做嵌入式的过来人
展开
-
socket | 基于C语言的天气客户端的实现
一、前言上一篇笔记分享了【socket笔记】TCP、UDP通信总结,这一篇分享一个用C语言写的、基于TCP的一个HTTP天气客户端的实现,这个一个控制台应用程序,最终的界面如下:关于天气预报,之前我已经用STM32+ESP8266wifi模块实现过了一遍,感兴趣的可查阅往期笔记:基于STM32的智能天气预报系统。这次这个基于C语言控制台程序的HTTP客户端的天气解析的代码和之前分享的差不多,...原创 2019-07-08 16:44:42 · 5983 阅读 · 13 评论 -
C语言 | GDB调试器如何使用?
GDB简介 GDB(GNU Debugger)是一个强大的命令行调试工具。一般的,在Windows下进行开发,很少操控命令行调试,调试器大多与编译器都集成在IDE里了。当然,在Windo...原创 2020-09-26 23:26:31 · 1294 阅读 · 1 评论 -
C语言 | 数据抽象思想的应用
大家好,我是杂烩君。本次给大家分享一篇关于数据抽象的小短文:在往期文章:什么是不完全类型?中,我们清楚地知道了数据抽象的好处。这一篇再一起来看一个简单的小技巧。实际项目中,常常会有多个模块协同工作,各个模块之间会相互调用。两种声明方法:一种是在把对外提供的接口在本模块头文件中声明,其它模块需要调用时包含这个头文件就可以。另一种是调用者在调用之前使用extern进行声明。我比较倾向于第一种方法,严格把只在本模块文件中使用的函数使用static声明,供外部使用的函数在头文件里声...原创 2021-08-16 21:49:59 · 731 阅读 · 0 评论 -
访问非法内存为什么不会出错?
大家好,我是杂烩君。上篇文章我们分享了一段代码:有位读者在朋友圈评论我的文章:(type * )0不是指向空地址吗?(type*)0->member不是访问非法内存了吗?为什么不会出错?这篇文章我们就来解释这个问题。原创 2022-08-20 21:45:21 · 896 阅读 · 0 评论 -
柔性数组在实际项目中的应用?
大家好,我是杂烩君。柔性数组在实际中应用还是挺多的,看过上一篇文章分享一种灵活性很高的协议格式(附代码例子)的小伙伴不知有没有注意到我们有使用了柔性数组:本篇文章我们就来一起学习柔性数组。什么是柔性数组? C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫作 柔性数组 。柔性数组的特点:结构体中柔性数组成员前面必须至少有一个其他成员。sizeof返回的这种结构大小不包括柔性数组的内存。包...原创 2022-08-27 21:30:48 · 729 阅读 · 0 评论 -
C语言 | 分享一个最简单的log模块
大家好,我是杂烩君。我们平时开发中,log打印必不可少,仅仅使用printf,则log信息不好定位。一些开源稳定、成熟的log模块功能往往比较强大,而我们可能又不需要那么多功能。这里简单分享一个我自己用的一个极简的log模块:log颜色可设置、带时间戳、文件、行号、函数。这个log模块仅包含log.h与log.c两个文件。log模块代码log.h:#ifndefLOG_H#defineLOG_H#ifdef__cplusplusextern"C"{#endif...原创 2022-02-09 21:30:00 · 1739 阅读 · 0 评论 -
C语言 | 可测试性软件设计要点!
方式一,因为有一个数据是在函数内部从flash中读取的,所以这个数据我们不太方便进行控制,而能控制的只有参数b。那么,这样子,我们在调用测试时,测得就不是很全,也不能灵活地控制测试路径。设计的软件可测试性强,我们就能在开发阶段进行充分地测试,在开发阶段尽可能多地解决一些逻辑上的问题,从而保证更高质量地软件交付。方式二,计算所依赖的数据都通过函数参数留出来了,我们可以很方便地对函数进行测试,可以很方便地输入不同的数据组合。所以,之后写代码,写之前,有必要先想清楚,这个模块最后要怎么进行自测?原创 2024-03-06 00:21:07 · 28 阅读 · 0 评论 -
C语言,日志调试法的一些规则!
当我们的函数设计有多个功能函数模块的时候,当某个模块出现问题时,这个时候我们只是关心此模块,那么可以先把其他模块的日志功能关闭掉,只是打开关心模块的日志。使用日志动态过滤控制功能可以动态地调整日志地输出,但前提是项目使用地日志组件具备这样的能力。这样我们就可以在日志文件里通过模块标签来筛选某个模块的日志,提高我们定位问题的效率。在Release版本中,可能需要减少日志输出或者去掉一些不必要的日志,需要一个开关来进行切换。分支判断中,各执行分支需要加上对应的日志信息,可以帮助我们准确地知道程序执行的走向。原创 2024-03-05 00:18:20 · 291 阅读 · 0 评论 -
C语言 | bug解决不了?使用日志法
交心 在我们嵌入式开发中,调试代码的方法有很多。比如使用调试器在线调试、借助一些测量仪器、输出调试日志等方式。没有哪种方法是最好的调试方法,实际开发中需要根据实际情况借助不同的方法进行调...原创 2020-08-12 23:56:48 · 1011 阅读 · 0 评论 -
C语言 | 结构体、联合体嵌套使用的一些实用操作
结构体、联合体是C语言中的构造类型,结构体我们平时应该都用得很多。但是,对于联合体,一些初学的朋友可能用得并不多,甚至感到陌生。我们先简单看一下联合体:在C语言中定义联合体的关键字是un...原创 2020-12-21 23:46:33 · 6579 阅读 · 8 评论 -
C语言 | 什么是不完全类型?
C语言类型C的类型分为:对象类型(char、int、数组、指针、结构体等)函数类型不完全类型什么是不完全类型?C/C++中不...原创 2020-10-28 08:00:00 · 1704 阅读 · 1 评论 -
C语言 | 什么是动态链接与静态链接?
什么是链接?对于初学C语言的朋友,可能对链接这个概念有点陌生,这里简单介绍一下。我们的C代码编译生成可执行程序会经过如下过程:链接就是把目标文件与一些库文件生成可执行文件的一个过程。关于更详细的编译过程,可查阅往期笔记:C语言的编译过程静态、动态链接?1、什么是静态链接?静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由...原创 2020-02-14 22:35:35 · 3821 阅读 · 1 评论 -
C语言 | 嵌入式重点知识之回调函数
前言上文分享了一个专用的双链表的基本操作示例:双链表的操作示例(附代码)这里提到了一个关键词:专用。与专用对应的词是通用。我们从字面上可以很容易理解这两个词,专用就是针对特定情况的,特点就是很有局限性;通用就是可以针对大多数情况(更理想的就是所有情况),特点就是适用性广。为什么说上篇笔记的双链表是专用的?从我们的定义的元素数据类型就可以知道,我们这个双链表是只是用来存储int类型的数据的...原创 2020-02-05 23:45:36 · 2659 阅读 · 2 评论 -
C语言 | 嵌入式位操作精华技巧汇总
分享关于位操作一些笔记:一、位操作简单介绍首先,以下是按位运算符:在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值,这时就可以使用按位运算符进行操作。下面进行举例说明,假如有一个8位的TEST寄存器:当我们要设置第0位bit0的值为1时,可能会这样进行设置:TEST = 0x01;但是,这样设置是不够准确的,...原创 2019-11-27 08:47:02 · 2075 阅读 · 0 评论 -
谈谈嵌入式 C 语言踩内存问题!
除了数据存储区之外,多申请12个字节。自定义申请内存的函数自然是要兼容malloc的使用方法。返回值自然要返回数据存储区的地址。原创 2023-06-07 22:50:11 · 496 阅读 · 0 评论