原文
ldc支持gdc风格汇编
avrd
d的avr

两个选项可链接ldc发出的编译目标文件:用avr-gcc的链接器,或用llvm的内部链接器.-gcc=avr-gcc参数告诉在哪查找avr-gcc工具,或可用使用llvm的内置链接器的--link-internally.两者都会起作用.
使用-gcc相关的好处是可arduino studio,因为它有objcopy,avrdude等程序及其他有用的东西.让它正常工作,并更好地集成与其他库和工具等一起使用,如gcc提供的C运行时.

$ PATH=/opt/arduino/arduino-1.8.10/hardware/tools/avr/bin:$PATH ldc2 -betterC -Oz -mtriple=avr -mcpu=atmega328p -gcc=avr-gcc delay.d
$ file delay
delay: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, with debug_info, not stripped
$ ls -l delay
-rwxr-xr-x 1 me users 2440 Sep 18 08:28 delay

使用PATH中的arduino工具,-gcc=avr-gcc参数就可工作.
使用--link-internally,你不需要这些,但是:

$ ldc2 -betterC -Oz -mtriple=avr -mcpu=atmega328p --link-internally delay.d
lld: warning: cannot find entry symbol _start; defaulting to 0x110B4
$ file delay
delay: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped
$ ls -l delay
-rwxr-xr-x 1 me users 708 Sep 18 08:31 delay

注意它链接了,但它给出了关于丢失_start的警告.还要注意不同的文件大小.这是因为gcc提供的C运行时,提供了调用你的extern(C)main来执行一些基本设置开始符号.没有它,你需要自己做更多的事情.我敢肯定,你也可在链接命令中列举lib/object文件来让ldc链接,但是使用-avr-gcc,可正常工作,因为它已知道在哪可找到所有这些东西.

avr链接,有点过时.
可用标准的ldc2安装,只需从ldc网站获取二进制.你不必自己编译它;正常下载中,avr支持已有一段时间了.
得到ldc后,先安装arduino工具.我直接安装ArduinoStudio.我把文件放在/opt/arduino/arduino-1.8.10/中.你可能要调整该路径.在那里,你会看到arduino命令,硬件目录等.

me@arsd:/opt/arduino/arduino-1.8.10$ ls
arduino          arduino-linux-setup.sh  hardware    java  libraries  revisions.txt  tools-builder
arduino-builder  examples                install.sh  lib   reference  tools          uninstall.sh

写个测试:

import ldc.llvmasm;// delay_basic.h中的移植
void _delay_loop_1(ubyte __count) {//该模板参数是必需的,以避免
//`!Call.getType()->isVoidTy()&&"Badinlineasm!"'`断定失败.__asm!ubyte ("1: dec $0\n\tbrne 1b","=r,0", (__count));
}
void _delay_loop_2(ushort __count) {__asm!ushort (`1: sbiw $0,1brne 1b`,`=w,0`,__count);
}// arduino 中 delay.h 的端口
enum F_CPU = 1000000UL;// 这是`_delay_ms`,但我做错了,把`double`改成`int`,我还是不喜欢
void _delay(int __ms) {ushort __ticks;ulong __tmp = (F_CPU * __ms) / 4000;if(__tmp < 1)__ticks = 1;else if(__tmp > 65535) {__ticks = cast(ushort) (__ms * 10.0);while(__ticks) {_delay_loop_2(cast(ushort) (((F_CPU) / 4e3) / 10));__ticks--;}return;} else__ticks = cast(ushort) __tmp;_delay_loop_2(__ticks);
}// 这是来自`WebFreak`在`Dwiki`上的示例代码enum AVR_ARCH = 5; // MCU 的 AVR 架构static if (AVR_ARCH >= 100) {enum SFR_OFFSET = 0x00;
} else {enum SFR_OFFSET = 0x20;
}enum ubyte* MMIO_BYTE(ubyte memAddr) = cast(ubyte*) memAddr;
enum ubyte* SFR_IO8(ubyte ioAddr) = MMIO_BYTE!(ioAddr + SFR_OFFSET);enum ubyte* PINB = SFR_IO8!(0x03);
enum ubyte* DDRB = SFR_IO8!(0x04);
enum ubyte* PORTB = SFR_IO8!(0x05);extern(C) void main() {import core.volatile;volatileStore(DDRB, 0xFF);//端口所有B设置为输出// 我添加了延迟while (true) {volatileStore(PORTB, 0xFF);//端口所有B设置为高foreach(i; 0 .. 10)_delay(1000);volatileStore(PORTB, 0x00);//端口所有B设置为低foreach(i; 0 .. 20)_delay(1000);}
}

先,make文件:

# Makefile
$ cat Makefile
all:ldc2 delay.d -betterC -Oz -mtriple=avr -mcpu=atmega328p -Xcc=-mmcu=atmega328p -gcc=avr-gccavr-objcopy -O ihex -R .eeprom delay delay.hexavrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:delay.hex -C /opt/arduino/arduino-1.8.10/hardware/tools/avr/etc/avrdude.conf

请不要在最后一行的路径,再次安装arduino.
要运行它,请设置PATH为你的arduino安装,并运行make,如下所示:

PATH=/opt/arduino/arduino-1.8.10/hardware/tools/avr/bin:$PATH make

这编译D代码,然后把它复制arduino硬件并开始运行它.灯(及连接到引脚上的其他东西)闪烁.
如果查看上面链接的wiki页面,其中大部分内容很熟悉.我随意复制/粘贴.
需要注意的一些重要事项:
1,不能用extern(C)arduinoC的头文件中调用delay_ms,因为它是按内联函数定义的.库或目标文件中没有内联函数;你必须移植源.

WebFreak在此移植了源码,我解释下.
gccldc中的内联asm略有不同.这是文件中的_delay_loop_1:

