嵌入式软件开发
文章平均质量分 72
嵌入式开发星球
以培养优质嵌入式工程师为目的,持续分享优质嵌入式内容;答疑解惑,获取资源,可添加博主微信:18270720391;关注公众号:“嵌入式开发爱好者”,输入:“1024” 领取资料。
展开
-
嵌入式开发中常用的资源网站分享
/B站是一个有很多好资料的网站//这个就不用多说了,国内的同学应该都用过。原创 2024-04-09 23:53:49 · 773 阅读 · 0 评论 -
嵌入式中内联函数基本操作方法
inline关键字是C99标准的型关键字,其作用是将函数展开,把函数的代码复制到每一个调用处。这样调用函数的过程就可以直接执行函数代码,而不发生跳转、压栈等一般性函数操作。可以节省时间,也会提高程序的执行速度。内联函数相比宏函数,会进行语法检查。宏函数是在预处理阶段生效,内联函数是在编译阶段进行语法检查然后替换。内联函数相比普通函数,少了上下文切换的步骤所以执行会更快一些。内联函数被多次调用,会使固件大小膨胀,内联函数的高速是以空间来换时间。内联函数不可递归。原创 2024-04-08 19:24:44 · 948 阅读 · 0 评论 -
嵌入式中蓝牙OTA升级原理与步骤分析
所谓DFU(Device Firmware Update),就是设备固件升级的意思,而OTA(Over The Air)是实现DFU的一种方式而已,准确说,OTA的全称应该是OTA DFU,即通过空中无线方式实现设备固件升级。只不过大家为了方便起见,直接用OTA来指代固件空中升级(有时候大家也将OTA称为FOTA,即Firmware OTA,这种称呼意思更明了一些)。只要是通过无线通信方式实现DFU的,都可以叫OTA,比如2G/3G/4G/WiFi/蓝牙/NFC/Zigbee,他们都支持OTA。原创 2024-03-13 12:39:48 · 1243 阅读 · 0 评论 -
ROS机器人操作系统底层原理及代码剖析
本文介绍ROS机器人操作系统(Robot Operating System)的实现原理,从最底层分析ROS代码是如何实现的。把通信的内容(也就是消息message)序列化是通信的基础,所以我们先研究序列化。尽管笔者从事机器人学习和研发很长时间了,但是在研究ROS的过程中,“序列化”这个词还是这辈子第一次听到。所以可想而知很多人在看到“把一个消息序列化”这样的描述时是如何一脸懵逼。但其实序列化是一个比较常见的概念,你虽然不知道它但一定接触过它。原创 2024-03-13 12:34:28 · 1372 阅读 · 0 评论 -
嵌入式中要能看懂这50个电路分享
大家好,今天主要给大家分享一下,嵌入式工程师常见的硬件电路。单片机电源声音模块收音机485蓝牙光耦can光敏电阻单片机矩阵单片机电路时钟ADC接口电路红外发射显示模块红外接收蜂鸣器驱动流水灯usb供电烧录电路数码管EEPROMLCD1602电路数码管max485红外开关译码器移位寄存器步进电机控制复位电路下载电路电源模块温度模块红外热敏电阻交通灯时钟555彩屏矩阵按键单片机总结:嵌入式工程师应该知道的50种,硬件设计电路,平常设计过程中,可以关注一下。原创 2024-03-13 12:09:53 · 386 阅读 · 0 评论 -
嵌入式系统中端口号的理解与分析
每当看到有人的简历上写着熟悉 tcp/ip, http 等协议时, 我就忍不住问问他们: 你给我说说, 端口是啥吧!可惜, 很少有人能说得让人满意... 所以这次就来谈谈端口(port), 这个熟悉的陌生人.在此过程中, 还会谈谈间接层, naming service 等概念, IoC, 依赖倒置等原则以及 TCP 协议的一些重点知识.原创 2024-03-11 22:56:07 · 970 阅读 · 0 评论 -
嵌入式C语言中 #pragma once 的作用
看起来似乎是想兼有两者的优点。不过只要使用了#ifndef就会有宏名冲突的危险,也无法避免不支持#pragma once的编译器报错,所以混用两种方法似乎不能带来更多的好处,倒是会让一些不熟悉的人感到困惑。选择哪种方式,应该在了解两种方式的情况下,视具体情况而定。只要有一个合理的约定来避开缺点,我认为哪种方式都是可以接受的。而这个已经不是标准或者编译器的责任了,应当由程序员自己或者小范围内的开发规范来搞定。为了避免同一个文件被include多次:1、#ifndef方式。原创 2024-03-11 22:48:15 · 751 阅读 · 0 评论 -
嵌入式中有关软件开发的错误观念
从学生转变为职业人的过程是很艰难的,因为我们要与自己积累了多年的“老毛病”作斗争,这些“老毛病”包括:做事拖拉、不守时、不遵守规则、怕吃苦等。就像发射火箭卫星一样,摆脱重力的束缚所花费的燃料是最多的,一旦成功,那么以后的流程就会比较轻松了。所谓万事开头难,也就是这个道理。今天就给大家分享一下,要想掌握工作中C语言的基本技能,我们需要破除哪些错误观念呢?原创 2024-03-01 21:51:39 · 883 阅读 · 0 评论 -
嵌入式中常见语言对内存管理基本方法
所以说语言没有好坏,只有适应不适应。如果程序员用new创建一个对象,但是用完之后忘记 delete,就会造成这个对象占用的内存不能释放,这就是内存泄漏。(2)C语言:C语言中编译器帮我们管理内存地址,我们都是通过编译器提供的变量名等来访问内存的,操作系统下如果需要大块内存,可以直接通过APl ( malloc free)来访问系统内存。(1)汇编语言:根本没有任何内存管理,内存管理全靠程序员自己,汇编中操作内存时直接使用内存地址(譬如0xd0020010 ),非常麻烦,但如果用得好,程序执行效率是最高的。原创 2024-02-25 08:26:18 · 444 阅读 · 0 评论 -
嵌入式中数据结构二叉树详解与实现
本篇针对面试中常见的二叉树操作作个总结:前序遍历,中序遍历,后序遍历;层次遍历;求树的结点数;求树的叶子数;求树的深度;求二叉树第k层的结点个数;判断两棵二叉树是否结构相同;求二叉树的镜像;求两个结点的最低公共祖先结点;求任意两结点距离;找出二叉树中某个结点的所有祖先结点;不使用递归和栈遍历二叉树;二叉树前序中序推后序;判断二叉树是不是完全二叉树;判断是否是二叉查找树的后序遍历结果;给定一个二叉查找树中的结点,找出在中序遍历下它的后继和前驱;原创 2024-02-24 17:00:09 · 938 阅读 · 0 评论 -
嵌入式中十大经典排序算法(代码实现),建议收藏
兜兜转转,时间如白驹过隙。时间证明了一个道理,原创 2024-02-24 16:51:11 · 610 阅读 · 0 评论 -
嵌入式软件分层隔离的方法
嵌入式软件开发分层、模块化是理想状态,实际开发中因各种限制而有所取舍,但这不妨碍学习参考优秀软件架构,即使有部分思想在项目中落实,也是大有裨益的。原创 2024-02-05 23:50:36 · 991 阅读 · 0 评论 -
嵌入式软件bug分析基本要求
软件从来不是一次就能完美的,需要以包容的眼光看待它的残缺。那问题究竟为何产生,如何去除呢?原创 2024-02-05 23:18:01 · 1866 阅读 · 0 评论 -
嵌入式软件设计方式与方法
思从深而行从简软件开发,难的不是编写软件,而是编写功能正常的软件。软件工程化才能保证软件质量和项目进度,而设计模式使代码开发真正工程化,设计模式是软件工程的基石。所谓设计模式就是对常见问题的通解,合理地运用设计模式可以很好地解决很多问题,每种模式针对一个通用问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。真正的高手能云淡风轻地用最简单的方法解决最复杂的问题,这也是高级程序员与新手的本质区别之一。原创 2024-02-05 21:42:32 · 2376 阅读 · 0 评论 -
嵌入式软件中常见的 8 种数据结构
数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途。几乎所有已开发的程序或软件系统都使用数据结构。此外,数据结构属于计算机科学和软件工程的基础。当涉及软件工程面试问题时,这是一个关键主题。因此,作为开发人员,我们必须对数据结构有充分的了解。在本文中,我将简要解释每个程序员必须知道的8种常用数据结构。1.数组数组是固定大小的结构,可以容纳相同数据类型的项目。原创 2024-02-02 23:24:57 · 1402 阅读 · 0 评论 -
嵌入式中C 语言中的三块技术难点
C 语言在嵌入式学习中是必备的知识,甚至大部分操作系统都要围绕 C 语言进行,而其中有,几乎是公认级别的“今天就来带你将这三块硬骨头细细拆解开来,一定让你看明白了。原创 2024-02-02 23:02:33 · 1598 阅读 · 0 评论 -
嵌入式C语言基本编写规范
结构名或枚举名必须小写,单词之间有下划线_字符结构或枚举可以包含typedef关键字所有结构成员都必须小写所有枚举成员必须是大写的结构/枚举必须遵循doxygen文档语法在声明结构体时,它可以使用以下三种不同的选项之一:1、当结构体仅用名称声明时,它的名称后不能包含_t后缀。char* a;char b;2、当只使用typedef声明结构时,它的名称后面必须包含_t后缀。char* a;char b;原创 2024-01-22 10:20:43 · 966 阅读 · 0 评论 -
实现一个malloc内存分配器(图文并茂)
Next Fit说的是什么呢?我们要考虑到的关键一点就在于,与被释放的内存块相邻的内存块可能也是空闲的。从图中我们可以看到,被释放内存的下一个内存块也是空闲的,如果我们仅仅将这16个字节的内存块标记为空闲的话,那么当下一次申请20字节时图中的这两个内存块都不能满足要求,尽管这两个空闲内存块的总数要超过20字节。使用的内存块其前和其后都是空闲的,在当前的设计中我们可以很容易的知道后一个内存块是空闲的,因为我们只需要从当前位置向下移动16字节就是下一个内存块,但我们怎么能知道上一个内存块是不是空闲的呢?原创 2024-01-22 10:12:53 · 803 阅读 · 0 评论 -
嵌入式代码经常产生bug的五大原因
命名所有潜在共享的对象(包括全局变量,堆对象或外围寄存器和指向该对象的指针),以使风险对于所有将来的代码阅读者而言都是显而易见的;重要的是,从堆栈溢出到它对系统的负面影响之间的时间长短取决于使用阻塞位之前的时间。如果发现某个堆栈有问题,请在非易失性内存中记录特定的错误(例如哪个堆栈以及洪水的高度),并为产品的用户做一些安全的事情(例如,受控关闭或重置)可能会发生真正的溢出。使函数可重入的关键是暂停对外围设备寄存器,包括静态局部变量,持久堆对象和共享内存区域在内的全局变量的所有访问的抢占。原创 2024-01-06 17:34:43 · 1341 阅读 · 0 评论 -
如何写出高效清晰的嵌入式C程序
比如我们要处理“猴子选大王”的经典问题:一群猴子,手拉手排成一个圆,从任意一只猴子开始从1开始报数,当遇到要排除的数(预先设定)时该猴子退出该圈,从下一只猴子开始继续从1报数,如此反复,最终剩下的猴子便是猴子的大王。同时注意异常时的处理,比如上面两个if语句就是异常情况的判断,每种异常情况对应不同的返回值,这样便于程序过程的调试和数据的合法性。a、数据获取,为了程序的运行,上面的问题要获得猴子的总数,从那只猴子开始和剔除的个数;通过以上数据运算,可以完成相应链表元素的删除,这或许就是C语言程序的魅力所在。原创 2023-12-19 20:17:23 · 409 阅读 · 0 评论 -
嵌入式C语言代码的基本编写规范要求
软件质量是项目成败的关键点之一,在开发周期有限,人力资源不足的情况下,使用工具实现代码自动扫描,分析出潜在隐患点,从源头减少软件bug,是软件如期交付的重要保证。重复代码是不良代码最典型的特征之一。函数名定义,函数名称需体现出函数具体功能,均由功能单词拼接组成,使用小写字母和下划线拼接,其中全局函数必须以xx_为前缀,在.h里面申明全局函数,补充完整注释;说明:系统启动阶段,使用全局变量前,要考虑到该全局变量在什么时候初始化,两者之间的时序关系,谁先谁后,一定要分析清楚,不然后果往往是低级而又灾难性的。原创 2023-12-09 15:30:14 · 1300 阅读 · 0 评论 -
u-boot和bootloader到底有什么区别
uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了。uboot(universal bootloader)是一种可以用于多种嵌入式CPU的BootLoader程序,换言之,uboot是bootloader的一个子集。从上面就可以看出,刷机依靠的是uboot的fastboot命令,将镜像写到相应的FLASH中。原创 2023-10-21 14:25:30 · 176 阅读 · 0 评论 -
堆栈与堆(Stack vs Heap)有什么区别?
编写有效的代码需要了解堆栈和堆内存,这使其成为学习编程的重要组成部分。不仅如此,新程序员或职场老手都应该完全熟悉堆栈内存和堆内存之间的区别,以便编写有效且优化的代码。这篇博文将对这两种内存分配技术进行全面的比较。通过本文的结论,我们将对堆栈和堆内存有一个透彻的了解,从而使我们能够在编程工作中有效地使用它们。对比理解堆栈与堆的结构!原创 2023-10-03 17:45:00 · 184 阅读 · 0 评论 -
嵌入式系统中如何正确使用动态内存?
大家好,今天给大家分享一下,动态内存的使用方法。原创 2023-10-03 17:19:23 · 822 阅读 · 0 评论 -
嵌入式综合性开源项目分享
于是,我就自己根据需求写了简单的日志库,通过这几年项目的验证,大问题没有,后面维护项目时,发现了这个开源项目,又给我提供了一些思路。这个日志库相对要复杂一点,可能对新手不那么友好,当然,如果你有一定编程经验,或者C语言功底比较好,理解起来问题还是不大。好了,时间有限,本文就分享到这里,希望这些开源项目,对新手、想提高自己编程水平的小伙伴有帮助。也是一个值得学习的开源项目,特别是没有框架思维的小伙伴,更应该多学习一些优秀的框架。相对上面分享的模块要复杂一点,但文档说明写的还不错,只要有基础,问题不大。原创 2023-06-29 22:30:21 · 3066 阅读 · 0 评论 -
关于二叉树的操作,详细操作与实现方法
树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。在面试环节中,二叉树也是必考的模块。本文主要讲二叉树操作的相关知识,梳理面试常考的内容。一起来复习吧。本篇针对面试中常见的二叉树操作作个总结:前序遍历,中序遍历,后序遍历;层次遍历;求树的结点数;求树的叶子数;求树的深度;求二叉树第k层的结点个数;判断两棵二叉树是否结构相同;求二叉树的镜像;求两个结点的最低公共祖先结点;求任意两结点距离;找出二叉树中某个结点的所有祖先结点;不使用递归和栈遍历二叉树;二叉树前序中序推后序;原创 2023-06-26 21:59:50 · 319 阅读 · 0 评论 -
C语言指针类型,8个例子给你讲明白
这是一个整型的二级指针,用于存放一个内存的地址,该地址对应的内存中存放了另一个整型变量的地址。假定(*va[3])是X,外面是 int (X)(int),所以指针是指向函数的。这是一个数组,该数组里面的成员是整型的指针,分别指向int型的内存。注意,该地址类型是int [3]型,他的值是0x40004000,void (*va)(int) 这是一个指针,指向一个函数,这是一个整型指针变量,用于存放一个整型变量的地址,函数的形参是是int型,返回值是int型。这是一个指针,指向一个int型数组。原创 2023-06-23 17:39:43 · 577 阅读 · 0 评论 -
嵌入式中编写可移植 C/C++ 程序的要点方法
然而,对于一些比较特殊的应用,如图形组件本身,就拿 GTK+ 来说吧,基于 X Window 的功能和基于Win32的功能,两者差巨大,除了窗口、事件等基本概念外,几乎没有什么相同的,如果不事先了解各个平台的特性,在设计时就精心考虑的话,抽象出来的抽口在另外一个平台几乎无法实现。在读取二进制文件,没有什么问题。这一点是建立在分层设计之上的,大多数底层函数,像线程、同步机制和 IPC 机制等等,不同平台提供的函数,几乎是一一对应的,封装这些函数很简单,实现 Adapter 的工作几乎只是体力活。原创 2023-06-22 22:14:47 · 739 阅读 · 0 评论 -
嵌入式BSP工程师基本任务分析
前面我们讲过,嵌入式硬件工程师负责设计硬件,画出PCB图,工厂会根据PCB图生产出对应的电路板。一个嵌入式系统光有电路板是不够的,还要有对应的软件支持,软件开发的前提是首先使板子正常稳定的工作,然后再在其上编写对应的应用软件以实现其特有的功能。其中使板子。原创 2023-06-04 17:23:47 · 724 阅读 · 0 评论 -
嵌入式系统中I2C总线通信基本方法
将 I2C spec 文章总结为一篇,目录如下。原创 2023-06-03 22:35:51 · 988 阅读 · 0 评论 -
嵌入式系统中重要的编程思想:分层与时间片
死循环的话,肯定就是在原地等,什么都不做,而看看上面的程序,他只是判断是否定时够,具体的定时在统一的时间子程序里面做,判断没有到时间的话就跳出了,继续跑其它的程序,直到当时间到了,单片机判断出flag_delay,key_flow 符合条件,开始进入按键处理程序了,在这个期间,单片机都在做其它事情,只是一个主循环跑回来判断一次,所以单片机完全有空跑其它的程序,而没有将时间都耗在消抖上面。(注:单片机是不会停的,永远在不断循环的跑,这个跟学校学的貌似有点不同,面试的时候被问过这个问题 …原创 2023-05-31 22:46:28 · 1243 阅读 · 3 评论 -
常见的GPIO口框架分析
注意,pinctrl 子系统也是一个标准的 platform 驱动,当设备和驱动匹配的时候,probe 函数会执行,只是 pinctrl 子系统采用的 arch_initcall 去声明,而不是 module_init(device_initcall),所以在系统起来的时候它会先加载。你以为两者是分离的,实际上不是的,gpio 子系统是基于 pinctrl 子系统的,gpio 的 API 接口的实现很多都是基于 pinctrl 子系统的函数。②、初始化 GPIO,比如输出功能、上拉、速度等等。原创 2023-05-27 22:49:48 · 1234 阅读 · 0 评论 -
嵌入式中利用软件实现定时器的两种方法分析
经过分析,在大多数定时业务中,往往只需要在某个时间段定时一次,也就是说定时器会开启定时和结束定时,当然,用数组的实现的定时器也可以开启定时和关闭定时,只需要用start标志去决定就行了,但是用数组实现的方式中,即使你关闭了定时器,也就是去掉了start标志,此定时器虽然不运行了,但是数组的空间不会减少,硬件 tick依然要轮询所有数组。如果我们有一个软件定时器,所有定时业务都依赖于软件定时器,不仅节省硬件资源,以后在移植的时候也只需要将软件定时器和硬件相关的部分修改就行了,其他部分都不用动。原创 2023-05-07 22:51:45 · 900 阅读 · 0 评论 -
C语言中函数宏的三种封装方式详解
函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。a = b;b = tmp但上述的宏具有一个明显的缺点:当遇到ifwhile等语句且不使用花括号仅调用宏时,实际作用范围在宏的第一个分号后便结束。即a = b和b = tmp均不受控制语句所作用。因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为{}和({})。下文将一一对三种方式进行分析,比较各自的优劣点。2.{}方式INT_SWAP宏使用{}{ \a = b;原创 2023-05-01 18:16:55 · 1029 阅读 · 0 评论 -
嵌入式软件中常见的 8 种数据结构详解
使用给定键的哈希函数计算的值称为哈希值,它表示该值映射到的表的索引。从上面给出的最后两个示例中,我们可以看到,当哈希函数为多个键生成相同的索引时,就会发生冲突。数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作。从列表的开头删除,从列表的末尾删除,然后从列表的中间删除。在过去的几十年中,已经开发出各种类型的树木,以适合某些应用并满足某些限制。一些示例是二叉搜索树,B树,红黑树,展开树,AVL树和n元树。在列表的开头插入,在列表的末尾插入,然后在列表的中间插入。原创 2023-04-22 09:44:52 · 1066 阅读 · 0 评论 -
嵌入式C语言九大数据结构操作方式详解
数据结构博大精深,没有高等数学的讳莫如深,也没有量子力学的玄乎其神,但是其在计算机科学的各个领域都具有强大的力量。本文试图采用图解的方式对九种数据结构进行理论上的介绍,但是其实这都是不够的。即便是简单的数组、栈、队列等结构,在实际使用以及底层实现上都会有许多优化设计以及使用技巧,这意味着还需要真正把它们灵活的用起来,才能够算是真正意义上的熟悉和精通。但是本文可以作为常见数据结构的一个总结,当你对某些结构有些淡忘的时候,不妨重新回来看看。原创 2023-03-08 18:19:08 · 1484 阅读 · 0 评论 -
深度:用10000字总结了嵌入式C语言必学知识点
在前面提到过,指针占有的空间与芯片的寻址宽度有关,32位平台为4字节,64位为8字节,而指针的加减运算中的长度又与它的类型相关,如char类型为1,int类型为4,如果你仔细观察上面的代码就会发现par的值增加了8,这是因为指向指针的指针,对应的变量是指针,也就是长度就是指针类型的长度,在64位平台下为8,如果在32位平台则为4,这些知识理解起来并不困难,但是这些特性在工程运用中稍有不慎,就会埋下不易察觉的问题。动态内存的生存期由程序员决定,使用非常灵活,但同时遇到问题也最多。原创 2023-02-04 10:51:50 · 2614 阅读 · 0 评论 -
Linux中应用层C语言的经典实现方法
应用可以定时获取CPU的温度,比如程序异常崩溃时,我们可能需要分析多方面原因,CPU温度就是其中之一。有时间我们需要获取某个文件的大小,比如如果需要发送文件里的内容,则需要知道文件的大小。系统时间戳很常用,比如log输出时,可以附带时间戳数据,方便分析。MAC地址,有时候会作为设备ID实用,作业设备唯一标识。大家好,今天给大家分享几个使用的代码实现。有时候需要获取本机IP进行显示。第一:如何获取CPU的温度。第二: 获取文件大小。第四:获取MAC地址。...原创 2022-08-14 18:10:29 · 718 阅读 · 0 评论 -
嵌入式软件开发十二种开发工具与链接之优秀
目录第一个:开发进度管理工具。第二个:代码BUG管理工具第三个:代码版本与控制工具第四个:项目文件管理工具第五个:代码检测工具第六个:嵌入式系统开发工具第七个:嵌入式代码编辑工具第八个:代码调试工具第九个:linux开发工具第十个:文件对比工具第十一个:嵌入式文件搜索工具第十二个:Debug调试工具目的:解决大家找工具麻烦的问题第一个:开发进度管理工具。登录/注册 - Teambition 帐号https://account.teambit原创 2022-03-19 17:35:22 · 8686 阅读 · 0 评论 -
C语言内存问题详细分析之完善
第一:解决:程序在计算机中是如何运行的问题如果你的电脑上安装了QQ,你希望和好友聊天,会双击QQ图标,打开QQ软件,输入账号和密码,然后登录就可以了。那么,QQ是怎么运行起来的呢?首先,有一点你要明确,你安装的QQ软件是保存在硬盘中的。双击QQ图标,操作系统就会知道你要运行这个软件,它会在硬盘中找到你安装的QQ软件,将数据(安装的软件本质上就是很多数据的集合)复制到内存。对!就是复制到内存!QQ不是在硬盘中运行的,而是在内存中运行的。为什么呢?因为内存的读写速度比硬盘快很多。对于读写速度,内存原创 2022-03-05 12:27:53 · 1520 阅读 · 0 评论