自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Kinect v2.0在Ubuntu18中的ROS相机内参标定(超详细)

1.深度图像也叫距离影像,是指将从图像采集器到场景中各点的距离(深度)值作为像素值的图像。获取方法有:激光雷达深度成像法、计算机立体视觉成像、坐标测量机法、莫尔条纹法、结构光法。2.点云:当一束激光照射到物体表面时,所反射的激光会携带方位、距离等信息。若将激光束按照某种轨迹进行扫描,便会边扫描边记录到反射的激光点信息,由于扫描极为精细,则能够得到大量的激光点,因而就可形成激光点云。点云格式有*.las;*.pcd;*.txt等。深度图像经过坐标转换可以计算为点云数据;

2023-05-12 19:59:20 2357 19

原创 Ubuntu18下Kinect2的驱动libfreenect2安装以及iai_kinect2安装(亲测可用)

设备:安装ubuntu18的电脑并配置好ros环境、XBOX kinect2相机相机与电脑连接方式,其中相机的USB接口必须连接电脑的usb3.0接口(注:usb3.0接口特点为颜色是蓝色或者接口处有ss的标志)

2023-05-10 16:25:36 1937 2

原创 Linux C++使用TCP通信实现同一局域网下电脑客户端与工控机服务端传输文件数据(亲测可用)

本次小项目是在上一篇博客的基础上从TCP本地通信延伸到TCP同一局域网通信 ,而这个项目的背景是工控机装在一个小车平台上,工控机运行代码控制小车的导航定位以及其他一些延伸功能,此时就需要调用一些参数。此时使用同一局域网下TCP通信就可以用电脑远程修改参数,从而更方便的对小车进行调参。

2023-05-07 18:40:05 766

原创 Linux C++使用TCP通信实现本地客户端与服务端传输文件数据(亲测可用)

这个项目是在本地完成客户端与服务端的数据传输,做这个小项目的目的是为了引出下一个项目在同一局域网条件下,电脑和工控机进行远程无线通信。此时电脑为客户端,工控机为服务端。

2023-05-07 17:26:54 2904

原创 SPI总线学习笔记

(高电平或者低电平,根据从机而定)表示选中该从设备,若发送给这个从机的使能信号为低电平,则发送给其他从机的使能信号为高电平。SPI总线有四种不同的工作模式,取决于极性(CPOL)和相位(CPHL)这两个因素。缺点,SPI多了一根线占用硬件资源,但是少发一个字节,发送速度快。下降沿发数据,上升沿接数据。上升沿发数据,下降沿接数据。上升沿发数据,下降沿接数据。

2024-05-19 12:54:12 960

原创 IIC总线学习笔记

总线上所有的从机接收到该字节数据后都将这7位地址与自己的地址进行比较,如果相同,则认为自己被主机寻址,然后再。IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线,主要用于。注:IIC通信过程只发送了四种信号:起始信号、发送的字节、应答信号、停止信号。IIC总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;,主机有权能发起和结束一次通信,而从机只能被主机呼叫;(3)被寻址的从机发送应答信号回应主机。,最低位表示后续字节的传送方向,,连接在IIC总线上的器件分为。

2024-05-18 14:54:16 1061

原创 通信协议UART和电气协议RS485\RS232原理及应用

在发送二进制数据01和0011时,都是先低电平再高电平,但是怎么区分发了几个0和几个1呢,这是就需要波特率起作用,假设波特率为1bps,则掐时间,经过1秒发送一个二进制,比如在低电平持续了两秒,则发送了两个0。依赖于串口,编程时还是用的UART,只是在电气层面做了一些处理,这样可以让他抗干扰能力更强,传输距离更远,提升传输速度。空闲位必须是高电平,起始位必须是低电平,数据位一般是5-8位,并且先发二进制的低位,再发二进制的高位。若发送10个字节,则先发送八个字节,然后发送停止位,之后再发送两个字节。

2024-05-17 20:37:24 1463

原创 ubuntu下给不同串口设置别名

目录一、绑定设备ID1.查看设备ID2.编写usev规则3.重新加载usev规则4.查看二、绑定USB端口号1.先插入一个串口,查看USB设备信息2.查看USB转串口信息3.编写usev规则4.重新加载usev规则5.查看 在Ubuntu环境下,有时候工控机或者arm开发板需要连接多个传感器,而这些传感器通过不同的串口来采集数据,由于Ubuntu上电会导致串口别名错乱,所以需要为串口设置别名。 设置别名就是 设置软链接,它可以链接到原始文件,类似于windows下的快捷方式。它

2024-03-31 22:15:26 1542

原创 ubuntu16配置C++读取yaml文件

