嵌入 D(编程语言)
Posted
技术标签:
【中文标题】嵌入 D(编程语言)【英文标题】:Getting Embedded with D (the programming language) 【发布时间】:2010-11-15 12:43:14 【问题描述】:我很喜欢我读过的关于 D 的很多内容。
统一文档(这将 让我的工作轻松很多。) 内置的测试功能 语言。 语言中的调试代码支持。 转发声明。 (我总是 认为声明是愚蠢的 两次相同的功能。) 内置功能替换 预处理器。 模块 Typedef 用于正确的类型检查 而不是别名。 嵌套函数。 (咳嗽帕斯卡 咳嗽) 输入和输出参数。 (这是多么明显!) 支持低级编程 - 嵌入式系统,哦耶!但是:
D 可以支持嵌入式系统吗? 不会运行操作系统? 是否彻底清除 它不支持 16 位处理器 完全从嵌入式中排除它 在此类机器上运行的应用程序?有时您不需要锤子来解决您的问题。 垃圾收集在 Windows 或 Linux 上非常有用,但不幸的是,嵌入式应用程序有时必须进行显式内存管理。 数组边界检查,你喜欢它,你讨厌它。非常适合设计保证,但对于性能问题并不总是允许的。 对于不运行操作系统的嵌入式系统,多线程支持有何影响?我们有一个客户甚至不喜欢中断。更少的操作系统/多线程。 是否有适用于嵌入式系统的 D-Lite?所以基本上 D 适合只有几兆字节(有时小于 1 兆字节)的嵌入式系统,不运行操作系统,其中最大内存使用量必须在编译时(根据要求)知道,并且可能小于32位处理器?
我对其中的一些功能非常感兴趣,但我觉得它是针对桌面应用程序开发人员的。
是什么使它不适合 16 位实现? (假设 16 位架构可以处理足够数量的内存来保存运行时,无论是在闪存还是 RAM 中。)仍然可以计算 32 位值,尽管它比 16 位慢并且需要更多操作,使用库代码。
【问题讨论】:
larsivi 是 Tango 库的开发者之一,所以也请认真相信他的回答。 哦,“D-Lite”是个好名字:)。我希望有人使用它。 可能的欺骗:***.com/questions/1113938/… 类似,但更具体一些。 另外,嵌入式编程不一定意味着实时编程。 【参考方案1】:这个问题的答案已经过时了:
D 能否支持不运行操作系统的嵌入式系统?
D 可以是cross-compiled for ARM Linux 和ARM Cortex-M。一些项目旨在为 Cortex-M 架构 like MiniLibD for the STM32 或 project which uses a generic library for the STM32 创建库。 (您可以在 ARM Cortex-M 的 D 中实现自己的简约操作系统。)
它不支持 16 位处理器的明确声明是否完全排除了在此类机器上运行的嵌入式应用程序?有时你不需要锤子来解决你的问题。
不,请参阅上面的答案...(但我不希望在不久的将来支持比 Cortex-M 更“小的”架构。)
垃圾收集在 Windows 或 Linux 上非常有用,但不幸的是,嵌入式应用程序有时必须进行显式内存管理。
你可以写Garbage Collection free code。 (D 基金会的目标似乎是“兼容 GC”的标准库 Phobos,但这项工作正在进行中。)
数组边界检查,你喜欢它,你讨厌它。非常适合设计保证,但对于性能问题并不总是允许的。
(正如你所说,这取决于你的“个人品味”和设计决策。但由于 D 编译器开发人员的背景和 D 的设计目标,我认为边界检查的性能开销是可以接受的。)
对于不运行操作系统的嵌入式系统,多线程支持有何影响?我们有一个客户甚至不喜欢中断。更少的操作系统/多线程。
(问题是什么?可以使用 D 的语言功能实现多线程,例如like explained in this question。顺便说一句:如果你想使用中断,请考虑这个"hello world" project for a Cortex-M3。)
是否有适用于嵌入式系统的 D-Lite?
SafeD subset of D 以嵌入域为目标。
【讨论】:
【参考方案2】:首先阅读larsivi's answer。他在 D 运行时工作,知道他在说什么。
我只是想补充一点:一些你所问的已经是可能的了。它不会让你一路走好,在这里错过就像一英里一样好,但仅供参考:
垃圾收集在 Windoze 或 Linux 上非常有用,但不幸的是,嵌入式应用有时必须进行显式内存管理。
您可以关闭垃圾收集。那里的各种实验性 D OS 都可以做到这一点。请参阅std.gc 模块,尤其是std.gc.disable
。另请注意,您不需要使用new
分配内存:您可以使用malloc
和free
。甚至可以用它分配数组,你只需要使用切片在分配的内存周围附加一个 D 数组。
数组边界检查,你喜欢它,你讨厌它。非常适合设计保证,但对于性能问题并不总是允许的。
specification for arrays 特别要求编译器允许边界检查为turned off(请参阅“实施说明”)。 gdc
提供-fno-bounds-check
,在dmd
中使用-release
应该禁用它。
对于不运行操作系统的嵌入式系统,多线程支持有何影响?我们有一个客户甚至不喜欢中断。更少的操作系统/多线程。
这我不太清楚,但鉴于大多数 C 运行时允许关闭多线程,似乎也可以让D runtime 禁用它。虽然我不能告诉你,但现在这是否容易或可能。
【讨论】:
我确实读过他的帖子。事实上,我什至对它发表了评论! :) 在编译器中禁用边界检查很好,但我认为最好为特定代码段指定边界检查,并将其用于其他对安全目的而言时间不重要的代码。在大多数情况下,我什至不使用 malloc,有时我会通过链接器预分配特定的内存寻址(即内部与外部 ramblock)。 “我确实读过他的帖子。”对不起,皮特,听起来不是很咄咄逼人!当我发布时,您没有 cmets(我们同时在编辑)。但我主要是要提醒其他可能阅读此答案的人,他们应该先阅读他的内容,并且在 *** 上的答案可以重新排序。 “指定检查特定代码段的边界”。我同意。我不知道是否有任何设施。 这是一个 hack,但您可以在每个文件基础上打开和关闭边界检查并将混合链接在一起。这可能会强制一些“奇怪”的编码风格约束。 @quark,不用担心,请注意笑脸。 @BCS 只要编译器在您这样做时不会失去理智,这听起来并不合理。一般来说,硬件编程有一些丑陋,大多数语言都没有很好的语法。即,如果能够告诉编译器一个变量或结构存在于内存映射寄存器之上,作为一个易失性只读值,那就太好了。【参考方案3】:我不得不说这个问题的简短答案是“不”。
如果您的机器是 16 位的,那么在将 D 装入其中时会遇到很大的问题 - 它显然不是为它设计的。 D 本身并不是一种轻量级语言,它会生成大量运行时类型信息,这些信息通常会链接到您的应用程序中,而且类型安全的可变参数也需要这些信息(因此标准的格式化功能是 Tango 或 Phobos)。这意味着即使是最小的应用程序的大小也令人惊讶地大,因此可能会使 D 不符合低 RAM 系统的资格。此外,将运行时作为共享库的 D(可以缓解其中一些问题)也很少经过测试。 所有当前的 D 库都需要在其下方有一个 C 标准库,因此通常还需要一个操作系统,因此即使这样也不利于使用 D。但是,D 中确实存在实验性内核,因此这本身并不是不可能的。到今天为止,它不会有任何库。我个人希望看到你成功,但怀疑这会不会很容易。
【讨论】:
我们有一些客户非常关心程序验证和程序正确性。 D 的一些功能似乎正是为此而生的。就“标准 C 库”而言,大多数嵌入式开发系统对此都有一定的支持,他们可能会说你必须填写对 I/O 的低级支持,有点像做回调,但你通常不这样做文件访问。 一组“精简”库可能会消除一些体积。我不需要很多适用于基于操作系统的系统的功能。然而,ADA 也支持多任务处理,这确实意味着嵌入式系统上有一个大型运行时支持库。嵌入式 ADA 运行时实际上附带了一个操作系统,只是为了支持多任务处理。 如果您愿意/有能力为此付出一些努力,我将有兴趣合作。 愿意。有能力,也许是在我熟悉了这门语言之后。现在,我的理解或多或少只是“表面”材料。我需要将它安装在一个我可以“玩”并获得语法和功能的环境中。 @larsivi 这还是2014年的现状吗?以上是关于嵌入 D(编程语言)的主要内容,如果未能解决你的问题,请参考以下文章