其他分享
首页 > 其他分享> > 用d开车

用d开车

作者:互联网

原地址
作者:Dylan Graham.
D:快速/表达力/简单,还可开车.是的,我用d开车.
我的Holden VZ Ute车自带了个垃圾四速自动变速箱.1.5年就坏了,我买了个防弹六速自动变速箱.为了使其工作,我构建自己的电路板,计算机系统和固件来控制变速箱内电磁阀,液压系统和离合器,处理用户输入,换档,接口,并让其假装为原来的4速变速箱.
我很自豪我的解决方案.可在250ms内换档,适合赛车.能快速启动,优点一堆,总之很好.
计算机分两部分:用户界面板,STM32F042来驱动OLED显示.主板,用STM32F407搞定其他的.他们通过CAN线协作.用d来写的.
我用的DbetterC来干的:统调/元编程/易对接C/单元测试/可移植性/共享/@安全友好的社区.

统调

使我代码更清晰,可准确跟踪数据流,而不被一次变量/嵌套调用函数等污染.如引擎控制单元中的:

immutable injectorTime = airStoich(100.kpa, 25.degCelsius)
    .airMass
    .fuelMass((14.7f).afr)
    .fuelMol
    .calculateInjectorWidth;

不必后向读代码,数括号,一次变量,这很简洁.

元编程

不要重复,D元编程很牛逼,如控制器中:

struct CANPacket(ushort ID) {
    enum id = ID;
    ubyte[8] data;
}
alias HeartbeatPacket = CANPacket!10;
alias BeepHornPacket = CANPacket!140;

他们有相同底层构造,如果CANPacket变了,相应的两个也变了.

对接C

我经常要使用微控器HAL和RTOS,只需要加extern(C),然后就可以使用了.

extern(C) c_setPwm(int solenoid, void* userData); // 声明
c_setPwm(4, null); // 使用

单元测试

d的内置单元测试避免我犯错.我在窗口上跑所有单元测试来保证逻辑正确,然后为微控器构建目标.

可移植性

D通过gdc/ldc支持大量目标平台,不然我得用C++来写代码了.我用ldc,调整命令行参数就可交叉编译了.

共享

D共享来保证线程安全.不完美,但工作得很好.我代码用多线程,需要同步,就标记变量为共享.访问他们时要小心,他同系统锁/互斥锁一起工作.锁定时,可去掉共享,像普通变量一样用.在构/类中很方便.

shared int sensorValue;
sensorValue = 4; //像单线程变量用,错误
atomicStore(sensorValue, 4); //同原子一起用

安全D

@安全禁止粗放内存活动,确保最佳行为.如果你要乱搞,@安全会阻止你.

心理

亚当说:D心理负担小.灵活与表达力可快速转变想法为代码/生产力.D中我不需要折腾太多,我最高效的语言就是D.

最后

我认为,D嵌入式光明未来.我也将继续用D.

标签:开车,代码,单元测试,CANPacket,我用,共享,sensorValue
来源: https://blog.csdn.net/fqbqrr/article/details/118571177