自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Moveit!中move_group的运动规划C++接口move_group_interface详解

大多数文章介绍move_group_interface都停留在对其成员函数的使用,plan()、execute()、move()等,但对其内部结构流程探究的很少。

2022-07-15 17:25:07 3238 3

原创 Ubuntu1804下的Melodic版本Moveit和OMPL的源码安装,并自定义规划算法在Moveit上使用

实习开始学习机械臂,安装过程及其艰难,资料鱼龙混杂。对近几天的工作进行安装总结。Ubuntu1804下的melodic版本,Moveit和OMPL的源码安装,并自定义路径规划算法,测试成功。

2022-06-15 14:16:56 4209 9

原创 无重复字符的最长字串

力扣算法题《无重复字符的最长字串》的思考和详解一.问题描述1.这道题的思考2.步骤一3.步骤二4.步骤三5.合并6.运行结果二.滑动窗口优化1.滑动窗口解释2.程序3.图解三、再优化1.步骤详解2.图解3.一个细节4.展示你的代码四、最后一.问题描述给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1

2022-01-18 18:05:41 366 1

原创 Linux驱动学习记录-20.Demo_Pro

针对之前的Demo,结合最近学习的知识,再做一次改进,改进版功能如下:1.整体改用input子系统设备结构2.做设备树下的platform总线驱动3.加入异步通知,按键1按下,窗口打印占空比4.加入非阻塞,按键2按下,窗口打印占空比改:写完后发现不合适使用input子系统。因为input子系统自动注册设备,也不需要设置fops操作函数集。只是针对设备输入,上报通知的功能。但是此Demo不仅有设备输入还有终端控制输出,涉及到了.unlocked_ioctl、.write等函数,稍微复杂些,因此还是

2021-11-15 11:18:36 151 1

原创 Linux驱动学习记录-19.INPUT子系统

按键、鼠标、键盘等设备都属于输入(input)设备。Linux内核有input子系统框架来处理事件。目录标题一、INPUT子系统简介二、驱动程序编写1.input_dev说明2.申请&注销input_dev3.初始化input_dev4.向内核注册&注销三、注册示例四、通知示例1.函数2.示例五、应用层的接收1.input_event2.示例六、驱动代码七、编译测试一、INPUT子系统简介我们写驱动程序主要关注中间的驱动层、核心层和事件层。分工如下:驱动层:输入设备的具体驱动程序

2021-11-13 10:48:26 1037

原创 Linux驱动学习记录-18.MISC的LED驱动

misc的意思是混杂的,因此叫做混杂驱动。MISC驱动是最简单的字符设备驱动,通常嵌套在platform总线驱动里。目录标题一、MISC驱动简介1.结构体2.使用二、LED驱动程序1.MISC设备结构体2.开、写等操作函数,以及函数集3.MISC驱动结构体4.probe和remov函数、匹配表以及platform结构体5.出口入口函数以及最后的定义三、测试编译一、MISC驱动简介1.结构体所有MISC驱动的主设备号都是10,不同的设备使用不同的次设备号。MISC会自动创建cdev,不用像之前一样手动

2021-11-12 11:09:10 743 1

原创 Linux驱动学习记录-17.platform设备驱动及其实验

对于复杂的驱动,Linux系统要考虑驱动的可重用性,因此有了驱动的分层和分离。诞生了platform设备驱动。目录标题一、驱动的分层分离思想1.platform驱动2.驱动框架3.platform设备4.platform设备框架二、LEDplatform编写(不带设备树)1.leddriver2.leddevice三、带设备树四、编译测试一、驱动的分层分离思想对于不同的平台,有不同的驱动,但对于同一个设备,应该有相同的驱动,让平台驱动和设备驱动相匹配。这样可以减少开发量。因此最终呈现的应该这张图:

2021-11-06 17:53:04 146 1

原创 Linux驱动学习记录-16.异步通知及其实验

设备驱动的异步通知,在访问设备的时候,由驱动程序主动对应用程序访问,这样应用程序无需轮询,和中断类似:当条件满足(按键按下),驱动程序向应用程序发送一个通知,应用程序要暂停手边工作,去处理驱动的通知任务,执行完毕再返回原本的任务。目录标题一、Linux信号1.信号2.处理函数3.信号使用例子二、驱动函数的信号处理一、Linux信号1.信号定义符号解释#define SIGHUP1/* Hangup (POSIX). 终端连接断开信号*/#define SIGINT

2021-11-05 21:24:38 251

