自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 STM32------分析GPIO寄存器

编程的目的是为了操作硬件,硬件分布在地址上,所以转变为编程操作地址,因为地址是唯一的。编程的目的就操作地址间接操作硬件地址分布比较广,硬件都会把地址用寄存器的方式来分布某个地址到某个地址属于某个寄存器这样的话我们操作硬件实际上就是在操作地址,操作地址实际上就是转化为操作寄存器。

2024-03-01 00:35:53 2129

原创 STM32定时器中断

其中Intelernalclockconfig配置tim2选择内部时钟,一般默认就是内部时钟可以不设置。PSC预分频器,把系统时钟ck_psc进行分频得到ck_cnt时钟给cnt计数器。定时器可以对输入的时钟进行计数,并在计数值达到设定值时发出中断。定时1s就是1hz,1s=0.001ms,1/1hz=1s。配置完成后,1s进一次中断,可以再中断中进行想要的操作。定时频率=ck_psc/(psc+1)/(arr+1)Tim2使用内部时钟,可以不调用,默认内部时钟。

2024-02-05 00:44:13 596

原创 第十一天栈与队列

有的同学经常会想学的这些数据结构有什么用,也开发不了什么软件,大多数同学说的软件应该都是可视化的软件例如APP、网站之类的,那都是非常上层的应用了,底层很多功能的实现都是基础的数据结构和算法。输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]如果基数为0,则它使用的基数由序列中的格式确定。从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒序的,所以再对字符串进行反转一下,就得到了最终的结果。

2023-02-13 20:56:24 510 1

原创 第十天栈和队列

栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。从下图中可以看出,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是。队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序。所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈。

2023-02-10 12:00:31 650 1

原创 第八天字符串

字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

2023-02-09 12:09:45 314

原创 第六天哈希表

std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。虽然std::set、std::multiset 的底层实现是红黑树,不是哈希表,std::set、std::multiset 使用红黑树来索引和存储,不过给我们的使用方式,还是哈希法的使用方式,而在关联式容器set中,是以键值对的方式存储的。

2023-02-08 22:12:44 522

原创 第四天链表

可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。根据题意,两个链表相交的点是指,两个指针指向的内容相同,则说明该节点在a上有在b上,进而说明a和b相交。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

2023-02-04 13:03:27 723

原创 四、共享内存

信号灯相当于一个值大于或等于 0 计数器,信号灯值大于 0,进程就可以申请资源,信号灯值-1,如果信号灯值为0,一个进程还想对它进行-1,那么这个进程就会阻塞,直到信号灯值大于 1。Linux 内核为每个消息队列对象维护一个 msqid_ds,每个 msqid_ds 对应一个 id,消息以链表形式存储,并且 msqid_ds 存放着这个链表的信息。在操作系统中,申请内存的最小单位为页,一页是 4k 字节,为了避免内存碎片,我们一般申请的内存大小为页的整数倍。以进入临界区,使 sv 减 1。

2023-02-04 11:24:54 710

原创 三、进程通信

这些情况通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程,例如,内核对正访问一个无效存储区的进程产生一个SIGSEGV信号;2. fork()创建子进程,一个进程读,使用 read(),一个进程写,使用 write(1. 只能用于有关联的进程间数据交互,如父子进程,兄弟进程,子孙进程,在目录中看不到文件节。2. 只能单向传输数据,即管道创建好后,一个进程只能进行读操作,另一个进程只能进行写操作,等于-1,除发送进程自身外,向所有进程 ID 大于 1 的进程发送信号。常用来进行错误检查。

2023-02-04 00:33:28 362

原创 二、进程的知识

所有的进程都是由其他进程创建(除了 pid 为 0 号的 idle 进程),pid 号为 1 的 init 进程是系统启动后。vfork()会产生一个新的子进程,其子进程会共享父进程的数据与堆栈空间,并集成父进程的用户代码等。僵尸进程:子进程结束以后,父进程还在运行,但是父进程不去释放进程控制块,这个子进程就叫做僵尸。运行的第一个进程,是所有进程的父进程,init 进程会初始化一部分系统服务,创建其他进程。ps查看正在运行的进程,一个进程可以有多线程,同一进程里面的线程共享此进程的同一资源。

2023-02-04 00:16:11 339

原创 一、系统编程常用api

头文件是 stdio.h,文件 IO 是依赖于 Linux 操作系统的,标准 IO 是不依赖操作系统的,所以在任何的操作系统下,使用标准 IO,也就是 C 库函数操作文件的方法都是相同的。,所有打开的文件都有一个对应的文件描述符。文件 IO 是直接调用内核提供的系统调用函数,头文件是 unistd.h,标准 IO 是间接调用系统调用函数,mode:权限掩码,对不同用户和组设置可执行,读,写权限,使用八进制数表示,此参数。mode:权限掩码,对不同用户和组设置可执行,读,写权限,使用八进制数表示,此参。

2023-02-03 23:52:31 427

原创 第三天链表

这道题写的时候,刚开始以为head本身是虚拟头结点,直接写然后错误,再删除【7 7 7 7】的时候总是漏一个,后面通过打印发现head有值,是第一个元素的值,所以就需要在申请一个节点来指向head,这样的话就可以操作head了,指向head的这个节点是不能动的,动了的话后面就没法返回了,所以还需要在申请一个节点等于指向头结点的节点,用这个节点来操作链表,当这个节点移动到最后的时候,这时候一开始指向头结点的节点就指向了新的节点了。输入:head = [1,2,6,3,4,5,6], val = 6。

2023-02-03 20:06:31 554

原创 二、第二天

示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]然后定义一个新的数组,因为要排序,介于使用双指针每次找到的都是最大的,所以对于新数组的下标要从最后一个位置来进行存储,所以新数组的长度要和原数组一样。输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。最后找到 4,3 是最短距离。