【代码】ubuntu16配置C++读取yaml文件。

2024-03-26 09:19:58 472

原创 网络编程学习笔记一(网络基础+TCP编程+UDP编程)

1.每一层实现不同的功能,对上层的数据做透明传输2.每一层向上层提供服务,同时使用下层提供的服务。

2024-03-25 09:16:00 1090

原创 Git使用:实现文件在不同设备之间进行同步

打开Gitee,注册完进行登录,点击右上角【+】创建一个仓库新建仓库:点击创建,仓库创建完毕。

2024-03-24 18:09:00 1620

原创 结构体和malloc学习笔记

结构体是用户根据实际需要自己定义的符合数类型;

2024-03-08 20:42:48 543

原创 嵌入式面试常见问题(四)

TCP协议比UDP协议在数据传输前的操作更复杂;因为它需要三次握手建立连接之后,才能收发数据,而UDP协议则不需要握手连接这一步;1.在基于Linux的网络套接字编程中,如果需要创建一个IPv4的网络套接字,应该在socket函数中指定domain参数为。5.TCP/IP协议网络分层中的四层分别是应用层、传输层、网络层和数据链路层。domain:协议簇,表明IP地址的类型。TCP协议比UDP协议在通讯上更可靠;IPPROTO_TCP:TCP传输协议。IPPTOTO_UDP:UDP传输协议。

2024-03-04 19:30:37 589

原创 进程间通信学习笔记(信号)

有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。= -1:发送信号给,有权限发送的所有进程。sa_sigaction: 另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。信号递达(Delivery ):实际信号执行的处理过程(3种状态:忽略,执行默认动作,捕获)SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。功能:将进程的屏蔽字替换为由参数sigmask给出的信号集,然后挂起进程的执行。

2024-03-02 16:35:34 1104

原创 进程间通信学习笔记(共享内存)

由以下几个常值指定:MAP_SHARED(共享的)MAP_PRIVATE(私有的)MAP_FIXED(表示必须使用start参数作为开始地址,如果失败不进行修正),其中MAP_SHARED和MAP_PRIVATE必选其一,而MAP_FIXED则不推荐使用,MAP_ANONYMOUS(匿名映射,用于血缘关系进程间通信)(4)用于映射的文件大小必须>0,当映射文件为0时,指定非0大小创建映射区,访问映射地址会报总线错误,指定0大小创建映射区,报非法参数错误(Invalid argument)

2024-02-27 21:24:02 894

原创 进程间通信学习笔记(有名管道和无名管道)

