- 博客(53)
- 收藏
- 关注
原创 RISC-V 基础指令汇总
这条指令把 imm (立即数)左移12位并带符号扩展到64位后,得到一个新的立即数,这个新的立即数是一个有符号的立即数,再加上当前 PC 值,然后存储到 rd 寄存器中。
2023-09-24 23:31:56
2306
原创 Neovim for Rust
之前学习Rust一直使用的都是,最近看到有网友安利Neovim于是就试了试,发现确实美观,好用,而且内存占用比较小。我个人很喜欢,也推荐给给大家。前提:得有个代理,不然大概率会失败,因为需要从github上下载插件。
2023-03-02 12:34:21
2417
原创 使用 Rust 处理 FTP
由于我使用的 ftp server 使用了 TLSv1.2 的加密算法,所以必须使用 ftp crate 中的。故而我们需要为编译做一些准备工作,否则会编译失败。所以我们需要先编译好这三个版本中的一个,我编译的是。首先添加 ftp crate 依赖,需要使用。其他信息可以在 docs.rs 上查看。版本较低,将被丢弃。模式,在这个模式下无法使用。这三个版本中的任意一个。
2023-02-25 18:04:46
1177
原创 ftplib 应用
这是一个奇怪而少见的场景:我工作在 A 网络中,需要 B 网络中的 Server 给我提共服务(编译中的一个步骤),但是 A 和 B 是不可以相互连接的。而 A 和 B 网络现有的可用工具只有 ftp。实际应用中非常浪费时间,并且浪费人力。所以就想到用 ftplib 来自动化处理这些事务。文件(包含结果文件)。
2023-02-20 14:28:25
263
原创 用 ArchLinux i3wm 居家办公
这个方案之前我了用 Windows 虚拟机,vmware 总是有问题,virtualbox 全屏有问题,最终还是这个方案比较舒服。
2023-01-31 18:43:40
689
原创 解决yay官方源下载慢问题
由于清华源删除了AUR源,使用官方源安装软件时经常出现无法下载的问题。这里记录一个偏方快速下载安装AUR软件。具体步骤如下:1.先上archwiki的aur界面搜索想要下载的软件,例如 riscv-gnu-toolchain-bin;2.点击链接进入3.通过git clone url 下载PKGBUILD文件;4.编辑下载下来的PKGBUILD文件,将其中的所有github.com改为hub.fastgit.xyz;5.使用makepkg命令从修改的hub.fastgit.xyz镜像网站下
2022-05-11 17:45:03
8180
原创 Rust and C 多播案例
下面将分别用 Rust 和 C 实现一个 Linux 上的多播案例:发送端循环发送十次数据,接受端循环接收十次数据并打印到屏幕。Rust 实现// ./send/src/main.rsuse std::net::UdpSocket;use std::thread;fn main() { let socket = UdpSocket::bind("127.0.0.1:9999").unwrap(); const COUNT: usize = 100; for i in 0.
2022-05-08 12:42:51
781
原创 Rust 用于 STM32 开发
我的开发板有两个了 LED 灯,做一个用按键控制两个灯的小测试。电路图如下:可见 LED 连接在 PF9 和 PF10 引脚,按键连接在 PA0 引脚。用 Cargo 创建一个 Rust 项目,并在一下文件中添加代码:./memory.x:需要自己新建。这是用来配置存储分布的,我的 MCU 是 stm32f407 系列的。MEMORY{ /* NOTE 1 K = 1 KiBi = 1024 bytes */ FLASH : ORIGIN = 0x08000000, LENGTH =
2021-11-21 15:24:16
5184
原创 000 高数预备知识
一、三角函数1. 直角三角形中的定义在直角三角形中仅有锐角(大小在0到90度之间的角)三角函数的定义:θ\thetaθ的正弦是对边与斜边的比值:sinθ=ah{\displaystyle \sin {\theta }={\frac {a}{h}}}sinθ=haθ{\displaystyle \theta }θ的余弦是邻边与斜边的比值:cosθ=bh{\displaystyle \cos {\theta }={\frac {b}{h}}}cosθ=hbθ{\displaystyle \t
2021-11-14 15:09:22
3173
原创 vim 配置 C/C++/Rust/Python 开发环境
先感受一下效果:Rust:C\C++:Python:1、安装 Nerdtree 插件显示左侧目录将 Nerdtree 插件下载到 ~/.vim/pack/vendor/start 目录下,如果没有则新建此目录。cd ~/.vim/pack/vendor/startgit clone git://github.com/scrooloose/nerdtree在 ~/.vimrc 文件中添加配置:" 进入 vim 时自动开启 NERDTreeautocmd VimEnter * NER
2021-10-30 11:53:58
1856
原创 VS Code 配置 Rust-Analyzer
在 VS Code 中配置 Rust 开发环境通常使用插件 Rust-Analyzer. 但安装好插件后通常要下载他的 Server 程序,并且以后打开 VS Code 也经常会要下载 Server. 但是经常会遇到下载缓慢的问题。这里提供手动的方式去配置 Rust-Analyzer.1、Nightly Toolchain运行以下命令去安装 Rust-Analyzer:rustup component add rust-analyzer-previewrustup 会将 rust-analyzer
2021-10-23 17:36:15
8297
2
原创 Linux 安装 VMware Player
1. 从官网下载安装包https://customerconnect.vmware.com/en/downloads/details?downloadGroup=WKST-PLAYER-1612&productId=1039&rPId=666212. 执行以下指令去安装sh VMware-Player-16.1.2-17966106.x86_64.bundle3. 如果安装完重启后可以直接使用,那么恭喜你,太幸运了。我运行时遇到如下问题:vmplayer //运行 v
2021-09-14 22:45:11
2550
原创 Rust 快速安装
在安装 Rust 时,经常会卡在下载那里。因为服务器在国外,难免会有延迟。我们可以在命令窗口执行如下指令,使当前会话的 Rust 服务器地址替换为国内的源。这里使用中科大的源。[wlb@Arco ~]$ export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static[wlb@Arco ~]$ export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
2021-06-27 14:02:50
1039
原创 Rust 学习随笔
变量可变性在 C/C++ 中,变量默认是可变的。而在 Rust 中,变量默认是不可变的。 let x = 10; //x = 11; //错误的 println!("x = {}", x);它和 const 类型不一样,它可以使用 let 关键字重新绑定新的值,以是同一个变量可以拥有不同的值,并将旧的值隐藏掉了。在 rust 中,这种操作被称作 隐藏。使用 let 时,相当于创建了新的变量,可以改变变量的类型。 let x = 9; let x = x + 1
2021-02-22 22:18:48
1251
原创 Arcolinuxd 的安装及配置
制作启动盘官网下载过于缓慢,个人推荐一个稍微快一些的站点:http://bike.seedhost.eu/arcolinux/iso/在 windows 上使用 rufus 工具,以 dd镜像 方式写入优盘。在 linux 上直接用 dd 指令写入即可。安装插上优盘,进入 BIOS 设置从优盘启动。进入系统后,他会自动打开 Welcome 界面。先用点击打开欢迎界面上的 GParted 工具,将电脑硬盘全部格式化。 点击打开 Calamares 工具,即安装程序。(安装程序中有很多
2021-01-31 16:39:05
4091
原创 Beagle Bone Black 的一些笔记
相关链接这是 beagle bone black 的一些官方资料 包括硬件原理图等这是 beagle bone black 的内核源码 进行驱动开发时可以用到,也可用它编译,制作系统 img 镜像。这是源码编译,制作镜像的教程。编译源码/* 安装编译器 */sudo apt-get install gcc-arm-linux-gnueabi/* 一些需要的工具 */sudo apt-get install gitsudo apt-get install lzop...
2021-01-25 23:01:11
1056
原创 STL 容器 - map/multimap
3.9.1 map基本概念简介:map中所有元素都是pairpair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)所有元素都会根据元素的键值自动排序本质:map/multimap属于关联式容器,底层结构是用二叉树实现。优点:可以根据key值快速找到value值map和multimap区别:map不允许容器中有重复key值元素multimap允许容器中有重复key值元素3.9.2 map构造和赋值功能描述:对map容器进行构造和赋值操
2020-09-20 13:45:06
254
原创 STL 容器 - set/multiset
3.8.1 set基本概念简介:所有元素都会在插入时自动被排序本质:set/multiset属于关联式容器,底层结构是用二叉树实现。set和multiset区别:set不允许容器中有重复的元素multiset允许容器中有重复的元素3.8.2 set构造和赋值功能描述:创建set容器以及赋值构造:set<T> st; //默认构造函数:set(const set &st); //拷贝构造函数
2020-09-20 13:39:33
180
原创 STL 容器 - list
3.7.1 list基本概念**功能:**将数据进行链式存储链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的链表的组成:链表由一系列结点组成结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域STL中的链表是一个双向循环链表由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器list的优点:采用动态存储分配,不会造成内存浪费和溢出链表执行插入和删除操作十分方便,修改指针
2020-09-20 13:29:24
150
原创 STL 容器 - queue
3.6.1 queue 基本概念概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个口。队列容器允许从一端新增元素,从另一端移除元素队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为。队列中进数据称为 — 入队 push队列中出数据称为 — 出队 pop3.6.2 queue 常用接口功能描述:栈容器常用的对外接口构造函数:queue<T> que;
2020-09-20 13:22:53
147
原创 STL 容器 - stack
3.5.1 stack 基本概念概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口。栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为栈中进入数据称为 — 入栈 push栈中弹出数据称为 — 出栈 pop3.5.2 stack 常用接口功能描述:栈容器常用的对外接口构造函数:stack<T> stk; //stack采用模板类实现, stack对
2020-09-20 13:16:35
1147
原创 STL 容器 - deque
3.3.1 deque容器基本概念功能:双端数组,可以对头端进行插入删除操作deque与vector区别:vector对于头部的插入删除效率低,数据量越大,效率越低deque相对而言,对头部的插入删除速度回比vector快vector访问元素时的速度会比deque快,这和两者内部实现有关deque内部工作原理:deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间deque容器的迭代器也是支
2020-09-15 22:25:11
260
原创 STL 容器 - vector
3.2.1 vector基本概念功能:vector数据结构和数组非常相似,也称为单端数组vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间vector容器的迭代器是支持随机访问的迭代器3.2.2 vector构造函数功能描述:创建vector容器函数原型:vector<T> v;
2020-09-15 22:11:17
251
原创 STL 容器 - string
3.1.1 string基本概念本质:string是C++风格的字符串,而string本质上是一个类string和char * 区别:char * 是一个指针string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。特点:string 类内部封装了很多成员方法例如:查找find,拷贝copy,删除delete 替换replace,插入insertstring管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责3.1.2 stri
2020-09-15 21:52:39
158
原创 理解函数声明
以前一直对复杂声明不是很清楚,这次在书上看到接记录一下。一开始抛出这样一条令人生畏的语句:(*(void(*)())p)();其实并没有那么复杂,当我们看到如下的语句:(*pFunc)();我猜你一定能够识别得出这是在通过函数指针执行它指向的函数。再看如下:(void (*)())pFunc我猜你一定也看得出这是把变量 pFunc 强转为 void (*)() 型...
2020-05-05 14:52:34
234
原创 内存共享 - mmap
函数#include<sys/mman.h>/* 申请内存并映射 */void mmap(void *addr, size_t len, int prot,int flags, int fildes, off_t off)/* 同步数据 */int msync(void *addr, size_t len, int flags);/* 解除映射,并释放内存 */in...
2019-11-06 20:48:07
277
原创 有名信号量
信号量分两种,一种是无名信号量,一种是有名信号量。无名信号量一般用于线程间同步或互斥,而有名信号量一般用于进程间同步或互斥。它们的区别和管道及命名管道的区别类似,无名信号量则直接保存在内存中,而有名信号量要求创建一个文件。函数#include <fcntl.h>#include <sys/stat.h>#include <semaphore.h>...
2019-10-31 22:03:38
1908
2
原创 无名信号量
信号量广泛用于进程或线程间的同步和互斥(一般用于线程,进程间常用有名管道),信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞。PV 原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1。用于进程或线程间互斥:初始化信号量为1; 执行需要互...
2019-10-30 21:32:07
495
原创 线程-读写锁
当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读访问共享资源了,但是实际上多个线程同时读访问共享资源并不会导致问题。在对数据的读写操作中,更多的是读操作,写操作较少,例如对数据库数据的读写应用。为了满足当前能够允许...
2019-10-28 21:15:19
416
原创 线程互斥锁
当不同线程同时访问同一个数据时,如果不加任何处理的话,就可能出现数据错乱。用一个例子说明:#include<pthread.h>#include<stdio.h>#include<unistd.h>int num = 10;void* call_back1(void* arg){ num += 1; /* 假设这里执行了很多...
2019-10-17 20:04:36
426
原创 线程的私有数据
在多线程程序中,经常要用全局变量来实现多个函数间的数据共享。由于数据空间是共享的,因此全局变量也为所有线程共有。但有时应用程序设计中必要提供线程私有的全局变量,这个变量仅在线程中有效,但却可以跨过多个函数访问。比如在程序里可能需要每个线程维护一个链表,而会使用相同的函数来操作这个链表,最简单的方法就是使用同名而不同变量地址的线程相关数据结构。这样的数据结构可以由 Posix 线程库维护,成为线程私...
2019-10-16 20:36:53
865
原创 线程基础
进程是维护应用程序所需的各种资源,并不执行什么。而线程才是真正的执行实体。为了让进程完成一定的工作,进程必须至少包含一个线程。进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源,所以我们也说,进程是资源分配的最小单位。线程存在与进程当中,是操作系统调度执行的最小单位...
2019-10-14 21:32:59
167
原创 共享内存 --- shm
共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。其特点是:共享内存是进程间共享数据的一种最快的方法。一个进程向共享的内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。 使用共享内存要注意的是多个...
2019-09-03 22:08:44
2686
原创 消息队列
消息队列可用于两个完全不相关的进程间的通信,它有以下特点:消息队列可以实现消息的随机查询。消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取。 消息队列允许一个或多个进程向它写入或者读取消息。 与无名管道、命名管道一样,从消息队列中读出消息,消息队列中对应的数据都会被删除。 每个消息队列都有消息队列标识符,消息队列的标识符在整个系统中是唯一的。 消息队列是消息的链表,存放在内...
2019-09-02 22:31:06
571
原创 有名管道
无名管道只适用于有亲缘关系的进程间的通信,那么无亲缘关系的进程间如何通信呢?有名管道正是为了解决这个问题。有名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据。有名管道和无名管道...
2019-08-26 22:28:32
4153
原创 无名管道
特点1、半双工,数据在同一时刻只能在一个方向上流动。 2、数据只能从管道的一端写入,从另一端读出。同意进程可以访问管道两端,也可以自发自收。 3、写入管道中的数据遵循先入先出的规则。若连续写入多次再读出,则将多次写入的内容一并读出。 4、管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息等。 5、管道不是普通的文件,不属于某个文件系统,...
2019-08-25 11:32:14
496
原创 可靠信号的用法
signal() 函数只能提供简单的信号安装操作,使用该函数处理信号比较简单,只要把要处理的信号和处理函数列出即可。signal() 函数主要用于从 Unix 继承过来的不可靠、非实时信号的处理,并且不支持信号传递信息。Linux 提供了功能更强大的 sigaction() 函数,此函数可以用来检查和更改信号处理操作,可以支持可靠、实时信号的处理,并且支持信号传递信息。先看 kill() 的升...
2019-08-05 22:48:14
266
原创 信号集与信号阻塞集
信号集有时候一个进程需要对多个信号进行处理,如果一个一个信号去判断,那会很蛋疼。我们可以用信号集来很好地解决这个蛋疼的问题。顾名思义,信号集是一个信号集合。数据类型为 sigset_t . 对信号集的操作主要有一下几个函数:#include <signal.h> int sigemptyset(sigset_t *set); int sigfillset(sigset...
2019-08-05 22:23:36
378
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人