自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(438)
  • 收藏
  • 关注

原创 嵌入式LINUX开发成长计划

嵌入式LINUX开发成长计划

2024-05-28 18:59:40 1246 1

原创 嵌入式MCU开发成长计划

单片机工程师的2年成长计划

2022-07-07 13:50:00 4329 7

原创 电力IEC61850协议总结

SCL(Structured Control Language,结构化控制语言)是一种符合国际标准IEC 61131-3(也称为DIN EN 61131-3)的高级编程语言,专门用于可编程逻辑控制器(PLC)的编程。是不是可以理解成:将目标设备抽象成多个逻辑设备的组合,然后有很多逻辑结点,每个结点下有数据,数据里又分很多细节数据。类似于ble里的服务、profile、特征、属性啥的。

2025-04-04 08:30:33 298

原创 电力IEC60870-5-104协议总结

规约总述。

2025-04-04 08:30:26 313

原创 电力IEC60870-5-103协议总结

这段话表达了两个重点:1、IEC103主要用于保护设备(如继电保护装置)的通信;2、IEC103有两种信息交换的方法;继续看后续这里表明,103可以使用网络传输。:IEC103协议支持多种物理层和数据链路层的传输方式,包括RS-232、RS-485等串行通信方式,同时也支持网络方式的通信,即TCP/IP协议。:在网络方式下,IEC103协议可以利用现有的网络基础设施进行数据传输,提高了通信速率和效率。这种方式特别适用于需要远程监控和控制的应用场景。

2025-04-04 08:30:20 722

原创 电力IEC60870-5-101协议总结

ACD是控制域中的一个位,用于指示从动站是否有一级用户数据需要传输。

2025-04-04 08:30:12 782

原创 linux内核数据结构分析之链表

但是,这里还有个问题需要解决,那就是,怎么能通过结构体的某个成员来获取另一个成员的值呢?这就需要内核中定义的一个container_of宏定义:container_of 的主要作用是通过给定的结构体成员的地址来获取整个结构体的起始地址。这在处理复杂的数据结构,如链表时非常有用。

2025-03-19 23:08:39 939

原创 Linux如何在设备树中表示和引用设备信息

以下是关于自定义属性的定义和引用方法的详细解释:自定义属性的定义自定义属性允许用户根据特定硬件设备的特性和需求来定义属性名和属性值。这些属性在Linux内核和驱动程序中并不具有特殊的含义,而是由用户在设备树文件中定义,并在驱动程序中通过特定的API接口进行读取和处理。自定义属性的引用。

2025-03-16 22:08:25 843

原创 关于网络传输中的加密问题总结

发送方使用接收方的公钥对数据进行加密,接收方则使用其私钥对数据进行解密。由于公钥和私钥之间存在数学关系,但无法从公钥推导出私钥,因此保证了数据的安全性。:非对称加密是一种加密技术,它使用一对密钥,即公钥和私钥。:对称加密是一种加密技术,其中加密和解密使用相同的密钥,或者使用两个可以简单地相互推算的密钥。:常用于保护敏感信息的安全传输,如SSL/TLS协议中的密钥交换、数字签名和验证、电子商务中的支付安全等。:广泛应用于需要快速加密大量数据的场景,如文件加密、数据库加密、网络通信中的批量数据传输等。

2025-03-05 07:51:18 659

原创 Linux中是如何进行日志管理的?

syslog

2025-03-04 23:03:02 853

原创 Linux中死锁问题的探讨

在 Linux 中,

2025-03-04 22:47:30 1072

原创 Linux内核启动流程之start_kernel函数

总之,“Do the rest non-init'ed, we're now alive”这句话在Linux内核启动过程中具有重要的标志意义,它表示内核已经基本完成了初始化工作,即将启动用户空间的第一个进程和相关内核线程,使系统进入一个更加活跃和可用的状态。rest_init函数里面做了哪些事情?设置CPU状态:使用一系列的set_cpu_*函数(如set_cpu_online、set_cpu_active、set_cpu_present、set_cpu_possible)来设置当前CPU的状态。

2025-02-22 16:14:24 890

原创 Linux内核顶层Makefile详解-2

