d你好Arduino
原文
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
在此移植了源码,我解释下.
gcc
和ldc
中的内联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相关推荐
- 《Arduino实战》——第1章 你好Arduino
本节书摘来异步社区<Arduino实战>一书中的第1章,作者:[美]Martin Evans ,Joshua Noble ,Jordan Hochenbaum,更多章节内容可以访问云栖社区 ...
- processing python模式下载_爱上processing PDF 高清版
给大家带来的一篇关于processing相关的电子书资源,介绍了关于processing方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小51.9 MB,Casey Reas编写,目前豆瓣 ...
- 你好!基于Arduino控制的串口屏
在创客教育中,能用Arduino控制的屏幕有LCD1602液晶显示屏.OLED显示屏(I2C方式)等,但是LCD1602只能显示英文字符和数字,OLED显示屏尺寸又小. 实际上在单片机开发中还会用到一 ...
- 如何使用可编程无线SIM和Arduino MKR GSM 1400播放MP3文件
新的MKR系列Arduino板将改变快速原型物联网解决方案的前景.对于希望使用蜂窝连接扩展其物联网项目范围的任何人来说,Arduino MKR GSM 1400都是一个很好的解决方案.通过将调制解调器 ...
- Arduino语法详解,部分带注释(学习笔记)
Arduino 的程序可以划分为三个主要部分:结构.变量(变量与常量).函数 函数部分参考官方:Arduino Reference - Arduino Reference 结构部分 一.结构 1.1 ...
- Arduino语法详解_含示例详解
Arduino 的程序可以划分为三个主要部分:结构.变量(变量与常量).函数. 结构部分 一.结构 1.1 setup() 1.2 loop() 二.结构控制 2.1 if 2.2 if...else ...
- Arduino IDE下的stm32环境搭建、OLED液晶显示(U8g2lib库)、NUCLEO-F411测试、STM32F103C8T6在Arduino下的液晶显示、
最近在淘宝上看到NUCLEO-F411RE能兼容Arduino,于是入手一块玩玩.于是查找资料搭建化境和做相关实验.断断续续花了好几天,总结一下,供其他人少走弯路. 在Arduino里兼容stm32( ...
- Arduino驱动OLED显示屏
使用Arduino驱动SSD1306 OLED 显示屏工作 1.准备工作 1.1)Arduino中库的载入 #include <Adafruit_SSD1306.h>驱动128x64 an ...
- 语音控制单片机(python做的上位机控制arduino)
最近看了垃圾分类很多人做,身为学电子出身的我,也想试试.那首先怎么实现分类呢? 搞摄像头识别....感觉有点难度,还要算法,慢慢研究,然后灵机一动就想到语音控制,我的想法是我说这个垃圾的名称,然后下位 ...
最新文章
- Ubuntu修改终端@前面的用户名
- pyplot.plot画图turtouil
- 多目标跟踪2021总结
- Python Xml类
- 软件性能测试与LoadRunner实战可以在网上和书店买到了
- 一步一步学Remoting系列文章
- python利用thinker制作多页面切换的桌面应用实例教程
- 21. RequireJS
- 揭开A股38位「 90后」董事长的神秘面纱
- win7激活工具使用
- H5编辑器H5-Dooring2.30更新指南
- asp.net 设计音乐网站
- python连续输入直到回车退出_详解Python实现按任意键继续/退出的功能
- 最短路算法——Floyd-Warshall(题目练习解析)
- 线程开的越多就越好吗|趣谈线程池
- 冯 诺依曼与冯 诺依曼计算机,性能之殇(一)-- 天才冯·诺依曼与冯·诺依曼瓶颈...
- Egret性能优化之优化渲染
- 闪动的TextView
- 韩媒看中国量子计算机,韩媒:量子计算机原本是欧美在玩中国却令人吃惊
- [云炬商业计划书笔记]