在内核里面开辟一片内存,进程1和进程2都可以通过这片内存进行通信。),进程异常终止(也可以使用SIGPIPE信号,使进程不终止)(1)管道中有数据,read返回实际读到的字节数。(2)管道读端没有全部关闭((1)管道读端全部被关闭(open函数四种状态。

2024-02-26 22:01:52 1089

原创 条件变量、线程池以及线程的GDB调试学习笔记

我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设T1为创建线程时间,T2为线程任务执行 时间,T3为线程销毁时间,当T1+T3>T2,这时候就不划算了,使用线程池可以降低频繁创建和销毁线程所带来的开销,任务处理时间比较短的时候这个好处非常显著。执行20个任务,而线程池的容量是10,所以会有10个在等待着执行。通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合。:为了实现等待某个资源,让线程休眠,提高运行效率。:生产者消费者问题,是线程同步的一种手段。

2024-01-28 18:20:49 1225

原创 线程的同步和互斥学习笔记

临界资源概念:不能同时访问的资源,比如写文件,只能由一个线程写,同时写会写乱。比如外设打印机,打印的时候只能由一个程序使用。外设基本上都是不能共享的资源。生活中比如卫生间,同一时间只能由一个人使用。临界区互斥机制。

2024-01-23 21:18:44 1137

原创 线程的取消学习笔记

线程取消,必须要设置取消点,如果没有则手动设置。不是说取消就取消,线程的取消点主要是阻塞的系统调用。出错原因,retv接收不到字符串,所以不能打印。将printf那一行注释掉就可以。PTHREAD_CANCEL_DEFERRED //等到取消点才取消(默认是这个)PTHREAD_CANCEL_ASYNCHRONOUS //目标线程会立即取消。

2024-01-21 14:30:27 573

原创 线程的创建与回收

成功返回0,失败时返回错误码thread:线程对象attr:线程属性,NULL代表默认属性routine:线程执行的函数arg:传递给routine的参数,参数是void *,注意传递参数格式pthread_t pthread_self(void) 查看自己的TID//testThread强制返回void *最后一个参数。

2024-01-20 20:30:21 1217

原创 exec函数簇和守护进程

exec函数使得进程当前内容被指定的程序替换。

2024-01-14 10:06:12 550

原创 进程的创建与回收学习笔记

存放在磁盘上的指令和数据的有序集合(文件)静态的执行一个程序所分配的资源的总称进程是程序的一次执行过程动态的,包括创建、调度、执行和消亡在linux下,除了0号进程外的任何进程都是别人创建的,都是子进程。

2024-01-13 15:41:01 636

原创 bootloader学习笔记及SD卡启动盘制作

在操作系统运行之前运行的一小段代码,用于将软硬件环境初始化到一个合适的状态为操作系统的加载和运行做准备(其本身不是操作系统)

2024-01-13 12:13:07 566

原创 ELF文件格式以及交叉编译工具链常用工具

bin文件就是二进制文件,同一个c语言文件编译成elf格式和bin格式,而elf格式比较大,是因为bin格式里面只有elf的代码段和数据段。.bss段放置的是未初始化的全局变量和未初始化的静态局部变量;因为未初始化的变量会放在.bss段中统一置0.函数名表示函数的起始地址,编译后放在了.symtab段,即符号表。.data段放置的是初始化的全局变量和初始化的静态局部变量;Objcopy是将elf文件转换为裸机运行的bin文件。windows下的可执行文件是.exe文件..text段放语句,比如a++;

2024-01-11 21:34:48 490

原创 linux开发板加载内核、设备树、根文件系统的三种方式以及EMMC加载uboot方式

开发板通过SD卡进行启动,SD卡中加载的有uboot。

2024-01-10 14:55:08 2740 5

原创 FS4412系统移植及开发板启动过程

(2)uboot跑到内存RAM后,BL0就停了,开始执行RAM中的uboot(uboot初始化栈、网卡、串口等基本软硬件),uboot负责将emmc中的linux和dtb复制到内存RAM中(前提是已经把linux和dtb安装到emmc中),因为emmc是外存无法运行程序(linux+dtb=完整的linux系统)。(3)RAM中的linux开始运行,也是先初始化软硬件,linux运行起来之后就会挂载根文件系统rootf(就是把根文件系统读过来用,真正做实验是通过网络进行外部挂载)

2024-01-04 22:20:15 829

原创 Linux驱动开发学习笔记7《并发与竞争》

此时你到了电话亭门口,因为里面有人,所以你不能进去打电话,相当于没有获取自旋锁,这个时候你肯定是站在原地等待,你可能因为无聊的等待而转圈圈消遣时光,反正就是哪里也不能去,要一直等到里面的人打完电话出来。终于,里面的人打完电话出来了,相当于释放了自旋锁,这个时候你就可以使用电话亭打电话了,相当于获取到了自旋锁。,如果要想进房间,那就要先获取一把钥匙,信号量值减1,直到10 把钥匙都被拿走,信号量值为0,这个时候就不允许任何人进入房间了,因为没钥匙了。,只要此线程不释放持有的锁,那么其他的线程就不能获取此锁。

2024-01-01 19:38:15 1193

原创 Linux驱动开发学习笔记6《蜂鸣器实验》

有源蜂鸣器只要通电就会叫,所以我们可以做一个供电电路,这个供电电路可以由一个IO来控制其通断,一般使用三极管来搭建这个电路。为什么我们不能像控制LED 灯一样,直接将GPIO 接到蜂鸣器的负极,通过IO 输出高低来控制蜂鸣器的通断。此先检查PIN 为SNVS_TAMPER1这个PIN 有没有被其他的pinctrl 节点使用,如果有使用的话就要屏蔽掉,然后再检查GPIO5_IO01 这个GPIO 有没有被其他外设使用,如果有的话也要屏蔽掉。,直接用直流电是驱动不起来的,需要2K-5K 的方波去驱动。

2023-12-29 19:31:49 1441

原创 ubuntu18设置开机自启动

项目需求:机器人开机上电后工控机首先运行机械臂控制代码,再运行算法代码。

2023-12-25 20:26:56 1022

原创 Linux驱动开发学习笔记5《pinctrl和gpio子系统实验》

比如A 这个引脚在官方开发板接的是I2C 的SDA,而我们所使用的硬件可能将A这个引脚接到了其他的外设,比如LED 灯上,接不同的外设,A这个引脚的配置就不同。此函数获取GPIO 编号,因为Linux 内核中关于GPIO 的API 函数都要使用GPIO 编号,此函数会将设备树中类似的属性信息转换为对应的GPIO 编号,此函数在驱动中使用很频繁!上述代码的“gpios”节点一共定义了4 个GPIO,但是有2 个是空的,没有实际的含义。

2023-12-17 19:49:07 550

原创 Linux驱动开发学习笔记4《设备树下的LED驱动实验》

从上图可以看出,LED0 接到了GPIO_3 上,GPIO_3 就是GPIO1_IO03,当GPIO1_IO03输出低电平(0)的时候发光二极管LED0 就会导通点亮,当GPIO1_IO03 输出高电平(1)的时候发光二极管LED0 不会导通,因此LED0 也就不会点亮。所以LED0 的亮灭取决于GPIO1_IO03的输出电平,输出0 就亮,输出1 就灭。编译完成以后得到imx6ull-alientek-emmc.dtb,使用新的imx6ull-alientek-emmc.dtb 启动Linux 内核。

2023-12-17 19:48:50 720 2

原创 关键字volatile作用和用法

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。它主要用于处理与多线程、中断处理和硬件寄存器等相关的情况。防止编译器优化:编译器在优化代码时会尝试将变量的访问操作优化为更高效的方式,例如将变量的值缓存在寄存器中。然而,对于某些特殊的变量,如多线程环境下的共享变量、中断处理中的标志位、硬件寄存器等,这种优化可能会导致意外的行为。使用volatile关键字可以告诉编译器不要对该变量进行优化,确保每次访问都从内存中读取或写入。处理多线程共享变量。

2023-12-07 20:27:48 2216

原创 Linux驱动开发学习笔记3《新字符设备驱动实验》

经过前两章实验的实战操作,我们已经掌握了Linux 字符设备驱动开发的基本步骤,字符设备驱动开发重点是使用register_chrdev 函数注册字符设备,当不再使用设备的时候就使用unregister_chrdev 函数注销字符设备,驱动模块加载成功以后还需要手动使用mknod 命令创建设备节点。register_chrdev 和unregister_chrdev 这两个函数是老版本驱动使用的函数,现在新的字符设备驱动已经不再使用这两个函数,而是使用Linux 内核推荐的新字符设备驱动API函数。本节我们

2023-12-04 13:39:27 286

原创 Linux驱动开发学习笔记2《LED驱动开发试验》

所以本章的LED 灯驱动最终也是对I.MX6ULL 的IO口进行配置,与裸机实验不同的是,在Linux 下编写驱动要符合Linux的驱动框架。从上图可以看出,LED0 接到了GPIO_3 上,GPIO_3 就是GPIO1_IO03,当GPIO1_IO03输出低电平(0)的时候发光二极管LED0 就会导通点亮,当GPIO1_IO03 输出高电平(1)的时候发光二极管LED0 不会导通,因此LED0也就不会点亮。现在开启了MMU,并且设置了内存映射,因此就不能直接向0X020E0068 这个地址写入数据了。

2023-12-03 13:30:50 304

原创 Linux驱动开发学习笔记1《字符设备驱动开发》

是Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。

2023-12-02 17:24:26 305

原创 嵌入式C语言自我修养《数据存储与指针》学习笔记

size_t数据类型一般用在表示。

2023-11-06 18:58:53 531 1

原创 嵌入式面试常见问题(三)

答:线程冲突,也被称为竞态条件,是指在多线程环境中,当两个多更多的线程同时访问某一共享数据时,最终输出的结果取决于线程的运行时序,这可能导致输出的数据混乱,达到不可预测的效果。比如项目上有辐射探测器和温湿度传感器,这是两个线程,而其余线程又需要这两个线程的数据,一般都会对两个传感器的数值使用mutex.lock()和mutex.unlock()进行加锁,防止数据处理冲突。例如,您可以在/proc/cpuinfo中找到有关CPU的信息,而/proc/meminfo包含有关内存使用情况的信息。

2023-11-06 17:03:05 335

原创 嵌入式面试常见问题(二)

因为它是一个内联函数,可以像宏一样使用,任何想使用这个内联函数的源文件,都不必亲自再去定义一遍,直接包含这个头文件,即可像宏一样使用。

2023-10-20 13:24:31 313 1

原创 MobaXtem通过SSH远程登录ubuntu系统

工具:一个装windows10的笔记本电脑+工控机+路由器,工控机中安装的ubuntu16,通过网线和路由器相连。电脑连接路由器的wifi,就可以和工控机处于同一个局域网环境中。

2023-10-20 12:58:24 1017 1

原创 嵌入式C语言自我修养《GNU C编译器扩展语法》学习笔记

表达式就是由一系列操作符和操作数构成的式子。操作符可以是C语言标准规定的各种算术运算符、逻辑运算符、赋值运算符、比较运算符。操作数可以是一个常量,也可以是一个变量。

2023-10-14 17:40:00 770

空空如也

空空如也

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

TA关注的人

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