- 主题:51不出门瞎逛,在家看了一遍rust,感觉不可能替代C吧
你这段代码的局限就是你还是认为我在发送一串“数据”
可能我的场景的确很小众
本来我是用一块Si24R连在UART上收发我一台机器的运行数据,现场工人就不用拆机器盖,连上线,导出数据了(场景特殊,不能在机器上开个口子做个USB或者其他接口,必须经常性密封)
自从受到@spadger大神bootloader的启发,我现在程序代码有时候也用这种无线方法更新,于是就有了经常有整型浮点必须混合发送
不过的确,那个比喻很传神,田园时代和现在不一样,哎~
【 在 lvsoft 的大作中提到: 】
: 不高端。我本来想收台工业级的3d打印机回来改造的。好不容易有台看中的聊了半天人家又不卖了。
: 一怒之下找个比较好的开源方案先搭起来后面再改造。
: 你这个学了一天也没法多要求你什么...rust确实学习曲线还是比较陡的...
: ...................
--
FROM 180.116.135.*

【 在 dismoon 的大作中提到: 】
: 你这段代码的局限就是你还是认为我在发送一串“数据”
: 可能我的场景的确很小众
: 本来我是用一块Si24R连在UART上收发我一台机器的运行数据,现场工人就不用拆机器盖,连上线,导出数据了(场景特殊,不能在机器上开个口子做个USB或者其他接口,必须经常性密封)
: ...................
--
FROM 180.111.26.*
因为其实mcu场合用rust也挺舒服的。
国外在爱好者群体里这已经是个很显著的趋势了。
【 在 creek 的大作中提到: 】
: 赞。为啥在电路板讨论这么高层的rust,相对底层的电路而言?
:
--
FROM 180.111.26.*
最主要是MCU场合rust的工具链不好吧
我没说rust不能实现我的需求,我就是说,我本来好好的用一个强制double的地址赋值给char就能得到数据内存所在的指针,rust要绕一大圈脱几条裤子才能实现,unsafe就是那几条裤子
【 在 lvsoft 的大作中提到: 】
: 因为其实mcu场合用rust也挺舒服的。
: 国外在爱好者群体里这已经是个很显著的趋势了。
:
--
FROM 180.116.135.*
rust就不是给MCU用的,MCU最直接就是用显性指针,而不是隐性指针,安全特性对于MCU完全没有用。
【 在 dismoon 的大作中提到: 】
: 最主要是MCU场合rust的工具链不好吧
: 我没说rust不能实现我的需求,我就是说,我本来好好的用一个强制double的地址赋值给char就能得到数据内存所在的指针,rust要绕一大圈脱几条裤子才能实现,unsafe就是那几条裤子
:
--
FROM 14.223.161.*
again,不需要绕大圈脱裤子,lvsoft说的union可能麻烦些,我说的mem::transmute基本等同于c的写法,没啥问题。
rust的门槛,第一在于对所有权和生命周期的理解,然后第二就在于对标准库的熟悉了,有时候得背标准库。mem下的一大堆东西,option result下的一大堆东西,你不熟悉就会觉得各种别扭
【 在 dismoon 的大作中提到: 】
: 最主要是MCU场合rust的工具链不好吧
: 我没说rust不能实现我的需求,我就是说,我本来好好的用一个强制double的地址赋值给char就能得到数据内存所在的指针,rust要绕一大圈脱几条裤子才能实现,unsafe就是那几条裤子
--
FROM 123.120.197.*
mcu场合rust的工具链没啥不好的啊。我之前就介绍过,
比如st那个用c写的跟shit一样的hal库...跟rust对比就是天上地下。
只有具备rust这样强大的抽象能力之后,才有可能写出真正有价值的hal库。
比如你看看这里的example:
https://github.com/stm32-rs/stm32f4xx-hal/tree/master/examples
我贴个pwm的:
#![deny(unsafe_code)]
#![no_main]
#![no_std]
// Halt on panic
use panic_halt as _;
use cortex_m_rt::entry;
use stm32f4xx_hal::{
pac,
prelude::*,
timer::{Channel1, Channel2},
};
#[entry]
fn main() -> ! {
if let Some(dp) = pac::Peripherals::take() {
// Set up the system clock.
let rcc = dp.RCC.constrain();
let clocks = rcc.cfgr.freeze();
let gpioa = dp.GPIOA.split();
let channels = (Channel1::new(gpioa.pa8), Channel2::new(gpioa.pa9));
let pwm = dp.TIM1.pwm_hz(channels, 20.kHz(), &clocks).split();
let (mut ch1, _ch2) = pwm;
let max_duty = ch1.get_max_duty();
ch1.set_duty(max_duty / 2);
ch1.enable();
}
loop {
cortex_m::asm::nop();
}
}
这才是写给人看的代码。
最后,如果你想用新的工具,享受它带来的好处,那首先是你得要用新的姿势去使用新工具。
比如给你一台联合收割机,你非说喜欢用镰刀亲自一茬茬割的感觉,用联合收割机又要加油又要维护启动半天就割一亩地是脱裤子放屁...那这个确实没啥办法,只能说你不需要联合收割机...
【 在 dismoon 的大作中提到: 】
: 最主要是MCU场合rust的工具链不好吧
: 我没说rust不能实现我的需求,我就是说,我本来好好的用一个强制double的地址赋值给char就能得到数据内存所在的指针,rust要绕一大圈脱几条裤子才能实现,unsafe就是那几条裤子
:
--
修改:lvsoft FROM 180.111.26.*
FROM 180.111.26.*
option result这些其实其他比较新的编程语言用多了也是很自然的。
不过,这些确实也是很容易被当成脱裤子放屁的地方...
我只能说,众多编程语言都演化成这种相似的模式不是没有道理的。
至于熟悉问题嘛,用多了自然就熟悉了,关键是要用起来。
【 在 beep 的大作中提到: 】
: again,不需要绕大圈脱裤子,lvsoft说的union可能麻烦些,我说的mem::transmute基本等同于c的写法,没啥问题。
: rust的门槛,第一在于对所有权和生命周期的理解,然后第二就在于对标准库的熟悉了,有时候得背标准库。mem下的一大堆东西,option result下的一大堆东西,你不熟悉就会觉得各种别扭
:
--
修改:lvsoft FROM 180.111.26.*
FROM 180.111.26.*
rust其中的一个目标是跟c同等地位,也即c能做的rust一定能做。
就说指针好了,mcu里的寄存器全部都是定义一串地址偏移量的指针。c里面都是一个头文件里面裸地址直接写在上面然后强制转换成指针。
rust当然也可以这么写,但给rust做hal库的人每这么做。他们的做法要安全并且严格的多。它利用rust的宏特性直接导入mcu厂方给出的svd文件。除非你去改svd,否则压根不存在改错的可能。当然,厂方也是会犯错的,所以这个导入svd文件的功能还有patch能力,可以按需要导入base svd,patch svd等等。
然后,因为是svd文件,所以rust对寄存器的操作可以精确到每一个bit的可读写性,以及humanreadable的可读性,和对每一个bit都有注释的完整文档。
比如同一个bit,读出来的值和写入的值的名字都是不一样的。比如读出来叫enabled,写进去得写enable,你如果写enabled直接就一根红线画上去提示你这里不对了。
至于安全特性对mcu是否有用,我只能说这就是嵌入式行业明明发展的时间和软件行业差不多久,应用规模也差不多大,但为啥生态规模相比之下小的可以忽略不计。就是因为大家都缺乏这种合作的思想,都满足于自己的一亩三分地,重复造自己的那个小轮子。自己在家做轮子,当然不需要上下游产业链配套了。而当你需要依赖生态的时候,安全特性就是相当重要的问题。
说到生态的问题,这里一个典型的案例就是arduino。刚出来的时候我也瞧不上arduino。但发展到现在arduino已经有了非常丰富的生态,现在很多时候,我自己都是更倾向于用arduino直接搞定的,这就是生态的威力。
【 在 Oriphia 的大作中提到: 】
: rust就不是给MCU用的,MCU最直接就是用显性指针,而不是隐性指针,安全特性对于MCU完全没有用。
:
--
修改:lvsoft FROM 180.111.26.*
FROM 180.111.26.*
C的显性指针明显更加直观易用,如果rust算有指针,那JAVA也有指针,这些隐性的指针对寄存器操作没有何任的易用性可言,如果我没记错,ESP32的SVD文件就有高达4万行,本质上是一本字典。我觉得在C语言环境做这种字典也是可以的,但既然C有显性的指针,svd就变成画蛇添足。
安全特性对于多任务系统中,不同程序之间的内存管理的确更安全,问题MCU的ROM本身只是一个程序,MCU的程序开发多数情况又是一个人完成。安全性就相当于偷窃我的人是我自己,没有半点意义。
【 在 lvsoft 的大作中提到: 】
: rust其中的一个目标是跟c同等地位,也即c能做的rust一定能做。
: 就说指针好了,mcu里的寄存器全部都是定义一串地址偏移量的指针。c里面都是一个头文件里面裸地址直接写在上面然后强制转换成指针。
: rust当然也可以这么写,但给rust做hal库的人每这么做。他们的做法要安全并且严格的多。它利用rust的宏特性直接导入mcu厂方给出的svd文件。除非你去改svd,否则压根不存在改错的可能。当然,厂方也是会犯错的,所以这个导入svd文件的功能还有patch能力,可以按需要导入base svd,patch svd等等。
: ...................
--
FROM 14.223.161.*