用D驾驶

2021-06-03 23:03:44

当我想到D:快速,表现力,容易,而且......驾驶时,这就是想到的那是对的,我和D一起开车。

输入我的尊敬Holden vz Nute Driver。从工厂出发,它带有垃圾四速自动变速箱。在18个月的所有权期间,我摧毁了四个变速箱。当时我买不起新车,所以我不得不创造创意。我购买了另一辆车的摇滚固体,防弹,六速自动变速箱。但这就是解决方案结束的地方。为了使其工作,我必须建立自己的电路板,计算机系统和固件来控制齿轮箱内的螺线管,液压和离合器,处理用户输入,执行转移决策,并假装是我的汽车的界面四速自动。

我为我的解决方案感到骄傲。它可以在250毫秒的班次中进行班次,这很适合赛车。它有一个陡峭的第一档,让它成为迅速的起飞。它给了一些强大的汽车为他们的钱运行。它有Flappy Paddles,屏幕上的诊断数据,并能够进入并改变它在我想要的情况下工作的方式。

这是一个非常旧的系统视频。它不是当前系统的代表 - 可怕的蓝屏已经消失,Speedo的工作,并且转移改善了。

计算机分为两部分:用户界面板,驱动OLED显示屏并使用STM32F042,以及使用STM32F407处理其他所有内容的主板。两者合作超过CAN总线(控制器区域网络)。处理此操作的所有固件都在D.

我选择了D(如-betterc),因为它的巧妙均匀函数调用语法(UFC),元编程,易于与C,单元测试,可移植性,共享和@Safe接口。另一个奖金是有用的,欢迎的社区。它真的是在论坛上讨论d的快乐,以及创始人和社区领导人。

统一函数调用语法(UFCS)这使我的代码显着更清晰。我的代码可以准确地遵循数据流,而无需使用单一使用变量污染我的堆栈,嵌套许多函数调用或其他类型的混乱。例如,这里是我在即将到来的ECU(发动机控制单元)项目中使用的一些代码:

无需稍微读取代码或计算括号,无需使用Gazillion单使用变量。这很简洁。

Metaprogramming不要重复自己(干)原则通常由程序员吹捧。 D'S Metaprogramming是一个令人难以置信的工具来实现这一目标。我在我的总线实施中使用它。例如:

struct canpacket(USHORT ID){ENUM ID = ID; ubyte [8]数据;别名心跳= canpacket!10;别名beephornpacket = canpacket!140;

我有特定的锯齿类型类型为心跳acket和beephornpacket,但我还没有重复任何代码。它们都遵循相同的底层结构,因此如果我修改canpacket,每个别名也会更新。

接口到C我经常必须与我的微控制器的HAL和RTO进行通信; D'S C接口让微风。只需添加extern(c)即可进入。

单位测试D'S内置单元测试已挽救了我从吹掉几次脚的脚。我可以在Windows上运行所有单元测试以保证逻辑正确性,然后为MicroController构建最终目标。

从上面开始的可移植性,D通过GDC和LDC支持令人惊讶的大量目标。如果它不适用于d's的可移植性,我必须在c ++(ugh)中写下我的项目。我使用LDC,可以通过简单地调整我的命令行参数来执行交叉编译。

共享共享是守护代码的多线程访问的方式。这并不完美,但我用它来使用它,我认为它很好。我在代码库中有多个线程,他们需要同步数据。我将某些变量标记为共享,这意味着我必须特别注意访问该数据。它适用于系统锁和互斥锁。锁定时,我可以传播远离变量并使用它类似于正常变量。这与结构和课程方便。

共享INT SensorValue; SensorValue = 4; //使用它像单线变量,ErroratomStore(SensorValue,4); //与原子有关

SAFED @SAFE存在,以禁止粗略内存活动并强制执行最佳行为。我还没有打败@Safe,因为我没有做任何邪恶的东西,但很乐意知道如果我要弄错,那么编译器可以帮助我停下来。

精神摩擦亚当D. Ruppe简洁地说:D精神摩擦力低。语言的灵活性和表现力使得将一个人的思想转化为书面代码并保持生产力。我不必战斗d。这是我的个人意见,但我觉得D是我最富有成效的语言。

D是这种项目的完美契合 - 我认为它将在嵌入式世界中具有光明的未来。我将继续使用d为我的项目。我希望将来能够炫耀的作品中另一个D-Powered汽车项目。