- 博客(468)
- 资源 (12)
- 收藏
- 关注
原创 使用ctags+nvim自动更新标签文件
ctags是一个强大的语言分析工具,可以分析多种语言并生成语法结构文件,通过这些文件可以快速进行函数跳转,但是这有一个缺点,就是每次在项目里更新了代码之类的比如新增了一个函数,都需要重新使用。nvim配置文件在:~/.config/nvim/init.lua。来重新更新标签文件。
2025-04-02 16:18:41
303
原创 在Git仓库的Readme上增加目录页
符号创建了无序列表,需要值得注意的是锚点的格式一般是小写字符没有空格,空格以。时想要增加像文章那样的目录,方便快速跳转,但是。的方式来实现,如下图是我之前一个项目里写的。替代,并且需要解析软件支持锚点解析,例如。语法并没有提供这样的方法,但是可以通过。通过超链接将地址指向锚点就可以实现。解析器就支持锚点解析。这里我为了美观使用了。
2025-03-28 13:49:46
334
原创 Tmux复制时将内容传递到系统剪贴板
在多数情况下我们都会在Windows上通过ssh连接到linux上面进行开发工作,Tmux是一个不错的终端复用工具,通常我们会遇到一个问题,在Linux上复制的内容如何传递到Windows上面?上面指令是使用vi的copy模式,同时在最后一行将y复制的内容,传递给xclip,由xclip传递给系统剪贴板。保存文件之后执行tmux source ~/.tmux.conf就生效了。
2025-01-15 14:33:55
357
原创 buildroot增加package时mk和宏定义注意事项
时宏定义和mk文件都需要与文件夹名一致,否则你使用。时会提示找不到规则,例如,我新建了一个文件夹名为。里的宏定义只是用来做开关的,的匹配机制是按文件名来的。
2024-11-15 14:00:17
366
原创 C语言多维数组抽象理解:切格子思维
可以看到四维是在每个小格子里又切了一刀,那么五维、六维、七维其实都是如此,不停的在切切切,以上这些这是抽象上的理解,其实内存角度来说就是线性的,通过索引来进行递增得到对饮的数值,如果一开始就从内存角度来说会让人感觉到云里雾里,所以我先以上面这样抽象的方式给大家讲解一下,便于让大家脑海中有一个大体的框架,能够理解多维是怎样的一个计算思路,抽象的理解就是不停的切切切,跟套娃一样,在小格子里不停的切切切。其实在内存角度来说,假设array在内存的首地址是0x40000。,这也是C语言的特性。
2024-11-09 11:46:22
825
原创 FPGA实战篇:Moore/Mealy状态机
状态机是根据当前输入信号和自身当前所处状态来改变输出逻辑的一种逻辑系统,目前它也被抽象应用于软件设计当中,本文从硬件设计角度来解释状态机,使用Verilog语言来抽象描述并实现状态机。
2024-11-07 18:02:35
1661
原创 FPGA时序分析里tsu、th、tco、tpd、tcd是什么?
TSUTHTCOTPDTCDTSU全称Setup Time:建立时间,时钟信号在有效沿到来之前输入信号需要保持的稳定时间TH全称Hold Time:保持时间,在到达时钟有效沿之后输入信号需要保持的时间TCO全称Clock to Output Time:时钟输出时间,指的是当时钟处于有效沿时输入信号的输出时间TPD全称Propagation Delay Time:传播延迟时间,输入信号到输出信号最大延迟TCD全称Time Clock Delay:无效延迟时间,输入信号发生变化到输出信号发生变化时的延迟。
2024-10-31 23:10:37
2771
5
原创 时钟漂移与时钟抖动
时钟漂移发生在并行时钟上面,并行时钟是指一个时钟源输出的信号并联出多个信号源,当并行时钟频率较高时对走线要求极高,例如MIPI就是并行时钟为每个lena提供时钟信号,时钟漂移的现象就是并行时钟线上同时到达目的地的时间不一致,也就是出现了其中一条与其它几条时钟信号不匹配的问题,例如四个并联时钟线:A、B、C、D,当由于A走线不好,阻抗增加,那么电流传递时间就会增长,或者与其它线长度一致,在高频信号里采样的有效边沿保持时间非常短的,如果时钟不一致那么就会出现采样数据不对,导致接收到的数据就不对。
2024-10-09 13:46:02
610
原创 C++ 隐式内联函数
提示没有找到该函数的定义,原因是这样的,当你在类内部声明一个函数时除了构造函数、析构函数、模板函数、操作符重载函数以外的普通成员函数都会被隐式转换为内联函数,内联函数一般是不会分配内存空间的,不会产生符号定义,所以即便你声明了也会提示你找不到这个函数。
2024-09-26 12:59:01
302
原创 一篇文章说清楚module_init/module_exit驱动注册卸载全过程
和都是Linux驱动框架里用于设置驱动初始化函数和卸载时的函数,在Linux里驱动模式分为两种:第一种是以模块形式也就是.ko形式第二种是直接被编译进内核,成为内核的一部分两者之间的区别在于.ko的模块可以被动态加载和卸载就像动态库一样,而另外一个则是像静态库一样是内核的一部分。静态模式下的驱动初始化/卸载函数是由内核在启动时主动调用,而动态模式下则是通过装载工具(如)让内核被动去调用。
2024-09-24 15:37:15
1050
原创 DVP接口详解
DVP全称(数字视频端口)是一种用于图像传感器和处理器之间传输视频数据的接口标准DVP接口采用并行传输方式,设计上属于低速总线,DVP没有特定的传输协议,它不规定传输协议,它只是一个视频传输接口,一般DVP,正式名称是。Tips值得注意的是DVP可以不使用以上三种编码标准,但由于DVP设计上属于是低速总线,它只能传输分辨率较低的视频,这三种编码标准就比较适合传输标准数据。ITU全称International Telecommunication Union(国际电信联盟)
2024-09-03 14:42:15
4434
原创 Linux驱动开发MODULE_DEVICE_TABLE的作用
将符号导出那么它就全局可见,注意可见的是别名,c语言里extern不能用于定义,但是在GCC里面别名不算定义变量,所以可以使用extern将它放入符号表里,将会被。在module_init里也用了同样的方法,但它没有使用extern,除了static函数以外任何函数都会被放入符号表。宏是用于驱动模块方式开发时会用到的,它的工作原理就是定义驱动的设备。就相当于是传递来变量的别名,对它的访问都将指向传递进来的变量。的方式一致,只不过一个是模块的方式一个是内核匹配的方式。在这里的用处是将符号导出可见,在。
2024-09-02 14:39:30
1031
原创 Linux sentinel写法
元素就可以了,因为它判断的单一性,会让CPU很容易预测并将代码放入热路径(CPU缓存)里加快寻址与执行过程让循环代码变得更。,因为如果判断语句较为复杂会导致CPU分支预测失败率提高,当分支预测失败时CPU为了保证程序能够正常运行下去会重新。例如我们现在想遍历一个数组,那么终止条件就是判断当前是否为结束符,如果是结束符则遍历结束。了,无论什么条件只要遇到了哨兵那就意味着这个数组的遍历该。此外在遍历数组时不需要去关心它的大小了,也不需要去。可以看到数组声明初始化时的尾部会有一个空白的。
2024-08-29 19:05:01
552
原创 MMC、EMMC、SD卡、TF卡、SDIO之间的关系
MMC(MultiMediaCard)是一种多媒体存储卡标准,它规定了存储卡的设计规范以及卡之间的通信方式。eMMC(embedded MultiMediaCard)是嵌入式MMC存储卡的规格,主要用于固定在设备上的内置存储解决方案,可以理解为用于移动设备(如智能手机)上的内嵌存储器。SD卡(Secure Digital Card)是MMC标准的一种实现形式,而eMMC则是通过嵌入设备主板的方式来实现数据存储和读取的规范和技术。可以简单理解为MMC是一种移动载体的实现标准而EMMC则是固定载体。
2024-07-28 12:12:08
1715
原创 linux syscall和int 80的区别
syscall和int 80是中断指令,Linux通过对这两个指令的封装为开发者们提供的一种用户态切换至内核态的方法,因为在处理器中用户态是没有权限向更高的权限空间切换的,以x86为例,它只允许,不允许低权限向高权限切换。但是处理器保留了一个机制,就是当产生中断时(无论是任何中断)都会让处理器切换权限并跳转至中断处理函数里,而中断处理函数又由内核注册所以就完成了用户态到内核态的切换。本文以X86架构为例。
2024-07-24 13:41:45
1620
1
原创 RV1126过温保护以及驱动分析
它为SOC以及其它模块提供电源,它的重启方式是通过对每个连接在PMIC里的设备对复位引脚发送电平让其复位,它不集成在SOC内部,相较于CRU来说,CRU还支持频率控制,当温度达到一定要求时还可以。这个中断是报警中断和TSHUT不一样,一旦产生TSHUT信号就会触发保护重启,报警中断则是进入中断处理函数里,目的是为了让系统采取措施,例如降频或开启风扇等等,在rk的函数里它是通过调用。不会,这个是关键的类型,这个值一般是给驱动用的,当到达这个值的时候应该进入紧急关机的状态,它与。
2024-07-17 19:45:54
1402
1
原创 char、unsigned char、signed char之间的区别
但通常情况下我们也会使用unsigned char、signed char来明确表明我们的变量类型,在某些场景下例如我们的代码会跑在不同的平台上,为了确保结果与我们预期的一致而使用限定符来表明类型,这是一种保证预期结果的好方法。,我的个人理解是应该是为了可移植性,char的类型由编译器决定,这样可以统一在不同的平台上表现一致,但这仅限于你的数据是在额定范围之内。,语言相当于标准,而编译器是实现这些标准的实体,这样的类型一般是需要编译器来决定它是什么类型,此外像int与char也是一样,在。
2024-07-17 13:50:01
429
1
原创 C语言赋值浮点数时候立即数后面加上f的意义和注意事项
很明显结果是错误的,可以看到精度从第8位开始就错了,这是因为float的精度根据IEEE 754的标准,它只占7位有效位,为什么只占7位这里给大家补充一下这个知识,在IEE 754的标准里float占4字节,其中23位表示小数点,而23bit位(23^2)最大能表示的数为7位,所以它小数点后最大能表示7位。f在c语言里是为了区分单精度和双精度的浮点数数据,这一点大家在开发时应注意,不要因为书写习惯在一些双精度的浮点数里加上了f导致精度丢失了。
2024-07-15 10:55:59
1539
3
原创 C++ override关键字
Override是C++里的一个关键字,意思是覆盖,用途是让编译器在编译期间检查并放置子类对父类虚函数产生重载。
2024-07-11 10:43:48
323
1
原创 git:Failed to connect to xxx.xxx.x.xxx port 80
一般这个情况是你远程服务器的端口与本地git不一样,使用remote命令更新一下就可以了:
2024-07-02 11:37:41
285
1
原创 行业术语BLOCKING、DROPFRONT、DROPCURRENT
这三个术语一般用于SLOT,缓存时作为input模式使用,分别在缓冲区满时起作用。DROPCURRENT: 当缓冲区满时什么都不做,丢弃数据,不压入。DROPFRONT: 当缓冲区满时从头开始覆盖。BLOCKING: 当缓冲区满时阻塞等待。
2024-06-14 09:28:42
275
1
原创 ubuntu安装CUDA之后使用nvdia-smi仍然提示找不到cuda
这是因为BISO安全引导的问题,CUDA的驱动是没有经过签名的,如果你开启了安全引导那么在启动阶段Linux只会加载被签名的驱动,就会导致cuda没有被正确安装。解决方法也非常简单,只需要在开机时进入bios把安全引导关闭即可。
2024-05-31 16:19:16
719
1
原创 rv1126 ov5640调试文档
启动后驱动偶然性能够通过I2C/SCCB读取到OV5640的芯片ID,经过多次开机验证10次里只有大约1-2次能够读取到,当多次读取之后需要将设备关机大约5分钟左右才能够读取到芯片ID。
2024-04-30 15:13:32
999
2
原创 c++缓冲区同步原理与std::ios::sync_with_stdio作用
c++是基于c语言的扩展语言,本质上它继承了c语言许多特性,同时也继承了C语言特性,在c语言中stdio为输入输出缓冲区,stdin是输入缓冲区,stdout是输出缓冲区,C++不与C语言使用同一个缓冲区,这就出现了一个问题,当使用printfcouttest2test1可以看到test2早于test1输出了,这是因为c语言的机制,c语言缓冲区只有在遇到\n程序结束缓冲区满时才会刷新缓冲区。
2024-04-28 10:01:24
775
3
原创 掌握ROS:完整的认识ROS
元操作系统(Meta-Operating System)是一个高级概念,它不是传统意义上的操作系统,而是一个在现有操作系统之上运行的软件框架或系统,提供了额外的、更抽象的功能和服务。这种系统通常用于管理和协调底层操作系统的资源和应用程序,使得应用程序的开发和部署更加高效和灵活。ROS全称Robot Operating System(机器人元操作系统,ROS的目的旨在为开发者提供一个直观、通用的软件框架和工具集,旨在简化和加速机器人应用的开发和研究过程。
2024-01-02 15:36:40
2095
3
原创 串口硬控制流中CTS、RTS、DTR、DSR、DCD的作用与意义
硬件控制流信号在串口通信中没有固定的发送者或接收者,因为串口通信本身是一种双向协议。发送者和接收者的身份可以随时间动态切换,硬件控制流信号也可以在这个过程中互换发起者身份。这种灵活性使得通信双方能够根据需要动态地进行数据传输的控制。
2023-12-31 14:21:27
5801
原创 什么是AHB、APB、AXI总线?
AHB(Advanced High-performance Bus)是一种高性能的总线协议,由英国ARM公司设计,被广泛应用于许多嵌入式系统中。它是一种基于Mater-Slave的总线架构,广泛应用于SoC、MCF当中,并且支持多个内存和外设连接。AHB一般应用于高性能、高时钟频率的系统结构,例如CPU与高速RAM、NAND FLASH、DMA等。
2023-10-16 13:58:32
3263
原创 RISC-V 整型通用寄存器介绍
x0/zerox0寄存器又被称为zero寄存器,它的读写是无效的,它的值只能为0,这是为了让编译器进行优化上面这段汇编的作用是进行相加运算,将x2和x3寄存器的值相加的结果并放入x1寄存器,但是如果x3寄存器的值为0当RISC-V处理器执行这条指令的时不会去读取x0寄存器的值,会直接按0来运算,这样就可以省去与0做运算时读取的步骤。RISC-V处理器在设计时只要涉及到x0寄存器的读取一律按0来处理不会去读取x0的寄存器,这么做的目的是为了方便编译器优化某些运算。
2023-08-17 13:56:50
4027
原创 RISC-V体系结构
它规定了如何加载和执行RISC-V二进制代码,以及如何访问控制和系统资源。的操作,这样做的目的可以有效将不同特权完全分隔开,可以保证。,定义了一组特权指令和异常处理机制。,定义了一组用户态指令和系统调用指令。,那么两个语言编译出来的程序是。SBI限定了不同特权模式下对。二进制接口的,因为它们的。那么相互之间就可以调用。
2023-07-27 13:35:05
1114
原创 RISC-V特权级别
所以内核分两部分,运行在M模式下的代码为内核提供访问硬件资源的能力,而S模式下的代码则更加灵活。里的最高权限模式,它具有访问所有资源的权限,它的代码是百分百可信的,通常运行在这个模式下的为。下,通常内核里有一段代码是运行在M模式下和S模式下,M模式下的代码为S模式下的代码提供。而S模式下的内核主要是为应用程序提供。里不同的模式下指令集是不同的,不能互相调用,运行在这个模式下的程序为最高权限,它属于。下的,在这个模式下内核需要初始化所有的。,在最初系统启动阶段内核是运行在。,在这个模式下具有和。
2023-07-27 13:34:36
2589
原创 什么是RISC-V?以及RISC-V和ARM、X86的区别
RISC-V是基于RISC精简指令集架构开发的一个开放式指令集架构,它是由加州大学伯克利分校的计算机科学教授(克里斯蒂安·阿萨诺维奇)领导的团队开发,RISC-V是开放的,任何人都可以使用它来开发处理器芯片和其他硬件,而无需支付任何许可或使用费用。RISC-V的设计简单,易于扩展和自定义,可以在各种应用场景和市场中使用。指令集架构(,简称ISA)是计算机系统中的一个重要概念,指的是计算机中处理器的指令集和处理器的内部结构,即处理器是如何执行指令的。ISA规定了一套指令集,包括指令的种类、指令的格式。
2023-07-27 13:31:54
11692
1
原创 电容的基本工作原理
电容会阻碍直流信号通过的原因是因为电容负极一端在逐步充电,有源源不断的电子进入,当极板上充满电子时即代表电容的电量充满了,极板上没有多余的空间让电子进入同时也由于同性相斥的原因电容里的电子会排斥后续电子的进入,这样就导致电容的一端形成了电子无法流动的情况从而导致直流信号无法通过,而金属极板内的电子无法通过两个金属极板中间的电介质。位移极化只是将无极分子施加电场力让它内部电子不重叠,负电子仍然没有拜托共价键的束缚,这种力比较中性所以对导电率的影响并不高,这也是为什么极性电容可以做到相同体积下容量更大的原因。
2023-06-19 23:23:57
3995
原创 I3C仿真:PGY I3C-EX-PD使用
指示灯状态LED1电源LEDLED2保留LED3配置为MASTER时,LED亮起LED4当设备引导时,该LED将每1秒闪烁一次。连接完成后使用软件建立并启动捕获时LED将闪烁得更快,表明其已做好获取准备LED5完成LED,启动完成时亮起。LED6配置为SALVE时,LED亮起。
2023-05-15 13:23:09
1255
1
原创 什么是OpenVino?以及如何使用OpenVino运行yolo
Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包,主要用于对深度推理做优化。Openvino内部集成了OpencvTensorFlow模块,除此之外它还具有强大的Plugin开发框架,允许开发者在Openvino之上对推理过程做优化。Openvino前端→ Plugin中间层→ Backend后端Openvino的优点在于它屏蔽了后端接口,提供了统一操作的前端API,开发者可以无需关心后端的实现,例如后端可以是。
2023-04-23 12:34:00
18395
3
原创 Linux Dbus
Linux Dbus是由项目开发的一款IPC进程间通讯技术,它是基于在Unix 域套接字实现的,它在sockets上面进行了封装并提供了一套更加规范、方便、安全的通讯机制,同时定义了一套标准接口,目前已经被大量Linux发行版所采用,比如Ubuntu、Centos...Dbus最初的目的就是为桌面应用程序之间提供IPC通讯技术它不属于Linux内核的一部分,它目前没有被Linux内核所采纳。
2023-03-27 16:28:19
4098
1
原创 Zephyr驱动程序框架简介
Zephyr为驱动提供一套具体的驱动框架模型,开发者可根据这一套驱动框架模型来实现自己的驱动,这一套模型非常类似Linux内核的驱动实现,如果你对Linux内核驱动模型或有Linux内核驱动开发相关经验那么学习起来会非常轻松与简单。驱动模型框架是使用了结构化的方式描述驱动,每个驱动都有等级,等级在Zephyr内部已经规定好了,每个等级对应不同的阶段,Zephyr在启动过程中会根据等级来依次初始化这些驱动,同时在不同的阶段下某些内核服务的可用性也是不同的。一些通用类型的驱动 (常见驱动) Zephyr给出了具
2023-03-05 08:27:55
2473
原创 通过Buildroot自制根文件系统
根文件系统是Linux内核启动之后读取的一个文件系统,并从这个文件系统中加载第一个init应用程序并启动,就是Linux上俗称的root进程、根进程。
2023-02-23 14:12:20
1419
原创 在OpenstLinux根文件系统里增加自己的应用程序
这些文件夹都是按照Linux内核所需要的格式提供的,Linux内核启动时会需要文件系统下存在这些文件夹,用于Linux内核做初始化,这些目录结构非常眼熟和我们平时装好发行版时提供的文件夹结构是一样的。不同的系统内核所需要的文件夹也是不同的,这里我们重点关注bin这个文件夹,这里的bin就相当于我们/usr/bin目录,这个文件夹里存放了bin文件,我们可以将我们编译好的二进制文件放入到这个文件夹里去就可以了。可以看到存放了一些常用命令,例如rm、ls、cp等,一般这些工具都是基于busybox制作的。
2023-02-22 16:17:38
424
原创 烧录OpenStLinux到Stm32mp157上
这几个都是flashlayout文件存放目录,每个目录里flashlayout布局使用的固件都不同,这些是ST根据不同的信息生成的不同固件的配置方法,其中optee和trusted是我们常用的,flashlayout以tsv文件格式作为存储,可以看到trusted目录下的内容。我的flash是emmc的,所以我使用的是flash_emmc*的配置文件,这里打开配置文件看一下,如果你的是定制板那么可以向厂商索要这个文件。在刷写之前根据你的板子拨码开关拨码到指定位置,这里我使用的是usb下载模式。
2023-02-22 10:09:43
1364
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人