linux顶层makefile

2025-02-22 15:46:20 547

原创 计算机网络之应用层

DHCP提供即插即用联网机制(只要设备进入DHCP服务器管辖范围内),主机可以从服务器动态获取IP地址、子网掩码、默认网关、DNS服务器名称与IP地址,允许地址重用(每一个DHCP服务器有自己的IP地址池,当一个设备进入服务器范围内,就给一个IP,做了以后就收回来,可以给其他设备用),支持移动用户加入网络,支持在用地址续租。如果网络内有DHCP服务器,且存在有空余IP地址的DHCP服务器,此时这些DHCP服务器就会拟分配给主机一个IP地址及相关配置,这个拟分配的信息主机会收到,但是还不能用。

2025-01-23 21:01:46 1291 1

原创 计算机网络之运输层

一个进程可以与一个端口号绑定,再加上主机IP地址该端口号就在网络层面上唯一标识一台主机上的唯一一个进程。一台机器上会存在大量的进程,为了区分所有的进程,设计了PID来加以区分(系统的概念);但是只有部分进程需要进行网络数据请求,所以用port来标识这些需要进行网络数据请求的进程(网络的概念)。在互联网的不同计算机中,相同的端口号是没有关联的。TCP面向字节流:流是流入进程或从进程中流出的字节序列,虽然应用进程和TCP的交互是一次发送一个数据块,但是TCP会把交下来的数据仅仅看成一连串的无结构字节流。

2025-01-23 21:01:40 1268

原创 计算机网络之网络层

CIDR中已经废弃了IP地址的分类,无分类编址的命名也是由此得来的,所以目前基本已经不再采用所谓的A类、B类、C类的IP地址分类表示法,引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;我们可能都知道这些地址由四个字节组成,用点分十进制表示以及它们的A,B,C分类等,然而,在总数大约为四十多亿个可用IP地址里,你知道下面一些常见的有特殊意义地址吗?如果你发现你的主机IP地址是一个诸如此类的地址,很不幸,十有八九是你的网络不能正常运行了。寻址这样一个地址,是不能把它发到网络接口的。

2025-01-23 21:01:35 1469

原创 计算机网络之链路层

如果这个数据要发出去,也就是离开当前局域网,那么,该数据就会被发往路由器,路由器从下到上,经过物理层、链路层,此时还就算获取到了目标MAC地址也没用,因为此时已经不在局域网内了,需要做的是根据路由表去找到下一跳,所以,还需要上升到网络层,去寻找路由表,可以看到,路由器需要走到第三层,才能进行下一步转发,因此,路由器属于三层设备。虽然局域网只覆盖链路层和物理层,但是这并不意味着,在局域网内通信只需要走这两层,不管是在局域网内还是局域网之间,因为应用是最上层,所以只要是应用之间的通信,都需要走完所有的层。

2025-01-23 21:01:28 1251

原创 计算机网络之物理层

找到被叫用户后,向被叫用户振铃,同时向主叫用户送回铃音,此时从主叫端到被叫端就建立了一条专用电路,双方进入通话状态。:在通话过程中,双方通过这条专用电路进行语音信号的传输,只要不挂机,该电路一直被双方独占,保证了通话的稳定性和实时性,不会受到其他通信的干扰。不过,随着通信技术的发展,现代电话通信也融入了一些分组交换等技术来优化网络资源利用和提高通信效率,但电路交换仍然是其核心基础交换方式之一。:当通话结束后,任何一方挂机,交换机会收到挂机信号,随后拆除已建立的通话通路,并将线路资源释放,以便其他用户使用。

2025-01-23 21:01:20 762

原创 计算机网络三张表(ARP表、MAC表、路由表)总结

交换机是局域网中的核心设备之一,其主要工作在数据链路层。它通过记录端口所连接设备的源 MAC 地址和端口对应关系来建立 MAC 地址表,从而实现数据帧的快速转发。当交换机接收到一个数据包时,会查找数据包中的目标 MAC 地址,并在 MAC 地址表中查找相应的条目。如果找到了匹配,交换机就知道应该将数据包发送到与目标 MAC 地址关联的相应物理端口;如果找不到匹配,交换机会将数据包广播到所有连接的端口,以确保目标设备能够接收到。

