- 主题:小新不懂就问:自己设计的开发板固件怎么搞定的? (转载)
【 以下文字转载自 Programming 讨论区 】
发信人: hgoldfish (老鱼), 信区: Programming
标 题: Re: 小新不懂就问:自己设计的开发板固件怎么搞定的?
发信站: 水木社区 (Sat Jan 6 01:21:27 2024), 站内
发信人: lvsoft (Lv(The Last Guardian)), 信区: Circuit
标 题: Re: 小新不懂就问:自己设计的开发板固件怎么搞定的?
发信站: 水木社区 (Fri Jan 5 23:37:04 2024), 站内
我又忍不住又要来安利rust了...
我最近通过一个项目已经基本完全迁移到rust上开发了。
目前在手撸一个运控。
我是感觉到rust的抽象能力实在是太爽了,比如我是先定义mm,um,丝,inch等公制,英制单位,(注意丝这个单位英文里没有对应的单词,于是我直接用了中文...)
比如驱动频率有hz,khz,mhz。旋转运动有rpm,feedrate有mm/min,ipm等单位...
写死之后基本上不可能出错。因为整个系统不允许任何出现无量纲的数字...
比如设定电机转速得写成set_rotary_speed(3000.rpm()),不能直接写个3000进去。
比如pwm频率得写成10.khz(),不能直接写10000。
然后位置也有量纲的区分,比如move_to如果传的是Position(100.mm())表示绝对定位100mm,如果没有做过homing就会报错。
但如果没有做过homing,可以传Displacement(100.mm()),表示从当前位置开始算的相对位移,
然后不仅传入的数字不允许出现无量纲,这些单位的内部是否可以计算,计算的结果也被我定义了的单位,比如Position-Position得到Distance等等,这样不管是外部使用还是内部写逻辑,都不太可能写错。
最后回到rtos的问题。rust有个框架叫RTIC,用async/await的形式直接就提供了异步支持,直接拿来用就行了:
#[task(
priority = 2,
shared = [led],
local = [tog: bool = true],
)]
async fn heartbeat(mut c: heartbeat::Context) {
loop {
info!("heartbeat, tog = {}", *c.local.tog);
if *c.local.tog {
c.shared.led.lock(|l| l.set_high().unwrap());
} else {
c.shared.led.lock(|l| l.set_low().unwrap());
}
*c.local.tog = !*c.local.tog;
rtic_monotonics::systick::Systick::delay(500.millis()).await;
}
}
#[task(
priority = 1,
shared = [timer, cap_displacement_sensor],
)]
async fn displacement_update(mut c: displacement_update::Context) {
loop {
let now = c.shared.timer.lock(|timer| timer.get_counter());
info!("now = {}", now.ticks());
c.shared.cap_displacement_sensor.lock(|cds| {
info!("{:?}", cds.read_spi_and_feed(now));
});
// Period to read the displacement.
rtic_monotonics::systick::Systick::delay(10.millis()).await;
}
}
总的来说,这个就叫降维打击,实在是太爽了。rust会逼着你去思考,逼着你只能写出正确的逻辑,逼着你只能写出正确的代码。
比如上面的代码有很多unwrap,看着很丑。这种丑就是rust在逼你把代码写成带错误处理的模式。
因为我目前故障处理这块还没做完,所以先unwrap跑起来再说。但等把所有的故障都规划好设计好,并把代码都改成带故障处理的模式之后,这些unwrap就不会再存在了。
最主要的是,我前几年尝试切rust,每次都被它陡峭的学习曲线打击了,导致半途而废。但现在有chatgpt,有啥不懂得直接请教ai就行了。学rust难度降低了一个数量级,现在转真心不是什么问题了。
【 在 dismoon 的大作中提到: 】
: 我都底层C重写了一遍类RTOS,写固件是个问题?
:
--
修改:lvsoft FROM 121.225.189.*
FROM 121.225.189.*
哈,rust在硬件方面也有粉丝了
【 在 beep 的大作中提到: 】
: 【 以下文字转载自 Programming 讨论区 】
: 发信人: hgoldfish (老鱼), 信区: Programming
: 标 题: Re: 小新不懂就问:自己设计的开发板固件怎么搞定的?
: ...................
--
FROM 222.65.123.*
看着已经爽起来了。
一直阻挡我用Rust开发硬件的第一道拦路虎,板子不是通用的,没有bsp;芯片不是常用的,不提供svd,只有古老的sdk,sdk需要配合类似cmsis才能用的。 这种情况一般要怎么才能用起来Rust?之前查过很久,不得其解
【 在 beep 的大作中提到: 】
: 发信人: hgoldfish (老鱼), 信区: Programming
: 标 题: Re: 小新不懂就问:自己设计的开发板固件怎么搞定的?
: 发信站: 水木社区 (Sat Jan 6 01:21:27 2024), 站内
: ...................
--
FROM 1.202.157.*
这些sdk之类的是不是纯C写的,是的话,rust用起来应该问题不大,无非是一堆unsafe abi
【 在 AlphaO 的大作中提到: 】
: 看着已经爽起来了。
: 一直阻挡我用Rust开发硬件的第一道拦路虎,板子不是通用的,没有bsp;芯片不是常用的,不提供svd,只有古老的sdk,sdk需要配合类似cmsis才能用的。 这种情况一般要怎么才能用起来Rust?之前查过很久,不得其解
--
FROM 114.92.200.*
感觉这么绑定后,感觉用Rust的意义会变小好多?
我还有个需求,就是想在FPGA构建的软处理器上用Rust,可之前试了下,匹配不上这种处理器正确对应的target,难道没好办法了?
【 在 RunningOn 的大作中提到: 】
: 这些sdk之类的是不是纯C写的,是的话,rust用起来应该问题不大,无非是一堆unsafe abi
:
--
FROM 1.202.157.*
推荐rp2040入门,其实我这次也是第一次用rust+第一次用rp2040这颗芯片。
之前我用rust在stm32上勉强完成了一个helloworld级项目,干的不是很成功,但这次这个项目有足够的复杂度了。还是得感叹ai辅助确实给力,学习起来容易多了。
【 在 AlphaO 的大作中提到: 】
: 看着已经爽起来了。
: 一直阻挡我用Rust开发硬件的第一道拦路虎,板子不是通用的,没有bsp;芯片不是常用的,不提供svd,只有古老的sdk,sdk需要配合类似cmsis才能用的。 这种情况一般要怎么才能用起来Rust?之前查过很久,不得其解
:
--
FROM 117.89.220.*
挺好,rp2040有hal和pac,用Rust会很爽,stm32调研过也是全部支持。像这种需求和支持吻合的就很幸福,可以很爽的开发超高性能的嵌入式软件。
但我们这种,硬件设计在前,软件设计在后。硬件选的芯片都很小众,便宜/低功耗/可靠/恰好够用,通常也意味着古老,没有pac,芯片找不到svd,很难受。有时用软核,这种软核架构甚至(调研和尝试发现)不是标准的arm、risv、x86,意味着编译时找不到对应的target。之前半年我断断续续调研了几次,都没找到这种情况该如何做,现在被迫用C去写里面的软件代码。
如果您知道或者研究到解决方案,还请不吝赐教,解我困扰。具体问题如下:比如常用的两类,一个是类似Microchip Smartfusion2,上面虽然有硬核但google怎么也找不到svd或等价的pac描述文件;另一个是Xilinx 7系列上面的Microblaze软核,虽然看描述是risc架构,但用risc和arm写lib给它调用都无法识别,只有x86的才能识别到lib却仍读不到函数,怪的很,而且Xilinx里导不出svd或等价的pac描述文件。
【 在 lvsoft 的大作中提到: 】
: 推荐rp2040入门,其实我这次也是第一次用rust+第一次用rp2040这颗芯片。
: 之前我用rust在stm32上勉强完成了一个helloworld级项目,干的不是很成功,但这次这个项目有足够的复杂度了。还是得感叹ai辅助确实给力,学习起来容易多了。
:
--
修改:AlphaO FROM 1.202.157.*
FROM 1.202.157.*
嵌入式开发这一点是无解的,永远有更小众的嵌入式出现。比如我见过一款mcu,丫是4bit的...没有c支持,只能写汇编...
你说的两种情况我都不熟悉,没有svd相对还好一点,大不了自己对照c的sdk,port个凑合能用的,让ai写工作量也还好。没有pac情况也类似,无非是用起来麻烦一点而已。但没有target,或者像你说的lib识别不到之类的,看起来像是isa层面的问题,这种就挺无解的...
其实也不是多么无解,理论上自己去debug把target搞定也是可以的,但这就好像要造台汽车但得从挖煤开始搞一样,很多时候就放弃了...
【 在 AlphaO 的大作中提到: 】
: 挺好,rp2040有hal和pac,用Rust会很爽,stm32调研过也是全部支持。像这种需求和支持吻合的就很幸福,可以很爽的开发超高性能的嵌入式软件。
: 但我们这种,硬件设计在前,软件设计在后。硬件选的芯片都很小众,便宜/低功耗/可靠/恰好够用,通常也意味着古老,没有pac,芯片找不到svd,很难受。有时用软核,这种软核架构甚至(调研和尝试发现)不是标准的arm、risv、x86,意味着编译时找不到对应的target。之前半年我断断续续调研了几次,都没找到这种情况该如何做,现在被迫用C去写里面的软件代码。
: 如果您知道或者研究到解决方案,还请不吝赐教,解我困扰。具体问题如下:比如常用的两类,一个是类似Microchip Smartfusion2,上面虽然有硬核但google怎么也找不到svd或等价的pac描述文件;另一个是Xilinx 7系列上面的Microblaze软核,虽然看描述是risc架构,但用risc和arm写lib给它调用都无法识别,只有x86的才能识别到lib却仍读不到函数,怪的很,而且Xilinx里导不出svd或等价的pac描述文件。
: ...................
--
修改:lvsoft FROM 117.89.220.*
FROM 117.89.220.*