原创 Linux驱动学习记录-15.非阻塞(轮询)及其程序

上一节介绍了阻塞,这次是非阻塞IO。一、非阻塞介绍应用程序使用非阻塞访问设备时,当设备不可用,就会返回一个错误码,表示数据读取失败,应用程序会重新读取数据,一直循环,直达读到数据。简单示例:char buf;fd = open("/dev/led", O_RDWR | O_NONBLOCK);...while(read(fd, &buf, 1) != 1)printf("%c",buf);二、轮询应用程序需要非阻塞的方式,那么驱动程序就要提供非阻塞的处理方式:轮询。poll、e

2021-11-04 21:24:16 400

原创 Linux驱动学习记录-14.阻塞以及实验

阻塞和非阻塞是Linux驱动开发的常用访问模式。编写程序要考虑。本次介绍阻塞。目录标题一、阻塞介绍二、等待队列1.定义等待队列头2.初始化队列头3.定义等待队列4.添加、移除等待队列5.等待唤醒6.等待事件三、驱动程序四、编译测试一、阻塞介绍阻塞操作是指在执行设备操作时,不能获取设备资源,就挂起进程直到资源可以访问再进行操作。被挂起的操作进入休眠。而非阻塞操作的进程不能进行设备操作时,不会挂起,要么放弃要么不断查询,直到可以操作。区别在于:在应用程序中的read、write函数执行时,若设备不可操作

2021-11-04 19:11:03 235 1

原创 Linux驱动学习记录-13.demo

基于前面所学知识,写了一个完整的小程序,功能如下:App可控制led的亮灭,采用定时器模拟pwm输出,key1增大占空比,led亮度增高,key2减少占空比。gpio中断控制key,按键按一次,输出此时占空比,每次±10%,范围在0%-100%两个定时器,定时器1负责输出PWM,定时器2用于按键延迟确认。窗口输入,可直接设置占空比可设置输出,显示目前亮度占空比目录标题一、设备树1.iomuxc设置2.节点设置二、驱动程序1.两个结构体2.入口函数3.gpio初始化4.两个外部中断函数4.两个定时

2021-10-24 21:10:11 421 4

原创 Linux驱动学习记录-12.Linuxgpio中断

