![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Rust学习笔记
文章平均质量分 76
小鱼编程
越努力,越幸运
展开
-
一文解决Rust字符串:String,str,&String,&str,CString,CStr
而str是一个不可变的固定长度的字符串,如果是从String解引用而来的,则指向堆上,如果是字面值,则指向静态内存。在Rust中,s的类型是&str,而“abcd”是str类型,这里的“abcd”就是字符串字面值,存放在Stack上的。s 是切片,切片是一个结构体,包含两个字段,一个是指向数据的指针,另一个是数据的长度。和CStr表示从C中来,rust不拥有归属权的字符串相反,CString表示由rust分配,Rust拥有所有权,可以进行修改,用以传给C程序的字符串。表示的类型有很多种。原创 2023-02-21 15:36:36 · 3214 阅读 · 1 评论 -
Rust编程细节知识点拾遗
通过mpsc::channel创建通道,是多个生产者,单个消费者。通过spmc::channel创建通道spmc是一个生产者,多个消费者。原创 2023-02-21 11:15:04 · 756 阅读 · 0 评论 -
用Rust写一个链表,非常详细,一遍看懂
在Rust里写一个链表可不是一件容易的事,涉及到很多的知识点,需要熟练掌握之后才能写出一个不错的链表。这篇文章主要介绍了如何写一个Rust链表,并且补充了涉及到的很多的额外知识点,尤其是所有权问题。首先,你需要明白,为什么Rust链表难写,同样的为什么C实现简单一点呢?只能有一个引用!!!这是最关键的,然后就是Rust中是没有NULL指针的,这就需要用到Option枚举,在编译阶段必须知道类型的大小,这就需要使用Box智能指针。在C语言实现一个简单的链表,可以这样写:这段代码里面,head和new原创 2022-12-03 18:38:32 · 3611 阅读 · 1 评论 -
Rust(trait、Box指针、自动化测试、迭代器)
当把某类型的引用传递给函数或方法时,但它的类型与定义的参数类型不匹配,Deref Coercion就会自动发生,编译器会对deref进行一系列调用,转化为合适的类型,在编译时完成,没有额外的性能开销。()宏,进行格式化,format和println有区别,一个是格式化,一个是打印。原创 2022-11-17 09:46:28 · 1104 阅读 · 0 评论 -
Rust中级教程:指针生态(引用、原始指针、智能指针)and内存操作(Stack、Heap)
变量的高级模型:当变量被访问的时候,可以从变量的上次访问到这次访问画一条线,从而在两次访问之间建立了依赖关系。如果变量没有被初始化,或者变量被移动了,就不能从它那画线了。使用这种模型,程序会出现很多的依赖关系,依赖线,叫做flow。每个flow都在追踪一个值的特定实例的生命周期,当有分支存在的时候,flow可能分叉或合并,每个分成都在追逐该值的不同生命周期。在程序中的任何给定点,编译器可以检查所有的flow是否相互兼容、并行存在。例如:一个值不可能有两个具体可变访问的并行flow;原创 2022-11-16 16:16:27 · 1763 阅读 · 1 评论 -
用Rust实现grep操作
这次的Rust练习是写一个linux命令的grep的操作,代码中有详细的注释。原创 2022-11-01 15:41:11 · 396 阅读 · 1 评论 -
Rust嵌入式开发开源环境概览(零散的一些知识点)
往上是PAC(外围设备通道库)和Cortex内核相关的库,这两个是同时存在的, PAC库操作的是关于外设的寄存器,微处理架构库操作的是关于架构的寄存器。嵌入式开发的最基本最底层的工作,就是读写寄存器,因此,PAC是整个开发中最基础的组件,PAC代码重复度很高,且有非常规范的格式,人工编写麻烦,所以PAC代码往往由工具自动生成,svd2rust就是这样一个工具。连接器:使用LLVM的lld工具,在嵌入式开发中,需要提供自己的链接脚本,通常以.x为后缀的文件。左边是代码的依赖关系,右边是开发的环境。原创 2022-10-14 16:03:44 · 2215 阅读 · 2 评论 -
Rust嵌入式编程---#![no_std]和中断处理
上一节讲了一下异常处理和panic处理,中断在各种方面与异常不同,但它们的操作和使用在很大程度上是相似的,并且它们也由相同的中断控制器处理。虽然异常是由Cortex-M架构定义的,但中断在命名和功能上始终是供应商(甚至通常是芯片)特定的实现。以下是详细的中断处理代码,其实和异常处理差别不大,但是后面后期的改进空间比较大,功能会更多一些。2.中断可以嵌套和抢占,即中断处理程序的执行可能会被另一个优先级较高的中断中断。3.通常,需要清除导致中断触发的原因,以防止无休止地重新进入中断处理程序。原创 2022-09-29 14:36:45 · 786 阅读 · 0 评论 -
Rust嵌入式编程---panic处理和异常处理
异常意味着抢占,并涉及异常处理程序,即响应触发事件的信号而执行的子例程,这就是和。是硬件上的,而panic理解成软件上的,比如访问文件不存在啊、访问越界啊、除0操作等等,而且panic一般没有那么多处理方式,没有抢占和触发panic处理程序等等。在标准库(Std)中,panic有一个定义的行为:它展开 panic 线程的堆栈,除非用户选择在 panic 时中止程序,否则会进行错误位置的一个堆栈定位。该值是发生异常时程序计数器的值,它指向触发异常的指令,所以可以看一下pc的值指向的指令就是错误的地方。原创 2022-09-29 11:31:11 · 1510 阅读 · 0 评论 -
Rust嵌入式编程---动态内存分配器(Vec,String等)
本教程不是0基础的Rust嵌入式编程,需要有一定的Rust裸机编程的基础知识。作为一个比较接近C的例子,适合入门,代码比较容易理解。本次例子使用的是target = “thumbv8m.main-none-eabihf” # Cortex-M33 (with FPU)平台进行编译,生成的二进制文件在Qemu模拟器中运行。嵌入式系统编程是不能使用Rust的Std库的,只能使用它的子库:core。以及一些cortex库还有导入的一些外部库,看代码例子即可。原创 2022-09-28 17:50:47 · 1309 阅读 · 0 评论 -
Rust中的输入输出格式变化(非常详细)
使用 trim() 去除多余的符号,例如回车号,然后使用 parse() 来做数据转换。原创 2022-09-14 16:52:28 · 771 阅读 · 0 评论 -
Rust中FFI编程知识点整理总结
这个工具就是将写好的Rust代码配置一下,然后会自动生成接口代码头文件等等。其实,FFI封装、转换,熟悉了之后,知识点就那些,模式也比较固定,如果接口量很大,那就需要大量重复的 coding。量一大,人手动绑定出错的机率也大。所以这种辅助工具的意义就显露出来了。基于辅助工具生成的代码,如不完美,再适当手动修一修,几下就能搞定,大大提高生产效率。原创 2022-09-11 16:37:12 · 1577 阅读 · 0 评论 -
C中分配堆栈,Rust中填充使用
也就是说,Rust 这边,它就认 C 的指针,而不管这个指针是从哪里来,栈也好,堆也好,甚至其它地址的指针也好,对 Rust 来说,其实都一样(本质上都是内存指针)。2.C代码中是一个生成一个结构体数组,传入数组名,这边用结构体指针进行接收,传数组之前说过需要告知长度,s就是可变切片类型,另一个打印不需要可变类型,这里注意Rust对于可变不可变做了很不同的使用方式。1.这里的传递方式和上面还是一样的,只是这里的C语言部分,自己做了个申请,,定义了一个返回结构体指针的函数,这边的堆释放需要手动完成。原创 2022-09-07 15:46:23 · 301 阅读 · 0 评论 -
Rust-FFI复杂参数传递处理方式2--字符和字符串类型
使用std::ffi::CStr提供的from_ptr方法包装 C 的字符串指针,它基于空字符’\0’来计算字符串的长度,并可以通过它将外部 C 字符串转换为 Rust 的 &str和String。和CStr表示从C中来,rust不拥有归属权的字符串相反,CString表示由rust分配,Rust拥有所有权,可以进行修改,用以传给C程序的字符串。我们必须确保 C 中的字符串是有效的UTF-8编码,且引用字符串的指针不能为 NULL,因为 Rust 的引用不允许为 NULL。...原创 2022-09-01 11:40:16 · 1073 阅读 · 0 评论 -
Rust-FFI复杂参数传递处理方式1--数组类型
2.C语言和Rust的相互调用,最核心的就是指针的操作,两边的代码使用的是同一个程序栈,栈上的指针能放心地传递,而不用担心被错误释放的问题(栈上内存被调用规则自动管理,C和Rust中都是如此)。两边的代码可能使用不同的堆分配器,因此,堆上的指针的传递需要严格注意,需要各自管理各自的资源,谁创建谁释放,指针传递过程中,需要分析所有权问题。栈和堆的操作是不同的,这里一定要注意。1.对于数组的传递,分成了两个部分,一个是数组地址指针的传递(首元素指针),另一个是数组的长度(即元素的个数,非字节数)。...原创 2022-09-01 11:39:20 · 1323 阅读 · 0 评论 -
C语言和Rust语言的互相调用(2)(Rust调用C)
rust语言调用c语言,写的比较详细。原创 2022-08-26 14:38:57 · 3457 阅读 · 0 评论 -
C语言和Rust语言的互相调用(1)(C调用Rust)
C语言和rust的相互调用,非常清晰。原创 2022-08-22 16:42:08 · 4033 阅读 · 1 评论 -
Rust:多线程并发编程
C/C++语言在操作系统的最底层也支持多线程,且语言本身以及其编译器不具备侦察和避免并行错误的能力,这对于开发者来说压力很大,开发者需要花费大量的精力避免发生错误。move闭包通常和threadspawn函数一起使用,它允许你使用其它线程的数据,创建线程时,把值的所有权从一个线程转移到另一个线程。可以使用join()方法来等待线程的完成,会阻止当前线程的运行,知道handle所表示的线程的终结。线程不同于进程(process)的地方是线程是程序以内的概念,程序往往是在一个进程中执行的。...原创 2022-08-01 11:42:10 · 1318 阅读 · 0 评论 -
Rust泛型、特征、生命周期
无原创 2022-07-12 15:26:23 · 303 阅读 · 1 评论 -
Rust编程:组织管理和错误处理
1.Pacakge包含一个Cargo.toml(就是通过cargo new 出来的),它描述了如何构建Crates。只能包含0-1个library crate,可以包含任意多个binary crate,但是必须至少包含一个crate(二者都可)。2.crate的类型有两种(binary和library),还有一个crate root,这个是rustc编译器开始编译的地方。其中main.rs就是入口文件。src/main.rs是binary crate的crate root。如果还有个src/lib.rs,那原创 2022-07-06 18:15:23 · 420 阅读 · 1 评论 -
Rust集合类型(vector,string,hashmap)
1.只能存储相同类型的数据,在内存中是连续存放,往vector里面添加元素时,可能这块地方不够,换个地方存储,所以你借用(引用)之后就不能修改vector。2.vector的创建:这是一个空的vector,需要指明数据具体格式。使用初始值的方式创建:使用vec!宏。3.更新vector,向里面添加元素,使用push的方法。删除vector:vector也有作用域,超出范围就会删除。4.读取vector的元素:有引用和get()方法5.遍历vector的值。6.vector+enum的实例使用en原创 2022-07-03 10:37:49 · 559 阅读 · 1 评论 -
Rust字符串切片、结构体和枚举类
上图解释了字符串切片的原理。其中,“…”这个符号需要了解一下,x…y表示[x,y)的含义。…y表示0~y。x…表示x到结束,…表示开始到结尾。有两个字符串类型我们在这里区分一下:str和string类型。凡是用双引号包括的字符串常量整体的类型性质都是 str:let s=“loot”;String 类型是 Rust 标准公共库提供的一种数据类型,它的功能更完善——它支持字符串的追加、清空等实用的操作。String 和 str 除了同样拥有一个字符开始位置属性和一个字符串长度属性以外还有一个容量(cap原创 2022-06-30 17:25:40 · 761 阅读 · 1 评论 -
Rust所有权(非常重要)
移动(move): 多个变量可以在 Rust 中以不同的方式与相同的数据交互这里的数据是基本数据类型,所以不需要存到堆中,只在栈中复制和移动。基本数据类型:1.所有整数类型,例如 i32 、 u32 、 i64 等。2.布尔类型 bool,值为 true 或 false 。3.所有浮点类型,f32 和 f64。4.字符类型 char。5.仅包含以上类型数据的元组(Tuples)。如果发生的情况在堆里面,就会不一样:此处hello需要存在堆里面,后面释放的时候,并不会释放两次,因为s2=s1原创 2022-06-30 14:09:30 · 371 阅读 · 1 评论