2025-01-23 20:53:15 3270

原创 curl简介与libcurl开源库的使用总结

curl

2025-01-22 22:33:39 1333

原创 数据结构之树

参考:数据结构:树(Tree)【详解】_数据结构 树-优快云博客

2025-01-08 22:15:39 347

原创 数据结构之哈希表

参考:图文并茂详解数据结构之哈希表 - 知乎 (zhihu.com)数据结构之哈希表以及常用哈希的算法表达(含全部代码)_哈希表代码-优快云博客数据结构(哈希表)_哈希函数需要指定哈希表大小吗-优快云博客

2025-01-08 22:14:19 251

原创 C++和C语言的交互总结

在没有extern "C"的情况下,如果C++代码尝试调用C语言编写的函数,链接器可能无法找到对应的符号,因为两者的符号命名规则不同。:通过extern "C",C++代码可以调用C语言编写的函数或使用C语言定义的全局变量,反之亦然。总的来说,extern "C"是C++中一种重要的机制,它允许C++代码以C语言的方式编译和链接特定的函数或变量,从而实现了C++与C语言之间的无缝集成和互操作性。块中声明或定义C语言风格的函数,然后这些函数就可以在C++代码中被调用,就像它们是普通的C++函数一样。

2025-01-04 21:30:09 486

原创 Linux中指针的高级用法总结

回调一般都是上层用户传递函数指针给下层接口,然后下层触发某种条件时,执行上层的用户函数,因为通常都是上层调用下层,但是这种情况反过来,是下层调用上层,所以称为回调。:使用函数指针会增加代码的复杂性和可读性,特别是在大型项目中,过多的函数指针可能导致代码难以维护和理解。:直接调用函数的代码复用性较差,如果需要在多个地方使用相同的逻辑,可能需要复制粘贴代码,增加了维护成本。:函数指针可以用来实现多态,即不同的函数可以实现相同的接口,从而在运行时根据需要调用不同的实现。这对于性能敏感的应用非常重要。

2024-12-26 16:29:45 170

原创 Linux加载一个应用程序的过程总结

总的来说,Linux加载应用进程的过程是一个复杂而精细的操作,涉及多个系统调用和内核函数的协作。同时,内核还会初始化ELF进程环境,设置系统调用的返回地址为ELF可执行文件的入口点。在这个过程中,内核会根据ELF文件的格式(如魔数)来确定文件的类型,并调用相应的装载处理方式。:当所有准备工作完成后,内核会将系统调用的返回地址修改为被加载的ELF程序的入口地址。是一个内核级系统调用,它负责将新的可执行文件加载到内存中,并替换当前进程的地址空间。这个新进程是父进程的一个副本,包括代码段、数据段和堆栈等。

2024-12-21 09:48:31 460

原创 Linux内核之网络概述

Linux 优秀的网络功能和它严密科学的设计思想是分不开的。在分析 Linux 网络内容之前,我们先大体上了解一下网络部分的设计思想及其特点,这对于我们后面的分析很有帮助。(1)Linux 的网络部分沿用了传统的层次结构。网络数据从用户进程传输到网络设备要经过 4 个层次,如图 12.1 所示。每个层次的内部,还可以再细分为很多层次。

2024-12-14 11:46:04 734

原创 Linux模块机制和设备驱动程序

在 Linux 中输入/输出设备被分为 3 类:块设备,字符设备和网络设备。这种分类的使用方法,可以将控制不同输入/输出设备的驱动程序和其他操作系统软件成分分离开来。例如文件系统仅仅控制抽象的块设备,而将与设备有关的部分留给低层软件,即驱动程序。字符设备指那些无需缓冲区可以直接读写的设备,如系统的串口设备/dev/cua0 和/dev/cua1。块设备则仅能以块为单位进行读写的设备,如软盘、硬盘、光盘等,典型块的大小为 512 或 1024 字节。从名称使人想到,字符设备在单个字符的基础上接收和发送数据。

2024-12-14 11:42:31 1008

原创 Linux虚拟文件系统