这里介绍imx6u的重点,配置寄存器,设置服务中断函数。目录标题一、中断API函数1.申请中断2.释放中断3.中断处理函数4.使能和禁止二、上半部和下半部1.软中断2.tasklet3.工作队列三、设备树中断节点四、获取中断号五、驱动程序一、中断API函数每个中断都有一个中断号,linux有一个int变量表示中断号。1.申请中断int request_irq( unsigned int irq, irq_handler_t handler, unsigned long fl

2021-10-24 19:59:43 3237 2

原创 Linux驱动学习记录-11.内核定时器

这章学习Linux内核定时器,介绍其API函数和用法。目录标题一、时间管理二、内核定时器三、驱动程序四、测试1.测试App2.编译3.测试一、时间管理系统节拍默认100hz,即每秒100次,定义一个HZ=100Linux内核使用全局变量jiffies来记录系统从启动以来的系统节拍数,系统启动时将jiffies初始化为0,定义在include/linux/jiffies.h中。所以jiffies/HZ就是系统运行时间。函数描述time_after(unknow,know)un

2021-10-20 21:26:10 223

原创 Linux驱动学习记录-10.按键输入

采用原子操作,设置GPIO为输入模式,对按键值保护。文章目录一、设备树修改1.找东山的原理图对应的引脚2.找imx6ull芯片手册查此引脚宏定义3.打开dts文件,找到iomuxc,在其下面添加子节点4.在根节点下添加gpio节点,使用刚的节点地址5.检查有无重复定义的节点二、驱动程序三、测试1.测试App2.编译3.运行一、设备树修改这里介绍其流程:1.找东山的原理图对应的引脚2.找imx6ull芯片手册查此引脚宏定义3.打开dts文件,找到iomuxc,在其下面添加子节点4.在根节点下

2021-10-20 09:40:49 235

原创 Linux驱动学习记录-9.并发与竞争实验

本章实验由第六章“设备树led驱动”代码修改而来,设备树不需要改动。文章目录一、原子操作1.驱动程序2.测试二、自旋锁实验1.驱动程序2.测试三、信号量1.驱动程序2.测试四、互斥体实验1.驱动程序2.测试五、总结一、原子操作1.驱动程序实现一次只能操作一个led,当这个驱动正在操作这个led时,其他驱动不可访问这个led。思路:在设备结构体定义一个原子整形变量,并在入口函数初始化为1,在使用open打开驱动的时候,先检查原子变量的值是否为1,是的话减一并设置私有数据,驱动正常运行。如果不是1

2021-10-16 18:42:18 155

原创 Linux驱动学习记录-8.Linux并发与竞争

Linux是多任务操作系统,存在福哦个任务操作同一设备或内存的情况,现在介绍并发的管理。文章目录一、原子操作1.整形操作API函数2.原子位操作API函数二、自旋锁1.自旋锁2.API函数3.其他类型的锁三、信号量1.信号量简介2.API函数三、互斥体1.互斥体简介2.API函数一、原子操作1.整形操作API函数Linux内核定义了atomic_t的结构体来完成整形数据的原子操作。用原子变量代替整形变量。typedef struct { int counter;}atomic_t;a

2021-10-15 19:00:02 191

原创 Linux驱动学习记录-7.pinctrl和gpio子系统

之前都是在驱动程序中设置gpio引脚信息,设置寄存器状态功能,现在引入pinctrl和gpio子系统功能,可以在设备树中设置引脚,而不用去驱动程序中设置,方便程序的模块化设计。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是.

2021-10-14 10:28:00 348 1

原创 Linux驱动学习记录-6.设备树的LED驱动

这一章使用第五章的设备树知识来写led驱动1.修改设备树在根节点下面添加子节点alphaled { #address-cells = <1>; #size-cells = <1>; compatible = "atkalpha-led"; status = "okay"; reg = < 0X020C406C 0X04 /* CCM_CCGR1_BASE *

2021-10-05 18:43:41 325 1

原创 Linux驱动学习记录-5.设备树介绍

设备树是Linux驱动开发的必备技能。1.什么是设备树 设备树(Device Tree),描述设备树的文件叫做DTS(Device Tree Source),这个DTS文件采用树形结构描述板级信息如下图: 设备树源文件DTS,将.dts文件编译后会得到二进制文件DTB,需要用到DTC工具。进入源码里,使用make all会编译Linux中所有的东西,包括zImage、.ko、.dts等。也可以只使用make dtbs只编译dt...

2021-10-05 17:01:24 222

原创 Linux驱动学习记录-新字符设备

第一节介绍了字符驱动设备,开发重点是register_chrdev注册字符设备,unregister_chrdev注销字符设备。驱动加载需要mknod命令创建节点。这些都是老版本,现在学习新字符设备驱动开发。第一节提了一点点,申请设备号是用自动分配的方式就是新设备开发。1.新字符设备注册Linux中cdev结构体表示一个字符设备,在include/linux/cdev.h中,定义如下//字符结构体 重点是 dev和opsstruct cdev { s...

2021-10-04 18:34:47 224

原创 Linux驱动学习记录-LED驱动开发

1.地址映射这里进行虚拟地址和物理地址的相互映射转换。MMU全称Memory Manage Unit (内存管理单元)。对于32位处理器,虚拟地址的范围是2^32=4GB,但开发板没有这么大内存,只有512MB。经过MMU可以把物理内存映射到4GB的虚拟内存。上图可以看到肯定存在多个虚拟地址映射到同一个物理地址上去,在Linux内核启动会初始化MMU,设置内存映射,设置好后电脑cpu访问的都是电脑的pc虚拟地址。比如imx6的一个引脚地址是0X02022222。Linux启动并且开启了MM...

2021-10-01 13:21:07 187

原创 Linux驱动学习记录-编译及测试

编写测试APP编写测试APP就是编写Linux应用,需要用到C语言库和上节编写的操作函数。 首先介绍打开函数:int open(const char *pathname, int flags) pathname:要打开的设备。就是装载驱动后,创建的节点文件,形如 /dev/XXX。 flags:文件打开方式。O_RDONLY(仅读);O_WRONLY(仅写);O_RDWR(读写)。 返回值:文件打开成功就返回文件的描述符。 读写函数:ss...

2021-09-12 11:40:14 140

原创 Linux驱动学习记录-字符设备驱动

字符设备是Linux驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作,读写数据分先后顺序。比如常见的点灯,按键,IIC,LCD等。 加载/卸载函数加载/卸载函数module_init(XXX_init), module_exit(XXX_exit),其中XXX_init和XXX_exit是需要自己编写的函数,当执行命令”insmod”和”remod”会加载/卸载驱动时,会调用上面两个函数。模板如下:static int...

2021-09-11 17:58:54 150

空空如也

空空如也

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

TA关注的人

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