都说了好多遍了,rust和c在指针方面没任何区别。
你要把地址cast成指针,最简单比如这样就行了:
static mut SCREEN: *mut [[u16; 80]; 25] = 0xB8000 as _;
严谨一点可以封装下,比如这个看起来复杂是因为还定义了生命周期:
fn from_addr<'b>(address: usize) -> &'b Name<'a> {
unsafe { &*(address as *const Self) }
}
至于java也有指针...你是认真的么?rust和java的重大区别就是rust和c一样直接面向实际硬件体系架构。而java多了一层jvm。java别说直接访问内存了,连off heap这么naive的事情都可以当成黑科技。
最后,所有语言都是等价的,你当然可以在c层面做到和rust一样只输入svd来定义整个寄存器的内存映射。但如果不依赖meta programming,只靠c的macro,肯定做不到zero cost。而依赖meta programming,那我随便拿什么语言都行,比如我用python都是可以的。这本质上就是回到了c++的错误路线上(把一个template整成图灵完备,which我认为是个十分sb的决策)
以外,尽管语言都是等价的,但不同的语言的style很重要。我们选择一门语言,选的就是它的style,也即它在设计之初定下的优点/缺点组合的倾向性。比如rust的stm-hal,人家选择直接导入svd,而不是c style式的写个头文件嵌入进去。就是因为选择rust的人会更看重安全性,所以他们也会天然的选择更安全的实现方案。这些东西比各种具体的feature,诸如指针是否直观易用写起来是否方便什么的要重要得多。
最后,还是回到我前面的观点,直观易用=简陋=镰刀割麦子。当你想要追求生产力,开始追求现代化工具带来的高效率的同时,你就必须抛弃掉刀耕火种的手工风格。简单易用(C style)和复杂完美(C++ style)都不是优点,作为工程师,能否做出恰到好处的取舍,选中最完美的那个平衡点,才是定义一个好的工程师的标准。
【 在 Oriphia 的大作中提到: 】
: C的显性指针明显更加直观易用,如果rust算有指针,那JAVA也有指针,这些隐性的指针对寄存器操作没有何任的易用性可言,如果我没记错,ESP32的SVD文件就有高达4万行,本质上是一本字典。我觉得在C语言环境做这种字典也是可以的,但既然C有显性的指针,svd就变成画蛇添足。
: 安全特性对于多任务系统中,不同程序之间的内存管理的确更安全,问题MCU的ROM本身只是一个程序,MCU的程序开发多数情况又是一个人完成。安全性就相当于偷窃我的人是我自己,没有半点意义。
:
--
FROM 180.111.26.*