虚拟文件系统又称虚拟文件系统转换(Virual Filesystem Switch ,简称 VFS)。说它虚拟,是因为它所有的数据结构都是在运行以后才建立,并在卸载时删除,而在磁盘上并没有存储这些数据结构。如果只有 VFS,系统是无法工作的,因为它的这些数据结构不能凭空而来,只有与实际的文件系统,如 Ext2、Minix、MSDOS、VFAT 等相结合,才能开始工作,所以 VFS 并不是一个真正的文件系统。与 VFS 相对应,我们称 Ext2、Minix、MSDOS 等为具体文件系统。

2024-12-14 11:37:25 948 1

原创 Linux内存管理

Linux 是为多用户多任务设计的操作系统,所以存储资源要被多个进程有效共享;且由于程序规模的不断膨胀,要求的内存空间比从前大得多。Linux 内存管理的设计充分利用了 计算机系统所提供的虚拟存储技术,真正实现了虚拟存储器管理。第二章介绍的 Intel 386 的段机制和页机制是 Linux 实现虚拟存储管理的一种硬件平台。

2024-12-14 11:35:43 927

原创 Linux进程调度与切换

在多进程的操作系统中,进程调度是一个全局性、关键性的问题,它对系统的总体设计、 系统的的实现、功能设置以及各个方面的性能都有着决定性的影响。根据调度的结果所作的进程切换的速度,也是衡量一个操作系统性能的重要指标。进程调度算法的设计,还对系统的复杂性有着极大的影响,常常会由于实现的复杂程度而在功能与性能方面作出必要的权衡和让步。进程调度与时间的关系非常密切,因此,本章首先讨论与时间相关的主题,然后才讨论进程的调度,最后介绍了 Linux 中进程是如何进行切换的。

2024-12-14 11:33:40 798

原创 Linux进程描述

Linux 中的每个进程由一个 task_struct 数据结构来描述,task_struct 数据结构在 include/linux/sched.h 中定义,在 Linux 中,特别长,400多行任务(Task) 和进程(Process)是两个相同的术语,task_struct 其实就是通常所说的“进程控制块”即 PCB。task_struct 容纳了一个进程的所有信息,是系统对进程进行控制的唯一手段,也是最 有效的手段。

2024-12-14 11:15:51 757

原创 Linux内核结构及源码概述

如果你是从源代码手动编译安装的软件,可执行文件通常都安装在/usr/local/bin目录下,除非配置时指定了其他位置。同样,源码也可以解压到自定义的路径下。要查看当前运行的Linux内核版本,可以使用uname -r命令。然后,根据内核版本去查找对应的源码路径。如果系统中没有预装源码,可以使用包管理器来下载和安装对应的内核源码包。此外,如果你想获取最新的内核源码或者特定版本的源码,还可以使用源码管理工具如git来克隆Linux内核源码仓库。

2024-12-13 21:38:21 1446

原创 嵌入式GDB调试搭建与使用

文件夹下,比如笔者的就是/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin。gcc-linaro-4.9.4- 2017.01-x86_64_arm-linux-gnueabihf/bin,如图。目标机交叉编译器前缀,也就是你所使用的交叉编译器前缀,比如在本教程中就设置为 arm-linux-gnueabihf。”命令,程序就会持续不断的运行,开发板中就会不断的打印出信息,如图 B3.3.2.7。

2024-12-07 15:06:41 1268

原创 Linux-ADC驱动实验

节点更为详细的信息请参考对应的绑定文档: Documentation/devicetree/bindings/iio/adc/vf610-adc.txt。接下来我们简单分析一下绑定文档,后 面我们需要根据绑定文档修改设备树,使能 ADC。驱动核心文件,这个文件就是 drivers/iio/adc/vf610_adc.c。编译修改后的设备树,然后使用新的设备树启动系统。就是在上一章的应用程序上修改而来的,由于只读取一路。已经编写好了,我们只需要修改设备树即可。设备目录,查看一下都对应的是什么设备。

2024-12-07 14:46:10 1203

原创 Linux-IIO驱动实验