2023-02-03 00:21:43 201

原创 六、服务端开发

服务器端开发:服务器设计框架:缓解和转发的作用连接音箱和app最大一个作用转发一个app操作音箱app绑定音箱服务器类实现:jsoncpplibventverser.h当有客户端发起连接的时候调用listener_cb回调函数server.hserver.cppserver.cpp在main.cpp创建服务器对象服务器数据解析:这里解析解析消息有可能app发过来有可能音箱发过来app向服务器发送音箱向服务器发送server.hserver.cppnode.h保活消息。

2023-02-01 18:32:13 1693

原创 五、mini2440按键,从设备文件读取按键数据

select.c。

2023-02-01 17:49:29 150

原创 四、与服务器进行数据交换

JSON 值可以是:字符串(在双引号中)、数组(在中括号中)、数字(整数或浮点数)、逻辑值(true 或 false)、对象(在大括号中)、 null。json键值对用来保存js对象的一种方式,键/值对包括字段名称(在双引号中),后面写一个冒号,然后是值。成功:如果调用此alarm()前,进程已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。json是一种轻量级的数据交换格式,json选用完全独立于语言的文本格局,。来简化上面的JSON,这是一个拥有一个name数组的对象。

2023-02-01 17:43:35 304

原创 三、结束播放

暂停前提正在播放或者已经暂停了都不可以。没有播放没法继续,如果没有暂停没法继续。父进程把子孙进程杀死就可以了。暂停继续:通过信号继续。通过信号让子孙进程停止。只有播放才能切换上一首。信号杀死再选择一首歌。player.c实现。2、暂停也不能上一首。

2023-02-01 17:00:36 139

原创 三、初始化共享内存

因为涉及到上一首下一首,需要改变链表,上一首下一首,双向循环链表。在pleyer.c中编写开始播放的主要程序。开始播放涉及到多进程并发涉及到共享内存。父进程作用产生子进程,孙进程播放音乐。父进程创建子进程,子进程创建孙进程。在main.c中初始化共享内存。当输出1的时候开始播放音乐。开始播放需要有三个进程的。

2023-02-01 16:46:34 267

转载 TCP连接原理

服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1(确认序号为收到的序号加1),并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。二次握手,tcp服务器收到请求报文后,如果同意连接,如果同意连接,则发出确认报文。服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

2023-02-01 14:21:27 569

原创 一、第一天| 704. 二分查找、27. 移除元素。

下面开始进入for循环,for循环中只有一个判断p【0】不等于val,这里p的值等于val,所以p向前移动,q不动,因为q的位置需要用不等于val的值来覆盖,当p【1】的时候,p【1】等于2不等于val的时候,这时候q就需要移动了,用p的值来更新q的值,同时q往后移动等待下一次更新。,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组。

2023-02-01 13:51:13 122

原创 二、音箱初始化

因为开发板有led,现在考虑连接的时候用led提示,发起连接的时候第一个灯亮,初始化时led灭,音箱的触发要么是按键触发g_buttonfd,要么是app触发g_sockfd。在select.c中加一个标准输入 的测试代码,后续会删除,主要用于测试功能。考虑到会连接失败,线程会向服务器发起5次连接,如果五次均为成功,返回失败。初始化网络,一旦连接成功后,下面就要监听,到底是按键还是网络有信息发过来。在main.c中做一个判断,当网络初始化失败后亮两个灯。再开始播放音乐的时候,需要把所有音乐的名字读出来。

2023-02-01 11:13:51 368

原创 一、项目简介客户端实现:

