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