快讯:AMD正在招聘有Rust经验的图形驱动工程师
AMD公司的驱动开发团队是较小的团队,为他们的Radeon显卡提供工具平台。这包括Radeon内存可视化软件、图形卡分析软件和Radeon开发者面板软件。当开发的需求提高,这些软件的数量也会变多。AMD公司希望找到有立体图形学和Rust经验、能适应多团队协同工作的开发者。
快讯:Debian系统稳定版已经附带安装rustc的1.41.1版本
rust-analyzer发布第四十四期更新公告
知名的语言分析软件rust-analyzer发布了更新公告。本次更新包括许多新功能,包括帮你填写借用符号的函数名补全,从GitHub帮助收集已发布版本的信息,以及添加了新的与dbg!宏有关很方便的补全。本次更新还包括诸多内部改进,包括为内部代码添加更多文档,以便贡献者修改代码和开展工作。
《ESP32、ESP8266与Rust语言:建造生态圈》
博主斯科特·玛彬发布了这篇博客文章,阐述他和社区成员一起工作,为ESP32、ESP8266芯片的Rust支持做贡献工作的经历。ESP8266芯片,是全球化的芯片生产商乐鑫公司生产的明星产品,它是性价比的无线连接单片机,能提供适用于物联网、安防领域的解决方案。作者从今年一月就启动了对该系列芯片的支持工作,大量近期的技术更新,也让作者有更进一步的进展。
ESP8266拥有较为特殊的Xtensa指令集,这也决定了编译器rustc需要有进一步的工作。作者做了代码的清扫和整理工作,来更快地更新Xtensa指令集所需的编译器模块。目前的Rust编译器rustc和基础设施LLVM的更新有紧密的关系,作者也在推动这个指令集更新到LLVM的主分支里去。作者特别提到,乐鑫公司非常乐于解答开源社区的问题,经常帮助修复软件漏洞和解决问题。作者给出了一个在Linux平台可以使用的rustc编译版,它包括了Xtensa指令集的支持。
和许多公司的芯片相似,ESP系列的芯片有特定的烧录流程。厂家给出的流程是以Python脚本的形式提供的。@icewind1991和@jessebraham两位社区成员帮助了作者,分别整理Python脚本到Rust项目,以及提供cargo适用的接口,这有助于搭建完备的烧录工具链。现在,用户只需要一行命令,就可以向ESP系列的芯片里,烧录编译好的Rust程序。这对敏捷开发是非常有好处的,作者也更新了更多的功能,做了提升烧录速度的诸多优化过程。
Rust嵌入式社区提供了完整的裸机开发架构:这由外设访问库、硬件中间层库和运行时库组成。通常情况下,外设访问库是由SVD文件生成的。乐鑫公司提供了自己的称为IDF的外设索引格式;作者开发了idf2svd项目,将它转换为SVD格式,以便更快适应Rust嵌入式的生态。作者提到,有了SVD文件,用户就可以调试ESP8266上运行的程序了。因为Xtensa指令集特殊的特点,作者专门开发了适用于它的运行时库,和其它库一样,都把功能归纳到标签宏,这样能精简很多开发流程,包括时钟在内的外设就可以使用了。
如果说外设访问库可以机器生成,那么硬件中间层库,便是支持库开发中最需要开发者理解、花功夫的部分。作者在这段时间里,开发了ESP32、ESP8266两种芯片的支持库。社区成员@arjanmels做了一些开拓性的工作,作者随后完成了大量ESP32芯片的开发例子,这些例子都是可以实际运行的。ESP8266的支持库也是由社区成员完成的,和ESP32不同,乐鑫只提供编译好的二进制代码,所以需要由这些二进制代码逆向得到。“虽然这挺有趣的,”作者提到,“但是比从源代码翻阅着写会难很多。”作者完成了大量外设的支持工作,已经开源到esp-rs社区里面了。
为了引导新手快速开发,作者很早就编写了一系列入门文章。随着编译器、支持库的修改和优化,在随后的时间里,作者不厌其烦地修订文章,以便满足最新版本的开发需求。这些修改包括LLVM的条件变多了,从自己编译到能在rustup里安装,也包括能同时在两款芯片上编译运行的程序样例。作者希望未来,Xtensa能作为广泛支持的目标,他的工作能用在未来可能出现的新芯片上。
相比今年初的工作,作者得到了更多的成果。作者在文章最后,感谢了所有的社区志愿者。作者希望,未来WiFi和蓝牙的支持能继续完善,最后能适配到Tock、RTIC等许多社区成熟的裸机运行环境里去。
《所以……你想要热更新Rust代码?》
博主fasterthanlime发布了这篇文章。他希望解决文件会被修改的前提下,动态重载链接库的问题。链接库不能单独工作,应该和具体的应用程序一起工作,我们需要导入符号,由操作系统寻找函数的调用位置。
文章中,博主详细阐述了动态链接库的创建和应用方法,并用C和Rust两门编程语言具体举例。Rust语言中,要链接静态链接库,需要给编译器提供编译参数。为了链接动态链接库,需要找到操作系统提供的函数,然后调用这些函数完成过程。需要先打开链接库,传入一些操作系统能读取的字符串作为参数。这样能把返回的值转换为函数指针,以便后续的调用过程。所有的都结束后,应当使用特殊的函数关闭这个链接库。
作者给出了Linux系统的例子,很显然我们想把它推广到各大主流的操作系统。社区已经为我们造好了轮子——libloading,适用于常见的操作系统。用这款库之后,我们能轻松运用Rust语言的所有权特性,帮助我们自动打开关闭链接库,还能方便地把函数从库里导出,以便调用。包括返回的值也是Result类型,这将帮助我们处理文件、符号不存在等等问题。
动态链接库可以用C语言写,当然Rust也能写。将Rust函数使用extern关键字导出,就能在其它语言里访问这个函数。要配置为动态链接库,还需要修改Cargo.toml配置文件里的部分内容,包括它的包名称和包类型。这样Rust写的静态库就能被Rust程序访问了。你想的没错——它也能被C语言程序访问,这是Rust语言在兼容性上非常有优势的一点。
在加载、使用链接库之后,还有一个释放过程。我们很容易联想到,释放之后,这个库是否再能被使用一次。作者在这里花费了大量的调试时间,需要注意的是,打开链接库的函数可能被调用多次;这之后的关闭过程,只会降低引用计数。如果要真正关闭这个库,需要引用计数为零,加载时的参数需要满足条件,而且不能被其它链接库同时使用。
作者做的工程设计是,先暂停所有的线程,遍历正在使用这个库的线程,取消它们,就能关闭这个库了。这需要可执行文件的代码挂钩一个特殊的函数,它在线程结束时需要完成一些工作。这之后,就可以再加载一次需要的Rust链接库了。作者通过分析工具,找到了这个过程中的内存泄漏问题,最终就能完成手动的重载流程。
以上的还是手动的过程,要自动重载代码,需要使用特别的notify库。这个库能跟踪系统中依赖库的变化情况,及时给出反应;这样就能实现自动重载代码了。作者把这些功能包装到了专门的插件系统,最终我们就能为代码编写插件,而且在插件变化时,自动重载这个插件。基于这样的成果,作者实现了有趣的例子,能实时更新图形卡渲染程序的一部分,来在屏幕上画出不同的图形。
作者用两周的时间完成了这篇文章,完成在Linux下的整个流程。作者把在Windows和macOS下的软件支持留给读者,这两者和Linux都有一定的区别和独特之处。作者最后感谢了所有支持他的粉丝和捐助者们,没有他们,作者就不能完成这篇文章。
《制霸Web、易学易挣——2021年的Rust》
作者richardanaya给出了他对2021年Rust语言发展的看法。作者认为,网页汇编WebAssembly的支持将会进一步发展,演化出除了LLVM之外的其它后端。常量语法希望有更大的进展,能在编写类似于模板的语法时展现出灵活性。另外,越来越多的朋友将会选择Rust作为自己的第一门语言。更多与Rust有关的基金会和组织也将成立,接受资助,开发更多开源项目。Rust应该和JavaScript等其它语言共同协作,从控制台程序转换到其它的呈现形式去。
femtovg:Canvas2D渲染接口,纯Rust开发
这是一款抗锯齿的平面矢量图形绘制库,是由nanovg项目重写而来的。作者从原有的C语言代码修复了漏洞,重新组织项目,以符合Rust语言的标准和需求。在项目主页上,作者给出了包括文字、图形和图像在内的功能展示,列出了支持的所有功能,和仍然需要开发的功能。项目使用Apache、MIT双协议开源,示例中使用了基于其它开源协议的字体和资源。
From 日报小组 洛佳
社区学习交流平台订阅:
评论区
写评论还没有评论