比如手机或者手环里面的加速度计、光传感器、陀螺仪、气压计、磁力计等,这些传感器本质上都是ADC,大家注意查看这些传感器的手册,会发现他们内部都会有个。为可选的扫描位掩码,使用触发缓冲区的时候可以通过设置掩码来确定使能哪些通道,使能以后的通道会将捕获到的数据发送到 IIO。右移位数,也就是存储位数和有效位数不一致的时候,需要右移的位数,这个参数不总是需要,一切以实际芯片的数据手册位数。比如 ICM20608。是一样的,那么在配置这三个通道的时候就可以在 info_mask_shared_by_type。

2024-12-07 14:29:25 1189

原创 Linux-Regmap实验

当寄存器值不能被读出来的时候此回调函数会被调用,比如很多中断状态寄存器读清零,读这些寄存器就可以清除中断标志位,但是并没有读出这些寄存器内部的值。结构体,我们一般都是在自定义的设备结构体里面添加这两个类型的成员变量,所以我们首先在 icm20608_dev。来处理了,驱动编写人员不用管,极大的方便了我们的驱动编写。函数,首先是 regmap_update_bits 函数,看名字就知道,此函数用来修改寄存器指定的。:可选的回调函数,当寄存器值不能缓存的时候此回调函数就会被调用,并返回 true。

2024-12-07 13:52:37 961

原创 Linux 音频驱动实验

在信号处理领域,外界的声音是模拟信号,处理器能理解的是数字信号,因此这里就涉及到一个模拟信号转换为数字信号的过程,而完成这个功能的就是 ADC。不管音频数据是多少位的,数据的最高位都是最先传输的。现在我们知道了,处理器如果既想“听到”外界的声音,又想向外界传达自己的“心声”,那么就需要同时用到 DAC。处理器要想“听到”外界的声音必须要把外界的声音转化为自己能够理解的“语言”,处理器能理解的就是 0。同理,如果处理器要向外界传达自己的“心声”,也就是放音,那么就涉及到将处理器能理解的 0。

2024-12-07 12:41:29 1322

原创 Linux 多点电容触摸屏实验

中断线程化以后中断将作为内核线程运行,而且也可以被赋予不同的优先级,任务的优先级可能比中断线程的优先级高,这样做的目的就是保证高优先级的任务能被优先处理。不断的产生中断、读取触摸信息、上报信息会导致处理器在触摸中断上花费大量的时间,但是触摸相对来说不是那么重要的事件,因此可以将触摸中断线程化。设备,内核驱动需要一次性将触摸屏上所有的触摸点信息全部上报,每个触摸点的信息在本次上报事件流中的顺序不重要,因为事件的过滤和手指(触摸点。要注意,并不是所有的中断都可以被线程化,重要的中断就不能这么操作。

2024-12-07 12:12:54 791

原创 Linux-串口驱动实验

官方已经编写好了,我们真正要做的就是在设备树中添加所要使用的串口节点信息。当系统启动以后串口驱动和设备匹配成功,相应的串口就会被驱动起来,生成/dev/ttymxcX(X=0…也提供了串口驱动框架,我们只需要按照相应的串口框架编写驱动程序即可。串口驱动没有什么主机端和设备端之分,就只有一个串口驱动,而且这个驱动也已经由 NXP。驱动以后我们再来学习一下,如何驱动正点原子I.MX6U-ALPHA 开发板上的。虽然串口驱动不需要我们去写,但是串口驱动框架我们还是需要了解的,开发板就是这么做的。

2024-12-07 11:39:59 1250

原创 Linux-音频应用编程

系统下一套标准的、先进的音频驱动框架,那么这套框架的设计本身是比较复杂的,采用分离、分层思想设计而成,具体的细节便不给大家介绍了!提供的接口确实非常多、模块很多,以上所列举出来的这些模块,很多模块笔者也不是很清楚它们的具体功能、作用,但是本章我们仅涉及到三个模块下的 API。提供的库函数也别多,笔者肯定不会全部给大家介绍,只介绍基础的使用方法,关于更加深入、更加详细的使用方法需要大家自己去研究、学习。),有些模块下可能该包含了子模块,譬如上图中,模块名称前面有三角箭头的表示该模块包含有子模块。

2024-12-07 11:06:13 1360

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除