使用mini2440开发板,实现播放音乐客户端需要同时做三件事情:播放音乐监听按键(读设备文件和文件描述符)上位机app有没有发出指令(监听网络socket,文件描述符,app通过网络发送数据)对于上述事情的2和3使用select来监听文件描述符因为存在监听和播放两个事情,需要使用并发,这里选择多进程来并发,因为多进程比较健壮,一个负责监听,一个负责播放音乐创建三个进程父进程创建子进程,子进程创建孙进程父进程通过select来监听按键和网络。

2023-02-01 00:18:50 202

原创 linux遇见的问题

一、E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?

2022-08-23 21:59:05 237

转载 moveit错误一

failed to lunch this commandwhen i try this command : roslaunch panda_moveit_config demo.launchrviz_tutorial:=true i get this error : No such file or directory: /opt/ros/noetic/share/franka_description/robots/panda_arm_hand.urdf.xacro [Errno 2] No su.

2022-03-19 17:28:14 700 3

原创 moveit例程错误

一、No such file or directory: /opt/ros/melodic/share/franka_description/robots/panda_arm_hand.urdf.xacrroslaunch panda_moveit_config demo.launch rviz_tutorial:=trueNo such file or directory: /opt/ros/melodic/share/franka_description/robots/panda_arm_

2022-03-19 17:02:22 410

转载 ubuntu提示E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)

ubuntu提示E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)_西部壮仔的博客-CSDN博客

2022-03-19 14:15:37 291

原创 moveit可视化配置三

MoveIt+Gazebo 仿真配置针对控制器很重要的一个功能包。管理各种 控制器的。moveit ---- roscontroller ----gazebo/真机通过action发出去这里面就死三个控制器的配置他把规划数据封装好,封装成一个fjt这个类型的数据。这个是数据结构,包含各个关节的轨迹点另外一端谁来收呢就是需要注意的是这里需要改一下名字。以50hz的频率向上反馈机械臂的姿态为了启...

2022-03-18 21:16:03 229

原创 moveit可视化配置二

MoveIt Setup Assistant 可视化配置(marm)机械臂有夹爪和相机怎么办规划组配置先配置本体夹爪和本体是分离的有两套控制器是两个对象以为是两个夹爪,不需要任何的求解,求解器不用选,时间不用选。需要addjoint把夹爪要运动的关节告诉他知道这个组里面有哪两个关节在动就可以了两个规划组的配置有夹爪了也是需要做配置的。要让moveit知道这个东西是夹爪。夹爪是在link6上面的。收的控制器的名字...

2022-03-18 20:56:50 638 1

原创 moveit可视化配置一

MoveIt Setup Assistant 可视化配置(C800)启动配置助手虚拟关节,在外界设置一个坐标系,设置外界的某一个参考是,通过虚拟关节连接一个会动的坐标系不会动的没有用规划组:六个轴同时运动,对六个中通知规划选择addjoint,到底针对机械臂的那些关节一般是选择这个add运动学的一个链因为六个轴是串联的可以选择baselink和顶端如果前面加了夹爪的话需要做另外一个规划组的配置...

2022-03-18 20:39:55 462

原创 moveit配置(一)

moveit配置roscorerosrun moveit_setup_assistant moveit_setup_assistant问题一、这个问题我碰到好几次,都是有时候多试几次就好了,然后这个突然想到我直接在他的工作空间运行moveit会不会好,事实证明是可以的,可以直接在urdf的工作空间打开moveit就不会出问题了出现机器人模型完美加载。接下来就是配置了过程化的东西碰撞检测,自动生成规划组选择,然后名字自定义。...

2022-03-18 20:06:39 340

原创 单片机---ICC总线EEPROM理论

I2C:同步串行2线方式进行通信(一条时钟线SCL,一条数据线SDA)是一种串行总线I2C 总线的主要特点是接口方式简单,两条线可以挂多个参与通信的器件,即多机模式,而且任何一个器件都可以作为主机,当然同一时刻只能有一个主机。有接入的器件保持高电平,这条线才是高电平,而任何一个器件输出一个低电平,那这条线就会保持低电平,因此可以做到任何一个器件都可以拉低电平,也就是任何一个器件都可以作为主机虽然说任何一个设备都可以作为主机,但绝大多数情况下我们都是用单片机来做主机,而总线上挂的多个器件,每一

2022-02-11 20:54:58 1142

原创 51单片机---定时器

1、视频学习也还是这两个图定时/计数器:两个功能定时器可以实现准确定时。定时功能,计数功能。一个低电平一个高电平就是一个脉冲。定时器作用:精确事件定时如何使用定时计数器:首先是启动定时计数器,怎么去启动他来。通过特殊功能寄存器TCON来启动。然后是设计定时计数器的工作模式 ,通过TMOD特殊功能寄存器。可以通过查询方式来判断定时计数器是否溢出。它内部有一个16位的定时计数器,如果我们把它设定在定时模式下,每隔一个机械周期这个16位寄存器就会加1,当

