Migrate aether post from 01398892450
This commit is contained in:
parent
f295360363
commit
1aea9bc617
1 changed files with 201 additions and 0 deletions
201
_posts/2014-04-30-Towards-fast-I-O-in-Arduino-for-AVRs.html
Normal file
201
_posts/2014-04-30-Towards-fast-I-O-in-Arduino-for-AVRs.html
Normal file
|
|
@ -0,0 +1,201 @@
|
|||
---
|
||||
layout: default
|
||||
title: "Towards fast I/O in Arduino for AVRs"
|
||||
redirect_from:
|
||||
- /01398892450
|
||||
---
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>Towards fast I/O in Arduino for AVRs</title>
|
||||
<link rel="stylesheet" href="https://media.unpythonic.net/css/bootstrap.min.css">
|
||||
<style>
|
||||
|
||||
|
||||
#mask {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
background-color: #000;
|
||||
opacity: 0.7;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#loading {
|
||||
position: fixed;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
width: 58px;
|
||||
height: 60px;
|
||||
background-color: black;
|
||||
background-image: url('https://media.unpythonic.net/img/loading.gif');
|
||||
opacity: 0.9;
|
||||
z-index: 20;
|
||||
display: none;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
#bigimg {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#maskouter {
|
||||
height: 100%;
|
||||
display: table;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
#maskinner {
|
||||
vertical-align: middle;
|
||||
display: table-cell;
|
||||
}
|
||||
|
||||
#imgleft, #imgright {
|
||||
cursor: pointer;
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
border-radius: 4px;
|
||||
background-color: black;
|
||||
z-index: 22;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
#imgleft {
|
||||
left: 0;
|
||||
background-image: url('https://media.unpythonic.net/img/prevbtn.png');
|
||||
}
|
||||
|
||||
#imgleft.disabled, #imgright.disabled { display: none; }
|
||||
|
||||
#imgright {
|
||||
right: 0;
|
||||
background-image: url('https://media.unpythonic.net/img/nextbtn.png');
|
||||
}
|
||||
|
||||
#imgdesc {
|
||||
position: fixed;
|
||||
left: 64px;
|
||||
bottom: 0;
|
||||
background-color: #333;
|
||||
width: 100%;
|
||||
padding-top: 1em;
|
||||
padding-bottom: 1em;
|
||||
padding-left: 2em;
|
||||
border: 1px solid #555;
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
#imgdesc .filename {
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#imgdesc .description {
|
||||
color: #fff;
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
#mask { z-index: 10990; }
|
||||
#loading { z-index: 10991; }
|
||||
#bigimg { z-index: 10992; }
|
||||
|
||||
</style>
|
||||
<script type="text/javascript" src="https://media.unpythonic.net/js/jquery-1.6.4.min.js"></script>
|
||||
<script type="text/javascript" src="https://media.unpythonic.net/js/bootstrap-dropdown.js"></script>
|
||||
<script type="text/javascript" src="https://media.unpythonic.net/js/jquery.mousewheel.js"></script>
|
||||
<script type="text/javascript" src="https://media.unpythonic.net/js/jquery.ba-hashchange.min.js"></script>
|
||||
<script type="text/javascript" src="https://media.unpythonic.net/js/jquery.mobile.custom.min.js"></script>
|
||||
<script type="text/javascript" src="https://media.unpythonic.net/js/gallery.js"></script>
|
||||
<style><!--
|
||||
div.floatimageleft, div.floatimageright {
|
||||
border: 1px solid black;
|
||||
padding: 2px;
|
||||
margin: 1em;
|
||||
}
|
||||
div.floatimageleft { clear: left; float: left; }
|
||||
div.floatimageright { clear: right; float: right; }
|
||||
div.floatimageleft img, div.floatimageright img { border: 0px; }
|
||||
|
||||
div.floatimageleft img.zoom, div.floatimageright img.zoom {
|
||||
padding: 4px;
|
||||
}
|
||||
--></style>
|
||||
<style><!--
|
||||
div.albumouter {
|
||||
margin-right: 1ex;
|
||||
margin-top: 1ex;
|
||||
vertical-align: baseline;
|
||||
display: -moz-inline-box;
|
||||
display: inline-block;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
.album { display: block; clear: both; }
|
||||
|
||||
.album a:link, .album a:hover, .album a:visited
|
||||
{ text-decoration: none; }
|
||||
.album a:hover { color: red; }
|
||||
|
||||
.albumimage {
|
||||
display: block;
|
||||
padding-left: 2px; padding-right: 2px;
|
||||
padding-top: 3px; padding-bottom: 3px;
|
||||
background: #ececec;
|
||||
}
|
||||
|
||||
.albumimage img.zoom {
|
||||
margin-left: 0px; margin-right: 0px;
|
||||
padding-top: 4px; padding-right: 4px; }
|
||||
.albumimage img { border: 0px;
|
||||
display: block; margin-left: auto; margin-right:auto
|
||||
}
|
||||
--></style>
|
||||
|
||||
<!-- no summary found -->
|
||||
</head>
|
||||
<body>
|
||||
|
||||
So I've been working on something. I've only looked at assembler output so far,
|
||||
but it looks right and promising.
|
||||
|
||||
<p>Basically, I'd like to let you name I/O pins via typedef, then efficiently
|
||||
read and write the pins. And I'd like to make Arduino's digitalWrite just as
|
||||
efficient when the pin argument is a constant.
|
||||
|
||||
<p>All instruction counts are in Debian Wheezy's avr-gcc version 4.7.2 with
|
||||
<tt>-mmcu=atmega328p -Os</tt> specified on the commandline.
|
||||
<pre>
|
||||
// You can declare ports (they use zero RAM)
|
||||
typedef IOPIN<PORT_B, 0> iob0;
|
||||
typedef IOPIN<PORT_B, 1> iob1;
|
||||
typedef OCPIN<PORT_B, 1, true> ocb1; // emulate an open collector port
|
||||
|
||||
// .. and use them efficiently (instruction counts never include ret)
|
||||
int en() { iob0::output(); } // 1 instruction
|
||||
int fn() { iob0::toggle(); } // 1 instruction
|
||||
int gn() { ocb1::set(); } // 2 instructions
|
||||
int hn() { ocb1::clear(); } // 2 instructions
|
||||
int jn(bool b) { iob0::write(b); } // 5 instructions
|
||||
int kn() { iob0::write(1); } // 1 instruction
|
||||
|
||||
// you can use fastDigitalWrite just like digitalWrite (but faster and inline)
|
||||
int c(int i) { fastDigitalWrite(1, i); } // 5 instructions
|
||||
int d() { fastDigitalWrite(1, 1); } // 1 instruction
|
||||
|
||||
// these have a variable port so they still turn into calls to digitalWrite
|
||||
int a(int i, int j) { fastDigitalWrite(i, j); }
|
||||
int b(int i) { fastDigitalWrite(i, 1); }
|
||||
</pre>
|
||||
|
||||
<p><p><b>Files currently attached to this page:</b>
|
||||
<table cellpadding=5 style="width:auto!important; clear:none!important"><col><col style="text-align: right"><tr bgcolor=#eeeeee><td><a href="https://media.unpythonic.net/emergent-files/01398892450/fast_io_prototype.cpp">fast_io_prototype.cpp</a></td><td>6.2kB</td></tr></table><p>
|
||||
<br><br><font size=-2>Entry first conceived on 30 April 2014, 21:14 UTC, last modified on 26 August 2014, 15:43 UTC</font>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Reference in a new issue