void _delay_loop_1(uint8_t __count)
{__asm__ volatile ("1: dec %0" "\n\t""brne 1b": "=r" (__count): "0" (__count));
}

而,如下是D文件中:

import ldc.llvmasm;
// delay_basic.h中的移植
void _delay_loop_1(ubyte __count) {//该模板参数是必需的,以避免
//`!Call.getType()->isVoidTy()&&"Badinlineasm!"'`断定失败.__asm!ubyte ("1: dec $0\n\tbrne 1b","=r,0", (__count));
}

asm不一样.在gcc中,它使用__asm__.在ldc中,它使用ldc.llvmasm.__asm.它们相似但不同:
1,gcc使用%0作为占位符.ldc使用了$0.
2,gcc使用冒号+神奇约束串.ldc使用函数的第二个参数.所有约束都必须在ldc用逗号分隔的串中.
3,gcc似乎会自动计算出大小.ldc不会.不能指定会触发编译器断定失败.我并不知道类型,但是让输入匹配似乎正确.
构建和部署过程都来自arduino工具,所以除了设置路径外,都与C一样.
我使用了-gcc,--link-internally要麻烦些.

我在这里使用了ldc,因为它在下载时开箱即用,无需自己构建.
内联汇编对这些控制器计时有些重要,因此能够做到这一点很酷.

d你好Arduino相关推荐

  1. 《Arduino实战》——第1章 你好Arduino

    本节书摘来异步社区<Arduino实战>一书中的第1章,作者:[美]Martin Evans ,Joshua Noble ,Jordan Hochenbaum,更多章节内容可以访问云栖社区 ...

  2. processing python模式下载_爱上processing PDF 高清版

    给大家带来的一篇关于processing相关的电子书资源,介绍了关于processing方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小51.9 MB,Casey Reas编写,目前豆瓣 ...

  3. 你好!基于Arduino控制的串口屏

    在创客教育中,能用Arduino控制的屏幕有LCD1602液晶显示屏.OLED显示屏(I2C方式)等,但是LCD1602只能显示英文字符和数字,OLED显示屏尺寸又小. 实际上在单片机开发中还会用到一 ...

  4. 如何使用可编程无线SIM和Arduino MKR GSM 1400播放MP3文件

    新的MKR系列Arduino板将改变快速原型物联网解决方案的前景.对于希望使用蜂窝连接扩展其物联网项目范围的任何人来说,Arduino MKR GSM 1400都是一个很好的解决方案.通过将调制解调器 ...

  5. Arduino语法详解,部分带注释(学习笔记)

    Arduino 的程序可以划分为三个主要部分:结构.变量(变量与常量).函数 函数部分参考官方:Arduino Reference - Arduino Reference 结构部分  一.结构 1.1 ...

  6. Arduino语法详解_含示例详解

    Arduino 的程序可以划分为三个主要部分:结构.变量(变量与常量).函数. 结构部分 一.结构 1.1 setup() 1.2 loop() 二.结构控制 2.1 if 2.2 if...else ...

  7. Arduino IDE下的stm32环境搭建、OLED液晶显示(U8g2lib库)、NUCLEO-F411测试、STM32F103C8T6在Arduino下的液晶显示、

    最近在淘宝上看到NUCLEO-F411RE能兼容Arduino,于是入手一块玩玩.于是查找资料搭建化境和做相关实验.断断续续花了好几天,总结一下,供其他人少走弯路. 在Arduino里兼容stm32( ...

  8. Arduino驱动OLED显示屏

    使用Arduino驱动SSD1306 OLED 显示屏工作 1.准备工作 1.1)Arduino中库的载入 #include <Adafruit_SSD1306.h>驱动128x64 an ...

  9. 语音控制单片机(python做的上位机控制arduino)

    最近看了垃圾分类很多人做,身为学电子出身的我,也想试试.那首先怎么实现分类呢? 搞摄像头识别....感觉有点难度,还要算法,慢慢研究,然后灵机一动就想到语音控制,我的想法是我说这个垃圾的名称,然后下位 ...

最新文章

  1. Ubuntu修改终端@前面的用户名
  2. pyplot.plot画图turtouil
  3. 多目标跟踪2021总结
  4. Python Xml类
  5. 软件性能测试与LoadRunner实战可以在网上和书店买到了
  6. 一步一步学Remoting系列文章
  7. python利用thinker制作多页面切换的桌面应用实例教程
  8. 21. RequireJS
  9. 揭开A股38位「 90后」董事长的神秘面纱
  10. win7激活工具使用
  11. H5编辑器H5-Dooring2.30更新指南
  12. asp.net 设计音乐网站
  13. python连续输入直到回车退出_详解Python实现按任意键继续/退出的功能
  14. 最短路算法——Floyd-Warshall(题目练习解析)
  15. 线程开的越多就越好吗|趣谈线程池
  16. 冯 诺依曼与冯 诺依曼计算机,性能之殇(一)-- 天才冯·诺依曼与冯·诺依曼瓶颈...
  17. Egret性能优化之优化渲染
  18. 闪动的TextView
  19. 韩媒看中国量子计算机,韩媒:量子计算机原本是欧美在玩中国却令人吃惊
  20. [云炬商业计划书笔记]

热门文章

  1. Mac终端显示计算机名称过长的处理方式
  2. js深拷贝和浅拷贝的区别
  3. QT<五> 对话框
  4. WPF开源界面库MaterialDesignInXamlToolkit
  5. 如何处理地图投影转换
  6. 数码相机夜景拍摄技巧
  7. DHCP服务简介安装与配置
  8. matplotlib matplotlib中axvline()和axhline()函数
  9. Altera RapidIO IP维护模块
  10. Redis常考点汇总