- 博客(423)
- 资源 (17)
- 收藏
- 关注

原创 Linux通信IPC随笔
名字: HLS大神 QQ:331908961**功能:Linux内核间任意通信实现**#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <unistd.h>#include <string.h>#include <stdio.h>typedef struct MSG
2021-03-26 11:28:26
459
3
原创 嵌入式软件开发要注意这七中错误事项
是啊,能不急吗,排到后边,还需要解决代码冲突的问题。这句话在某种程度上是对的,但是你从事这项工作的年限,并不一定代表你获得了相同年限的工作经验,正如一句话所说:“我们以为我们是工作了十年,其实却只有一年的工作经验,只不过又重复用了九年”。其实不只是新人——一些有几年工作经验的开发人员也会表现出这种傲慢,一部分原因是其满足于个人获得的专业成就,另一部分可能的原因是其缺乏和优秀的人共事的机会,有点坐井观天。缺乏经验的开发人员不接受任何建设性的建议,甚至代码评审中的评论,他都会认为是对他个人的一种攻击。
2023-12-02 18:25:26
370
原创 嵌入式 C 语言中的全局变量问题
3、随着产品的后续升级,几个月没有接触这个系统的原创者会发现,很多雷区他本人也忘记了,于是每次的产品升级维护周期越来越长,因为修改一个功能会冒出很多bug,而按下一个bug,会弹出其他更多的bug。3、由于软件的分层不合理,到了后期维护,哪怕仅是增加修改删除小功能,往往要从上到下掘地三尺地修改,涉及大多数模块,而原有的代码注释却忘了更新修改,这个时候,交给后来维护者的系统会越来越像一个“泥潭”,注释的唯一作用只是使泥潭上方再加一些迷烟瘴气。4、在函数里面开个静态的全局变量,全局数组,是不占用栈空间的。
2023-12-02 14:57:15
841
原创 嵌入式数据传输及存储的C语言实现
写入的时候采用下面方式:读取时可以采用下面方式:各种数据类型的SPI,UART,I2C等传输问题。这里我们以串口通信为例,比如主机要发送如下格式数据给从机:
2023-12-02 14:13:58
353
原创 我的创作纪念日
1、获得了2万多粉丝的支持,这是对我的肯定,让我继续前行。提示:你过去写得最好的一段代码是什么?千里之行始于足下,早日成为心目中的英雄。2、认识到技术是需要迭代更新的,不断出发,不断攀登。提示:当前创作和你的工作、学习是什么样的关系。提示:可以和大家分享最初成为创作者的初心。提示:在创作的过程中都有哪些收获。1、创作已经成为生活的一部分。
2023-11-30 17:58:47
325
原创 嵌入式的学习需要合理规划时间
需要作者熟知CPU架构基础知识、ARM历史,arm架构、汇编指令、GNU汇编、混合汇编、Makefile、SoC、GPIO、PWM、RTC、ADC、I2C、SPI、u-boot、网卡、网络协议等等知识点,文章深度 我的文章有的虽然看上去很深或者内容很广, 这其实是得益于我之前做过很多项目、以及做嵌入式培训的时候积累的知识。我的工作还是很忙的 工作性质原因, 往往一阵阵,有时候很忙,要996, 有时候可能稍微没那么忙,不需要加班;每个人都要面临加班,要带孩子,要照顾生病的老人,要各种应酬......
2023-11-25 14:38:15
1261
原创 linux系统中select函数的用法实现
select底层通过轮询方式获取读,写,异常位图中注册的socket文件事件,如果检测到有socket文件处于就绪状态,则会将socket对应的事件设置到输出位图,等所有位图中的socket都被轮询完,会统一将输出位图通过copy_to_user函数复制到输入位图,并且覆盖掉输入位图注册信息。,select总共有三种位图,分别为读,写,异常位图,用户程序预先将socket文件描述符注册至读,写,异常位图,然后通过select系统调用轮询位图中的socket的读,写,异常事件。//微妙,超时多少微秒。
2023-11-25 14:28:57
856
原创 轻量级的嵌入式模块化软件架构
mr-library是一个面向嵌入式系统的轻量级框架,提供统一的底层驱动设备模型以及基础服务功能,具有模块化设计、可配置性和扩展性的特点, 可帮助开发者快速构建嵌入式应用程序。mr-library框架支持互斥锁、对象管理等基础内核功能。集成异步事件驱动框架(event)、多时基软件定时器(soft-timer) 等服务。提供串口、SPI、I2C、ADC/DAC等常见外设的驱动设备模型,通过统一的驱动接口(open、close、ioctl、read、write)访问底层硬件设备,解耦底层驱动和应用。
2023-11-20 19:42:28
38
原创 单片机和FreeRTOS上跑机器人ROS的应用
至关重要的是,可以为微ROS提供繁重的堆栈使用方任务,并为其分配静态分配的堆栈,从而防止将来出现堆和其他任务初始化问题。该层在RCLC中提供了相对于ROS 2的附加功能,RCLC是用C99编写的库,其中专门设计和开发了与RCLCPP提供的功能类似的功能,例如便利功能或执行程序,以适合微控制器。本文说的micro-ROS,是基于ROS2进行优化的一套轻量级ROS系统,它提供了完全部署的ROS 2生态系统的大多数吸引人的工具和功能,并具有入式和低资源设备的卓越能力,可以运行在MCU硬件平台。
2023-11-20 19:39:12
590
原创 模电和爱情一样,都很难懂!
有付出就有回报的永远只是饱和区里那一小块明显,大部分人都生活在放大区,当基极电流定下来后,由于存在着巨大的厄尔利电压,即使你在努力,起伏也不大,只能在那个小范围里慢慢前进有限的距离,等到啥时候时间把你带到击穿区,看似你飞升了,确实你也飞升了,直接飞到了天堂。的,你的付出总可以在他那得到几百倍的回报,但是结婚后,就改成了共集电极了,往往你的付出都是得不到等价的输出了,兴许过了七年之痒,没心肺的那部分男人还会变成共射极,这时候的输出虽然放大很多,却是反相了,和你的期望完全不同了。所以,只能折中一下,用个。
2023-11-20 19:35:07
49
原创 不可思议,红警居然开源了!
此次开源,并不涉及游戏素材和游戏引擎,只包括 TiberianDawn.DLL 和 RedAlert.dll 的源码,允许 Mod 社区更好的改变游戏行为。这款游戏也是当年西木头(WestWood)打造的爆款即时战略游戏之一,以至于一提到即时战略游戏,我脑海中第一个浮现的就是红警了。不过就在最近,有网友在 Github 上发现,EA 悄悄地搞了个大事件,把《命令与征服》系列中的 2 个游戏的部分源码开源了!被收购之后,由于EA的管理不善,西木头最终走向了衰落,后面再也没有开发出红警2这样的爆款游戏了。
2023-11-20 19:32:41
39
原创 嵌入式中一篇搞定Cmake使用教程
PS:前面使用set_target_properties重新定义了库的输出名称,如果不使用set_target_properties也可以,那么库的名称就是add_library里定义的名称,只是连续2次使用add_library指定库名称时(第一个参数),这个名称不能相同,而set_target_properties可以把名称设置为相同,只是最终生成的库文件后缀不同(一个是.so,一个是.a),这样相对来说会好看点。通过与add_definitions()的配合,就可以控制单个bin文件的打印输出了。
2023-11-18 13:28:53
98
原创 嵌入式系统中相关的高质量开源项目
FreeModbus是一款开源的Modbus协议栈,但是只有从机开源,主机源码是需要收费的。同时网上也没有发现比较好的开源的Modbus主机协议栈,所以才开发这款支持主机模式的FreeModbus协议栈。这是一个以物联网项目为主方向分享web开发教程,制作并演示一个物联网系统是怎么跑起来的,介绍如何学习相关知识。整个教程里,推荐先用后学,先把项目跑起来看看效果,再按需学习相关知识,直到自己能把项目写出来。这是一个很棒的嵌入式资源汇总的项目。以上就是本次的分享,仅是分享几个大家可能会喜欢的项目。
2023-11-18 13:23:17
138
原创 嵌入式中一文搞懂ARM处理器架构
A32架构的ARM的地址总线为32位,故CPU可寻址范围为0x00000000~0xffffffff寻址空间为4GB,所有的内部和外部存储或者外设单元都需要通过对应的地址来操作,不同芯片外设的种类数量寻址空间都不一样,为了能让内核更方便的管理不同的芯片设计,ARM内核会先给出预定义的存储映射。不过需要注意的是由于修改的CPSR是该模式下的影子CPSR,即SPSR,因此并不是实际的CPSR,所以一般的做法是修改影子CPSR,然后执行一个MOVS指令来恢复执行某个断点并切换到新模式。每条指令都采用标准字长。
2023-11-18 13:19:21
76
原创 嵌入式 Linux 移植与系统启动方法
start_kernel()是所有Linux平台进入系统内核初始化后的入口函数,它主要完成剩余的与硬件平台相关的初始化工作,在进行一系列与内核相关的初始化后,调用第一个用户进程-init进程并等待用户进程的执行,这样整个Linux内核便启动完毕。Linux也需要在一个分区上存放系统启动的必要文件,比如内核启动运行后的第一个程序(init进程)、用于挂接文件系统的脚本、给用户提供操作界面的shell程序,应用程序所要依赖的库等,这些必要的基本文件的集合称为根文件系统(一般也叫做rootfs)。
2023-11-18 13:15:25
149
原创 电机开源驱动器基本操作与实现
该驱动器提供先进的功能,如静音和平稳的运动、高精度的位置控制和节能功能,使其成为各种应用的理想选择,包括机器人、CNC 机床和 3D 打印机。🤝 协作机器人和学习系统:精确的轴位置和速度检测使电机驱动器适用于协作机器人和学习系统,从而实现安全的人机协作。🔭 相机/望远镜稳定系统:相机和望远镜系统的稳定方向依赖于精确的定位和位置保持,从而简化了系统校准,以实现精确的组件对准。⏰ 具有实时时钟的精确定时:专用的 HSE 和 RTC 时钟晶振可确保对时间关键型任务的精确定时、可靠的代码执行和准确的时间处理。
2023-11-17 16:19:18
48
原创 嵌入式Linux系统中内存分配详解
虚拟空间 和 物理内存 都分为 内核空间 和 用户空间。虚拟地址需要通过页表转化为物理地址,然后才能访问。用户虚拟空间 只能映射 物理内存中的用户内存,无法映射到物理内存中的内核内存,也就是说,用户进程只能操作用户内存。内核空间 只能被 内核 申请使用,用户进程只能操作用户空间的物理内存和虚拟空间。当用户进程 调用系统调用的时候,会将其对应的代码和数据运行在内核空间中。所以当调用 内核空间 读取文件或者网络数据的时候,首先会将数据拷贝到内存空间,然后在将数据从内核空间拷贝到用户空间。
2023-11-11 07:54:49
92
原创 深入理解 TCP;场景复现,掌握鲜为人知的细节
现在耳熟能详的 TCP 连接就是三次握手,四次挥手,那么你有想过 为什么是三次握手,而不是两次或者四次呢?相信比较平常回答的是:“因为三次握手才能保证双方具有接收和发送的能力”。这样的回答是没问题的,但是这回答是片面的,并没有说出主要的原因。在前面我们知道了什么是 TCP 连接:用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。所以,重要的是为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接。
2023-11-11 07:52:07
755
原创 嵌入式中常见的显示屏接口有哪些?
显示屏接口一般有I2C、SPI、UART、RGB、LVDS、MIPI、EDP和DP等。下面简要总结一下。一般3.5寸以下的小尺寸LCD屏,显示数据量比较少,普遍采用低速串口,如I2C、SPI、UART。I2C总线是半双工,两线。I2C总线的工作速度分为3种:S(标准模式):100Kbps,即 100/8 = 12.5KB/sF(快速模式):400Kbps,即400/8 = 50KB/sHS(高速模式):3.4Mbps,即3.4M/8 = 435KB/s。
2023-11-10 20:21:31
62
原创 嵌入式中如何将BootLoader与APP合并成一个固件
嵌入式固件一般分为BootLoader和App,BootLoader用于启动校验、App升级、App版本回滚等功能,BootLoader在cpu上电第一阶段中运行,之后跳转至App地址执行应用程序。因此,在发布固件的时候,会存在BootLoader固件和App固件;此时我们期望是将BootLoader固件和App固件合并成为一个固件,这样在量产时只需烧录一次即可。
2023-11-05 20:09:36
206
原创 嵌入式中如何把C++代码改写成C语言代码
多继承也是可以改的,将多个基类的成员全部拷到子类里,遇到重复的成员名,则在前面加上前缀来区别,当然这个指的是基类之间有相同的,如果是派生类和基类之间有重名的,则会覆盖基类。第一种方法,对于类的数目很少的情况还可以,如果类的数目比较多,全部理解源代码,然后重写就很耗时间,而且很容易出错,更甚者,如果遇到大的项目想全部理解源代码几乎是不可能的。C++与C最大的区别,就是C++中的类的概念和特性,将C++改为C的问题,就转换成如何将类化去的问题。类的析构函数是由系统调用的,在C中则要显式调用。
2023-11-05 20:06:04
118
原创 【无标题】
这里和大家简单分享一下我的看法。题主应该想要讨论的是嵌入式软件,下面说一下个人观点;嵌入式的硬件属性;嵌入式的岗位需求;嵌入式的学习曲线;嵌入式的薪资;
2023-11-05 20:02:03
151
原创 嵌入式中利用VS Code 远程开发原理
这套远程开发环境最大的好处是不用给电脑装太多软件,即使是电脑配置低点都没关系,因为所有的编辑器插件扩展和代码都在云端,通过 SSH 连接操作一个VS Code打遍所有。而且由于远程开发插件的存在,不论我在哪里,只要有电脑都能方便的打开云端开发环境,非常的方便,这么好用的工具大幅提升生产力,所以今天来分享给大家。
2023-11-05 20:00:15
151
原创 嵌入式中C++ 编程习惯与编程要点分析
另一个问题是static成员变量的定义。static成员变量必须在类外部进行定义:class Aprivate://①//②注意①是声明,②才是定义,定义为变量分配了内存。
2023-10-28 15:15:42
106
原创 10款轻量型的嵌入式GUI库分享
从上面的几张图可以看出,Embeded Wizard GUI设计的界面效果还是很漂亮的。Altia有将近30年的发展史,并且通过了AutomotiveSPICE汽车级HMI的一级认证,这个认证共分为6个级别,0到5级,其中第5级是最高等级。Storyboard也有一款非常优秀的GUI设计器,能够大大的加速GUI的设计,而且足够绚丽,各种仪表,工控,医疗,物联网等都能很好的支持。LittlevGL是一个免费的开源图形库,提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素、漂亮的视觉效果和低内存占用。
2023-10-28 15:04:48
232
原创 嵌入式PID算法理论+实践分析
对于数字示波器来说它无法直接量化模拟信号,替代的办法就是持续周期性采样,然后将得到的一系列采样点显示出来,当采样速率越高,显示的图像越真实,这就是数学中极限的与微分的思想。调参技巧:在PID参数整定时,采取先内环再外环的方法,也就是先单独使用速度环控制,得到满意的参数后, 再把位置环套在外面,整定位置环参数,最后根据整体效果对速度环参数进行微调。由(式 2-8)可以看出,如果计算机控制系统采用恒定的采样周期τ,一旦确定 A、 B、 C,只要使用前后三次测量的偏差值,就可以由(式 2-8)求出控制量。
2023-10-28 14:55:48
97
原创 嵌入式系统中C++ 类的设计和实现分析
C++代码提供了足够的灵活性,因此对于大部分工程师来说都很难把握。本文介绍了写好C++代码需要遵循的10个最佳实践,并在最后提供了一个工具可以帮助我们分析C++代码的健壮度。原文:10 Best practices to design and implement a C++ class。
2023-10-28 14:45:25
118
原创 基于LiteOS的智慧农业案例实验分享
LiteOSLiteOS源码GitHub仓库链接:其源码一级目录结构如下:其内核包括任务管理、内存管理、时间管理、通信机制、中断管理、队列管理、事件管理、定时器等操作系统基础组件,可以单独运行。Huawei LiteOS是一个支持多任务的操作系统。在Huawei LiteOS中,一个任务表示一个线程。其任务是抢占式调度机制,同时支持时间片轮转调度方式。高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。创建任务示例:左右滑动查看全部代码>>>
2023-10-24 21:53:43
125
原创 嵌入式linux总线设备驱动模型分析
嵌入式linux系统按照,分层,抽象的思想,按照这样的思想来设计我们的程序可以更容易写出耦合性低、独立性强、可重用性强的代码。Linux内核中更是存在着更多的分离、分层思想的代码,platform平台设备驱动就是用了这样的思想。本篇笔记我们一起来学习一下platform驱动框架。
2023-10-23 21:02:43
174
原创 嵌入式linux系统中设备树基础知识
【Linux笔记】总线设备驱动模型中在platform_device部分有简单说明描述设备有两种方法:一种是使用platform_device结构体来指定;另一种是使用设备树来描述。本篇笔记我们就来简单地学习一下设备树的一些知识。设备树简单理解就是描述设备信息(资源)的一棵树。设备树(Device Tree)用代码体现如下:这些代码被保存在.dts/dtsi后缀文件中,也即设备树源文件。
2023-10-23 20:58:52
115
原创 嵌入式硬件中常见的100种硬件选型方式
应该等长优先,差分信号是以信号的上升沿和下降沿的交点作为信号变化点的,走线不等长的话会使这个交点偏移,对信号的时序影响较大,另外还给差分信号中引入了共模的成分,降低信号的质量,增加了EMI。通孔是贯穿整个PCB 的过孔,盲孔是从PCB 表层连接到内层的过孔,埋孔是埋在PCB 内层的过孔。如下图所示,绕在纸盆上的导线构成的线圈处于同心圆盘形(截面是E 形)磁铁的磁场中,放大器送出的音频电流通过线圈,纸盆在磁铁的磁场驱动下就振动起来,纸盘上的鼓膜产生音频的振动,从而使鼓膜周围的空气振动起来而产生声音。
2023-10-22 08:10:47
1480
原创 嵌入式Linux中内存管理详解分析
虚拟空间 和 物理内存 都分为 内核空间 和 用户空间。虚拟地址需要通过页表转化为物理地址,然后才能访问。用户虚拟空间 只能映射 物理内存中的用户内存,无法映射到物理内存中的内核内存,也就是说,用户进程只能操作用户内存。内核空间 只能被 内核 申请使用,用户进程只能操作用户空间的物理内存和虚拟空间。当用户进程 调用系统调用的时候,会将其对应的代码和数据运行在内核空间中。所以当调用 内核空间 读取文件或者网络数据的时候,首先会将数据拷贝到内存空间,然后在将数据从内核空间拷贝到用户空间。
2023-10-21 17:22:45
134
原创 一个进程最多可以创建多少个线程基本分析
最后简单总结下:32 位系统,用户态的虚拟空间只有 3G,默认创建线程时分配的栈空间是 8M,那么一个进程最多只能创建 380 个左右的线程。64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。
2023-10-21 17:05:26
206
原创 嵌入式硬件库的基本操作方式与分析
c-periphery 是一个 C 语言编写的硬件访问库,已支持 Serial、I2C、SPI、MMIO、PWM、GPIO 等硬件。约 4500 行代码,每个硬件模块的代码都是相对独立,上手难度小,非常使用在嵌入式 Linux 平台上使用。另外,我们可以基于它优秀的代码框架,不断地扩展出自己需要的功能模块,最终形成自己产品专用的 Linux 硬件抽象层,绝对的嵌入式开发的利器。
2023-10-21 15:11:13
1030
原创 uboot 启动流程详细分析参考
从 norflash 启动可以省事多了,不仅如此,我们自己编写的裸机程序需要调试,一般也是直接烧写到 norflash 中进行的,因为只要我们将编译好的可执行文件放到 norflash 的开始,开发板上电以后就会从 norflash 的第一条指令开始取指执行,我们后面写裸机程序的调试就是用这种方式进行的。
2023-10-21 14:45:54
205
原创 u-boot和bootloader到底有什么区别
uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了。uboot(universal bootloader)是一种可以用于多种嵌入式CPU的BootLoader程序,换言之,uboot是bootloader的一个子集。从上面就可以看出,刷机依靠的是uboot的fastboot命令,将镜像写到相应的FLASH中。
2023-10-21 14:25:30
127
原创 C与C++之间相互调用的基本方法
由于每一条 #include 指令后面都隐藏这一个未知的世界,除非你刻意去探索,否则你永远都不知道,当你把一条条#include指令放置于extern "C" { }里面的时候,到底会产生怎样的结果,会带来何种的风险。毕竟,我们完全可以不必为不必要的事情买单,不是吗?但如果你的产品是一个雄心勃勃的,试图兼容各种编译器的(包括未知的)跨平台产品, 我们可能不得不使用下述方法来应对各种情况 ,其中__ALIEN_C_LINKAGE__是为了标识那些在C和C++编译中都定义了__cplusplus宏的编译器。
2023-10-15 17:11:41
132
原创 嵌入式C语言中整形溢出问题分析
C语言的整型问题相信大家并不陌生了。对于整型溢出,分为无符号整型溢出和有符号整型溢出。对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。上面的代码会输出:0 (因为0xff + 1是256,与2^8求模后就是0)对于signed整型的溢出,C的规范定义是“undefined behavior”,也就是说,编译器爱怎么实现就怎么实现。
2023-10-10 20:42:07
101
实现网页控制ARM板的LED
2023-04-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人