- 博客(115)
- 收藏
- 关注
原创 LINUX内核常用加锁
此时read_seqbegin将无法再次进入到锁的临界区内,其会在while循环中做不断重试,直至seqcount变为偶数(Thread_2触发了write_sequnlock,将seqcount再次加1),以此来确保目标Resource在更新期间,不会有新的线程对其进行读取,老的线程虽然可能读取到stale数据,但是会在执行read_seqretry时发起重试。假如T2时刻CPU_1对node_2执行了删除动作,此时并不能马上对node_2的内存资源进行清理,因为后续CPU_0还会对其进行访问。
2024-12-22 15:58:48
609
原创 测试人员必备的 Linux 命令清单
apt-get —— Debian/Ubuntu 系统的软件包管理器。yum —— CentOS/RHEL 系统的软件包管理器。dnf —— Fedora 系统的软件包管理器。ifconfig —— 显示和配置网络接口。dpkg —— 管理 Debian 包。npm —— Node.js 包管理器。free —— 显示系统内存使用情况。date —— 显示或设置日期和时间。pip —— Python 包管理器。whoami —— 显示当前用户名。tail —— 显示文件末尾的内容。
2024-12-01 14:30:11
535
原创 Linux开发讲课54---Linux系统定位故障最重要的五种技术
本文将介绍五种在Linux系统中定位故障最重要的技术,帮助大家快速、高效、准确地定位和处理故障。本文介绍了Linux系统定位故障的五种技术:系统日志分析、命令行工具、分析系统核心转储文件、网络抓包分析和性能分析。通过分析核心转储文件,可以了解系统崩溃时的运行状态,从而定位故障原因。(3)/var/log/auth.log:记录系统认证相关信息,如登录、权限更改等。(1)/var/log/messages:记录系统启动和运行过程中的各种信息。(4)/var/log/kern.log:记录内核相关信息。
2024-12-01 14:04:07
400
原创 Linux开发讲课53---嵌入式中优先级反转及其解决方案
本章节简单对优先级反转相关问题进行一个简单分析,在实际的实时操作系统特别注意,任务优先级也需要一定的合理制定,对于这种可能存在优先级反转的情况,可以通过优先级继承协议和优先级天花板协议,可以有效地解决这一问题。
2024-12-01 14:02:25
829
原创 Linux开发讲课52---线程上下文与线程调度
线程上下文(Thread Context)在多线程编程中,指的是一个线程的当前状态和执行环境。这包括线程的寄存器值、栈信息、程序计数器等关键数据。具体来说,线程上下文涵盖了CPU在执行特定线程时所需的所有信息,以便在需要时能够恢复到该线程的执行状态。•寄存器值:CPU内部的寄存器用于存储运算的中间结果、指令指针等信息,这些值在线程切换时需要被保存和恢复。•栈信息:每个线程都有自己的调用栈,用于存储局部变量、函数参数、返回地址等信息。线程上下文切换时,这些栈信息也需要被妥善管理。•程序计数器。
2024-12-01 13:17:24
758
原创 CAN编程示例之socket CAN编程步骤
这段代码是一个简单的使用SocketCAN发送CAN数据的程序,该程序将在一个无限循环中以1秒的间隔发送包含6个字节数据的CAN帧。设置addr结构体的成员,其中can_family指定为AF_CAN表示使用CAN协议族,can_ifindex设置为ifr.ifr_ifindex以指定绑定到can0设备。然后,我们将创建一个简单的程序,作为CAN通信的发送方,通过Socket进行通信,模拟CAN消息的发送、。设置CAN帧的标识符(frame.can_id),在此例中设置为0x100。
2024-11-24 15:36:44
515
原创 Linux开发讲课51---select、poll、epoll总结
它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能 有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把 current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内 部定义的等待队列),这 也能节省不少的开销。
2024-11-19 21:20:16
820
1
原创 Linux开发讲课50--- epoll、poll、select的原理和区别
epoll是一种I/O事件通知机制,是linux 内核实现IO多路复用的一个实现。IO多路复用是指,在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。epoll有两种工作方式, LT-水平触发 和ET-边缘触发(默认工作方式),主要区别是: LT,内核通知你fd是否就绪,如果没有处理,则会持续通知。而ET,内核只通知一次。什么是I/O?输入输出(input/output)的对象可以是文件(file), 网络(socket),进程之间的管道(pipe)。
2024-11-19 20:25:14
631
原创 CAN编程示例之socket CAN
CAN控制器的设备驱动将自己作为一个网络设备注册进Linux的网络层,CAN控制器收到的CAN帧可以传输给高层的网络协议和CAN协议族,反之,发送的帧也会通过高层给CAN控制器。Linux下最早使用CAN的方法是基于字符设备来实现的,与之不同的是Socket CAN使用伯克利的socket接口和linux网络协议栈,这种方法使得can设备驱动可以通过网络接口来调用。Socket CAN的接口被设计的尽量接近TCP/IP的协议,让那些熟悉网络编程的程序员能够比较容易的学习和使用。
2024-11-17 20:31:52
809
原创 Linux开发讲课49--- Linux 启动过程分析
理解运转良好的系统对于处理不可避免的故障是最好的准备。启动过程非常简单。内核在单核上以单线程和同步状态启动,似乎可以理解。但内核本身是如何启动的呢?initrd(initial ramdisk)和引导程序(bootloader)具有哪些功能?还有,为什么以太网端口上的 LED 灯是常亮的呢?启动的开始:OFF 状态局域网唤醒OFF 状态表示系统没有上电,没错吧?表面简单,其实不然。例如,如果系统启用了局域网唤醒机制(WOL),以太网指示灯将亮起。通过以下命令来检查是否是这种情况
2024-11-10 20:34:14
1092
原创 Linux开发讲课48--- Linux 文件系统概览
本文旨在高屋建瓴地来讨论 Linux 文件系统概念,而不是对某种特定的文件系统,比如 EXT4 是如何工作的进行具体的描述。另外,本文也不是一个文件系统命令的教程。每台通用计算机都需要将各种数据存储在硬盘驱动器(HDD)或其他类似设备上,比如 USB 存储器。这样做有两个原因。首先,当计算机关闭以后,内存(RAM)会失去存于它里面的内容。
2024-11-10 11:02:04
1039
原创 Linux开发讲课47--- 详解 Linux 中的虚拟文件系统
虚拟文件系统是一种神奇的抽象,它使得 “一切皆文件” 哲学在 Linux 中成为了可能。什么是文件系统?根据早期的 Linux 贡献者和作家所说,“文件系统是一个遵循特定结构的数据的分层存储。” 不过,这种描述也同样适用于 VFAT(虚拟文件分配表Virtual File Allocation Table)、Git 和(一种那么如何区别文件系统呢?Linux 内核要求文件系统必须是实体,它还必须在持久对象上实现read()和write()方法,并且这些实体需要有与之关联的名字。从。
2024-11-02 16:34:48
816
原创 当 CPU 空闲时它都在做什么?
事实证明,这种情况是非常普遍的,对于绝大多数的个人电脑来说,这确实是一种常态:大量的睡眠进程,它们都在等待某种情况下被唤醒,差不多在 100% 的 CPU 时间中,都处于虚构的“空闲任务”中。如果你再次点击一个 web 页面就会产生这种变化,例如:你的鼠标发出一个中断,它的驱动会处理它,并且因为它产生了一个新的输入,突然进程就可运行了。内核的这种空闲行为是操作系统难题的一个重要部分,并且它与我们看到的其它情况非常相似,因此,这将帮助我们理解一个运行中的内核。的状态,甚至它们在通电的时候也是如此。
2024-10-21 19:48:54
783
原创 10 大可以摧毁你的 Linux 的命令
什么是最危险的 Linux 命令?有人无数次问我这个问题,我一直避免回答,因为。你拥有的工具使你能够控制和修改你的操作系统的每一个方面。我不是想吓唬你,但如果你不熟悉这些命令和工具,你可以很容易地把你的系统摧毁。想象一下家庭中的小孩子的情景。孩子有许多方法可以伤害自己。但这是否意味着不应允许孩子离开婴儿床?那会对她的成长造成损害。这就是父母设定界限和引导孩子的地方。不要靠近火堆,不要把手指戳到电源插座上……随着孩子的成长和经验的积累,她可以把炉子打开,在壁炉里生火,插上电源线。
2024-10-20 21:39:22
757
原创 RK3568开发板Uboot参数-内核启动参数cmdline
cmdline 格式是由很多个项目用空格隔开依次排列,每个项目中都是项目名= 项目值。整个 cmdline 会被内核启动时解析,解析成一个一个的项目名=项目值。U-Boot 阶段的 cmdline 被保存在 bootargs 环境变量中。终是通过修改的 kernel DTB 里的 /chosen/bootargs 实现 cmdline 传递。cmdline 是 uboot 引导内核启动时传递给内核的,作用是指导内核启动,内。核启动阶段会去解析 cmdline,并根据 cmdline 去指导内核启动。
2024-10-18 23:32:03
936
原创 杂谈--Linux是什么用途?
3、个人电脑操作系统:Linux也可以作为个人电脑的操作系统,提供了一个免费、稳定和安全的替代品。许多Linux发行版(如Ubuntu、Fedora、Debian等)提供了友好的用户界面和丰富的应用程序。4、开发平台:Linux提供了丰富的开发工具和环境,支持多种编程语言和开发框架。5、学习和教育:Linux是一个开源的操作系统,提供了大量的学习资源和教育机会。总之,Linux是一个功能强大、灵活且广泛应用的操作系统,适用于各种不同的用途和场景。它提供了一个灵活的平台,可以根据设备的需求进行定制和优化。
2024-10-07 18:56:42
457
原创 杂谈--输入阻抗、输出阻抗、阻抗匹配到底是什么?
但是,如果哪一天我把沙包做了手脚,例如,里面换成了铁沙,你还是用以前的力打上去,你的手可能就会受不了了——这就是负载过重的情况,会产生很大的反弹力。在低频电路中,我们一般不考虑传输线的匹配问题,只考虑信号源跟负载之间的情况,因为低频信号的波长相对于传输线来说很长,传输线可以看成是“短线”,反射可以不考虑(可以这么理解:因为线短,即使反射回来,跟原信号还是一样的)。假设负载电阻为R,电源电动势为U,内阻为r,那么我们可以计算出流过电阻R的电流为:I=U/(R+r),可以看出,负载电阻R越小,则输出电流越大。
2024-10-07 18:46:12
1079
原创 Linux开发讲课46--- 设备驱动和设备管理
关于设备驱动和设备管理,分为四种内核成分:在所有unix系统中为了统一普通设备的操作所采用的分类:Linux内核中用于按需加载和卸载目标代码的机制:内核数据结构中支持面向对象的简单操作,还支持维护对象之间的父子关系:系统中设备树的一个文件系统。
2024-10-03 23:39:01
77
原创 Linux开发讲课45--- 链表
Linux内核代码中广泛使用了数据结构和算法,其中最常用的有链表、队列kfifo、红黑树、基数树和位图。Linux内核代码大量使用了链表这种数据结构。链表是在解决数组不能动态扩展这个缺陷而产生的一种数据结构。链表所包含的元素可以动态创建并插入和删除。链表的每个元素都是离散存放的,因此不需要占用连续的内存。链表通常由若干节点组成,每个节点的结构都是一样的,由有效数据区和指针区两部分组成。有效数据区用来存储有效数据信息,而指针区用来指向链表的前继节点或者后继节点。
2024-10-02 22:26:45
1007
原创 嵌入式 ADC与DAC的原理是什么?
之后的几个Rank,就是对选择的通道进行排序,在里面最后一个选项是转换时间的选择,一般来说,越长,测的越准。DMA是一个寄存器,DAC如果打开了DMA,根据定时器的信号,DMA会自动的将它储存的数组中的数据一个个的传给DAC,这样就实现了用DAC输出变化的模拟量的目的,比如正弦波。控制DAC输出的值,使用的函数是HAL_DAC_SetValue(DAC地址,DAC通道,DAC对齐方式,DAC的值),其中DAC对齐方式,是指你给的数字在DAC的寄存器中是左对齐还是右对齐,一般是右对齐,符合数据的计数方式。
2024-10-01 21:23:27
1211
原创 嵌入式 DAC基础知识
在分析权电阻网络与倒 T 形电阻网络时,会将模拟开关当理想器件看待,但实际中它们存在一定的导通电阻和压降,开关之间的一致性又有差别,所以会产生转换误差而影响精度。解决方法是采用权电流型 DAC,它有一组恒流源,每个恒流源电流大小依次为前一个的一半,与输入二进制对应位的权成正比。:最小输出电压(也就是输入数字量为 1 时的电压)与最大输出电压(也就是输入数字量为最大,每一位都是 1 时的电压)之比。一般通过输入数字量的位数来表示。当输入数字量的某位为 1 时,对应的开关将恒流源接至运算放大器的输入端;
2024-10-01 21:22:04
790
原创 嵌入式 ADC基础知识
在现实世界中,常见的信号大都是模拟量,像温度、声音、气压等,但在信号的处理与传输中,为了减少噪声的干扰,较多使用的是数字量。双积分型 ADC 是一种间接 ADC,它首先将输入的模拟电压信号转换成与之成正比的时间宽度信号,随后在此时间宽度内,对固定频率的时钟进行脉冲计数,计数的值就是正比于模拟输入电压的数字信号。不幸的是,对于任何给定数量的输出位,它是最密集的组件。但要注意的是,现实中的模拟量连续的,意味着它有无限的分辨率,但转换为数字量之后,将会丢失一定的精度,在时间和幅度上都会变成离散的值。
2024-10-01 21:16:35
1059
原创 部分linux系统磁盘管理和分析命令
按照目录大小排序战士最前面15个目录或者文件。递归删除当前目录下所有子目录中的.svn目录。每隔60s监控对应目录的文件大小变化。列出当前文件或者目录最大的10个。显示时,显示的是扇区数不是柱面数。查看当前所有磁盘的大小和使用量。显示系统所有的分区或给定的分区。列出当前所有子目录的文件大小。列出path这个目录的文件树。列出当前inode的使用情况。查看365天前的文件并删除。列出当前磁盘的使用情况。查看物理磁盘的使用情况。查看某个文件的所有链接。查看大于100M的文件。查看所有分区使用情况。
2024-09-30 20:36:18
320
原创 Linux的fsck和xfs_repair
如果发生不干净的卸载,xfs_repair 只会在挂载时重放日志,确保文件系统一致。要在启动时永久启用磁盘检查,您必须在 GRUB 配置文件中添加“fsck.mode=force fsck.repair=yes”。要使 xfs_repair 命令能够在 Linux 启动时运行,请在 GRUB 菜单内核命令的末尾添加“fsck.mode=force fsck.repair=yes”。现在,执行不带 -n 选项的 xfs_repair 命令,它将执行 Linux 磁盘分区的扫描和修复。
2024-09-30 20:30:39
1255
原创 Linux磁盘操作
fidsk是一个用来创建和维护磁盘设备分区的一个实用工具。格式化文件系统类型为 Linux EXT类型。显示Linux上文件系统磁盘使用的占用情况。dd命令用于数据的读取转换等操作。挂载系统外的磁盘分区或者目录等。格式化分区为 fat32类型。用于显示目录或文件大小。图形化分区操作工具。
2024-09-30 19:58:16
209
原创 linux的中断管理机制
接下来将以广义的角度讲解中断,但是我们要知道一点,真实的异常与中断的处理程序是不一样的,中断使用中断处理程序(Interrupt Service Routine, ISR),ISR通常由设备驱动程序定义,每种中断类型(例如键盘中断、网络中断)有专门的ISR。为了便于理解,我们可以把上半部理解成硬件中断,也就是由硬件中断信号来触发的,它必须尽快的完成,且不能被其他中断信号中断,而下半部是软件中断,它是由软件来手动触发的,它负责完成处理时间长的任务,它可以被其他中断信号中断。异常通常与中断一起讨论。
2024-09-28 16:43:54
850
转载 Dynamic DMA mapping Guide
Author:David S. Miller <davem@redhat.com>Author:Richard Henderson <rth@cygnus.com>Author:Jakub Jelinek <jakub@redhat.com>This is a guide to device driver writers on how to use the DMA API with example pseudo-code. For a concise description of the API, see
2024-09-21 23:57:05
281
原创 DMA Controller
最近在做DMA传输,发现了很多问题,所以特意写了一篇相关内容的帖子。本文基于全志平台。全志R128 SDK HAL 模块,本文介绍RTOS 中DMA 驱动的接口及使用方法,为DMA 的使用者提供参考。DMA 主要实现设备与设备、设备与 memory、memory 与 memory 之间的数据搬运与传输;BSP DMA 驱动主要实现设备驱动的底层细节,并为上层提供一套标准的 API 接口以供使用。
2024-09-21 17:24:41
1003
原创 shell脚本编写之流程控制
举例,shell中的break和continue与C语言中的使用方式一样,break可以退出循环,continue结束本次循环,但是不会退出。shell中的while循环语句语法如下,condition为判断式,command为程序段落。shell语句的流程控制与C语言不一样,流程控制中不能为空。on表示条件判断式,command为程序段落。shell中if语法如下,其中confi。第1次循环时,$var的内容为ele0。第2次循环时,$var的内容为ele1。第N次循环时,$var的内容为eleN。
2024-09-16 16:42:04
539
原创 shell脚本编写之四则运算
expr是一款表达式计算工具,使用它能完成表达式的求值操作。(一)表达式和运算符之间要有空格,例如:2+3进行运算,必须写成expr 2 + 3;例如计算2+3,使用$[2+3],这种方式与$(())一样,这里不再举例演示。shell程序默认支持整数加、减、乘、除、求余的运算。(三)乘号(*)前边必须加反斜杠()进行转义。(二)完整的表达式要被反引号 ` ` 包含;例如计算2+3,使用$((2+3))。
2024-09-16 15:40:09
316
原创 Linux开发讲课44---linux性能查看命令和工具
利用 top、vmstat、pidstat、strace 以及 perf 等几个最常见的工具,获取 CPU 性能指标后,再结合进程与 CPU 的工作原理,就可以迅速定位出 CPU 性能瓶颈的来源。#-d 显示磁盘使用情况,-x 显示详细信息 1秒刷新一次,显示5次。#实时监控系统的 IO 情况,包括读写速率和进程 IO 占用情况。#-d 5 秒刷新一次,-u 指定用户 。#M为单位显示所有信息。#显示指定磁盘信息。
2024-09-15 21:39:39
1103
原创 Linux开发讲课43---/proc/net/dev文件内容详解
在Linux系统中,/proc/net/dev是一个重要的虚拟文件,它提供了网络接口的统计信息。/proc/net/dev文件位于Linux系统的/proc目录下,这个目录是一个虚拟文件系统,用于提供内核和进程状态的信息。/proc/net/dev文件为Linux系统提供了丰富的网络接口统计信息,对于网络故障排除和性能优化具有重要意义。/proc/net/dev文件中的每一行代表一个网络接口,统计信息包括接收(Receive)和发送(Transmit)两个部分。
2024-09-15 19:57:12
1029
原创 c语言写的环形队列
printf("当前队列元素个数:%d\n", queueCount(&queue));// 输出:当前队列元素个数:2。printf("队列长度:%d\n", queueLength());// 输出:队列中的元素为:1 2 3。// 输出:队列中的元素为:2 3。printf("队列中的元素为:");
2024-09-15 19:28:06
911
原创 Linux磁盘操作基础命令
ubuntu@book:~]$ dd if=/dev/zero of=dd.img count=1024 bs=1M //生产一个1G大小的dd.img镜像 [ubuntu@book:~]$ mkfs.ext4 dd.img //格式化为 ext4文件系统类型。[ubuntu@book:~]$ sudo umount /mnt //操作完成后卸载该挂载的镜像。[ubuntu@book:~]$ fdisk /dev/sdc //操作设备节点为 /dev/sdc的一个设备。dd命令用于数据的读取转换等操作。
2024-09-07 13:26:31
563
原创 c语言--文件操作
如果文件不存在,则创建新文件。ftell函数是C语言中的一个标准库函数,它的主要功能是返回当前文件指针的位置,即文件位置指针当前位置相对于文件首的偏移字节数。功能:打开一个已经存在的文件,并返回这个文件的文件指针(文件的标识)或者创建一个文件,并打开此文件,然后返回文件的标识。rewind是C语言标准库中的一个函数,用于将文件内部的位置指针重新指向一个流(数据流/文件)的开头。fopen是C语言标准库中的一个函数,用于打开文件,并返回一个指向该文件的指针,这个指针被称为文件指针。
2024-08-31 23:01:42
1550
原创 举例说明 嵌入式c 语言的volatile
因为优化后,程序为了提高运行效率,可能从缓存或者寄存器中读取数据,读到的还是没有修改的数据。有了 volatile,就会从内存中直接读取,一旦数据被其他线程修改,就能立马察觉。如何解决这个问题,在循环变量的前面加上 volatile,防止编译的时候被优化。这段循环的代码,除了浪费时间,没有什么实际的意义,所以编译器会把它优化掉。运行程序,1 秒后打印 end,跟我们假设的一样。再次编译,同样开启优化,这一次,直接变成了死循环,程序不会结束。这个代码的现象,应该是先输出 1,等一会,再输出 2。
2024-08-31 22:11:43
443
原创 C语言中的int argc, char *argv[]是什么?
在C语言程序中,mainargc和argv。argc代表命令行总的参数个数,是一个整数;argv是一个字符指针数组,每个元素都是一个指向参数的指针。// 程序代码•argc(Argument Count)表示命令行中参数的数量。•argv(Argument Vector)是一个指向字符串数组的指针,其中每个字符串都是一个参数。是C语言中用于处理命令行参数的重要机制。通过这两个参数,程序可以接收和处理来自命令行的输入,增加了程序的灵活性和通用性。然而,在使用argc和argv。
2024-08-25 20:02:07
1688
原创 Linux开发讲课41---proc文件的写操作机制
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件【准确的讲,proc文件是存储在内存中的一种文件,本质的讲,实际上就是内核代码中的变量;用户所看到的只不过以文件的形式展示出来,并且可以操作这些文件的读写】,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
2024-08-25 19:55:13
1075
原创 Linux开发讲课42---printk的原理及使用
你会看到loglevel=x,修改的是控制台串口日志打印等级,但是实际在开发板系统上的bootargs添加loglevel参数,cat /proc/sys/kernel/printk节点参数是不行的,不知道为啥有知道的大佬可以留言。内核驱动调试的方法,先从我最常用的printk的使用方法开始讲起, printk在内核源码中用来记录日志信息的函数,方便我们调试追踪代码,只能在内核源码范围内使用。本篇内核采用5.10版本。读者要注意printk()输出格式,如下表所示,否则在编译时会出现很多的警告。
2024-08-25 13:56:50
774
原创 RT-Thread基于优先级的全抢占式调度算法的实现
考虑位图变量的取值范围,当位图所有BIT0全为0时,位图变量的值就是0,当位图所有BIT位都是1时(表示所有线程优先级上都存在就绪的线程,此时最高优先级为0级),则位图变量的值是255。也就是BIT5,对应的优先级为5。上面策略可以工作,但是它的问题是运行时间并不固定,如果当前系统中具有最高优先级的线程对应的优先级的数字为0级,循环一次就可以找出,如果很不幸,从0级到254级上都没有就绪的线程,仅在255级上有就绪的线程,这个调度函数不得不在检查了数组这256个元素之后,才能找出可以运行的线程。
2024-08-18 20:54:42
1155
1
VMware-workstation-full-17.0.0-20800274,文章有安装教程
2024-06-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人