2022-02-10 14:22:11 24666 1

原创 51单片机----中断

中断系统:上电复位:用了一个阻容电路电容通交隔直单片机的引脚默认都是有一个上拉电阻的,也就是默认端口是5v中断可以处理随机突发事件51单片机有5个中断源:2个外部中断3个内部中断你要是低电平触发它还是下降沿触发它。低电平就是说你这个p32收到一个0v的时候代表外面有一个中断源产生了那么我就会进入我的一个中断程序中去。下降沿就是一个高电平到一个低电平,从高遍地期间就是一个下降沿。如果有这样一个下降沿产生的话就会进入到一个外部中断处理中去。这是一个非...

2022-02-10 13:30:52 3945 3

原创 8x8LED点阵

点量这个只需要把9高电平,13低电平就可以了共阳极点阵行线是led的正极列线是led的列线左上角点亮显示多个灯是动态扫描的,一个一个显示的,然后间隔速度要快就可以造成显示点阵由两篇74Hc595级联在一起驱动的,只需要三个io口74Hc595串入并出的芯片,串行输入,并行输出。并行占用硬件资源多。使用方法:芯片一共16个脚:八个io口并行输出,然后一片控制8个,两片控制16个只需要三个io口就能驱动我们16...

2022-02-09 21:11:59 11720 2

原创 矩阵键盘识别

中心思想先判断那一列被按下,再判断那一行被按下,就可以确定一个按键一、列扫描的时候,把列的io口拉高,然后行的io口置低,这样当有按键按下的时候,他对应的列的io口就会变低。如果s6、、10、14、18按下后,p34都会置低变为0。这样就可以判断那一列被按下了。行扫描:把行上面的io口拉高,列拉低。当有那一行按下,就会被拉低通过行列扫描的结合就可以判断哪一个被按下了...

2022-02-09 20:09:45 3010

原创 ubuntu20之ROS-noetic的qt插件安装

自己再rosnoetic安装的时候踩过的坑,由于晚上教程都是对应ubuntu18的然后照着教程安装总是出问题然后我也是在试了无数教程后终于安上了最后是安上了然后把过程记录一下以免自己最后忘记1、qt5.9.9的安装:https://download.qt.io/archive/qt/5.9/5.9.9/下载完后在改文件夹打开终端,输入sudo chmod a+x /给安装包赋予权限,之后双击安装,安装时,没有Qt账户的需要注册,然后在安装组件那一步勾选gcc,其他都按照默认的安装(即安

2022-02-08 19:13:16 4363 10

原创 八、ros中的头文件与源文件

本节主要介绍ROS的C++实现中,如何使用头文件与源文件的方式封装代码,具体内容如下:1、设置头文件,可执行文件作为源文件;2、分别设置头文件,源文件与可执行文件。在ROS中关于头文件的使用,核心内容在于CMakeLists.txt文件的配置,不同的封装方式,配置上也有差异。3.2.1自定义头文件的调用在 src 目录下新建文件:hello.cpp,示例内容如下:#include "ros/ros.h"#include "test_head/hello.h"n

2022-02-07 20:49:04 1718

原创 七、ROS通信机制进阶

API应用程序编程接口1初始化:ros::init作用:ros初始化函数参数列表:1.argc --参数个数-封装实参的个数,调用的时候传入了n个参数,那么实际封装的个数是n+1,因为他会多一个,传入的第一个是文件自身。 2.argv --参数列表-封装这个参数的数组,字符串数组 3.name ---为节点命名需要保证他的唯一性 4.options(可选的)节点启动选择,暂时没有使用过...

2022-02-07 20:38:23 977

原创 六、通信机制实操

1、话题发布1.话题与消息获取1.1话题获取1.2消息获取rostopic info 可以显示当前话题的一些信息信息中就包含我们的消息,type就是话题下挂在的消息rostopic type也是获取消息类型的,更直观获取消息格式rosmsg show和info都可以2.实现发布节点创建功能包需要依赖的功能包: roscpp rospy std_msgs geometry_msgs实现方案A:C++#include "ros/ro...

2022-02-07 19:10:36 1557

原创 五、ROS的常用命令

http://wiki.ros.org/ROS/CommandLineTools1、rosnoderosnode 是用于获取节点信息的命令rosnode ping 测试到节点的连接状态rosnode list 列出活动节点rosnode info 打印节点信息rosnode machine 列出指定设备上节点rosnode kill 杀死某个节点rosnode cleanup 清除不可连接的节点 rosnode cleanup 清除无

2022-02-07 17:03:39 2110

空空如也

空空如也

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

TA关注的人

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