Archive for September 2007
Using Pure Bash to Parse Strings
while looking through my snippets for a script to parse a simple “several fields to a line, one record to a line” type of data set, I realized I was probably over engineering the solution, the following is the result of a few whiles playing with a few ideas:
#!/bin/bash
ITEMS='field 1;field 2;field 3;field 4;field 5'
LEN=${#ITEMS}
while [ "$LEN" -gt "0" ]; do
echo -------------
echo ${LEN}
echo "post:"${ITEMS}
#get the shortest match from front of the source string
# by matching the longest from the back of the source string
THIS_FIELD=${ITEMS%%;*}
#remove the match from the source string
ITEMS=${ITEMS:$((${#THIS_FIELD}+1))}
#calc the length of the source string
LEN=${#ITEMS}
#show results
echo "anno:"${ITEMS}
echo ${THIS_FIELD}
done
will output:
39
post:field 1;field 2;field 3;field 4;field 5
anno:field 2;field 3;field 4;field 5
field 1
————-
31
post:field 2;field 3;field 4;field 5
anno:field 3;field 4;field 5
field 2
————-
23
post:field 3;field 4;field 5
anno:field 4;field 5
field 3
————-
15
post:field 4;field 5
anno:field 5
field 4
————-
7
post:field 5
anno:
field 5
the idea can be taken further by using an array:
#!/bin/bash
#declare the array
declare -a FIELDS
ITEMS='field 1;field 2;field 3;field 4;field 5'
LEN=${#ITEMS}
while [ "$LEN" -gt "0" ]; do
echo -------------
echo ${LEN}
echo "post:"${ITEMS}
#get the shortest match from front of the source string
# by matching the longest from the back of the source string
THIS_FIELD=${ITEMS%%;*}
#remove the match from the source string
ITEMS=${ITEMS:$((${#THIS_FIELD}+1))}
#calc the length of the source string
LEN=${#ITEMS}
#store result in the array
FIELDS[ (${#FIELDS[*]}) ]=${THIS_FIELD}
#show results
echo "anno:"${ITEMS}
echo ${THIS_FIELD}
echo ${FIELDS[ (${#FIELDS[*]}-1) ]}
done
echo -------------
#show the array count
echo ${#FIELDS[*]}
#show the array content
echo ${FIELDS[*]}
will output:
39
post:field 1;field 2;field 3;field 4;field 5
anno:field 2;field 3;field 4;field 5
field 1
field 1
————-
31
post:field 2;field 3;field 4;field 5
anno:field 3;field 4;field 5
field 2
field 2
————-
23
post:field 3;field 4;field 5
anno:field 4;field 5
field 3
field 3
————-
15
post:field 4;field 5
anno:field 5
field 4
field 4
————-
7
post:field 5
anno:
field 5
field 5
————-
5
field 1 field 2 field 3 field 4 field 5
the final script fragment without the comments::
#!/bin/bash
ITEMS='field 1;field 2;field 3;field 4;field 5'
declare -a FIELDS
LEN=${#ITEMS}
while [ "$LEN" -gt "0" ]; do
THIS_FIELD=${ITEMS%%;*}
ITEMS=${ITEMS:$((${#THIS_FIELD}+1))}
LEN=${#ITEMS}
FIELDS[ (${#FIELDS[*]}) ]=${THIS_FIELD}
done
COUNT=0
while [ "$COUNT" -lt ${#FIELDS[*]} ]; do
echo ${FIELDS[$COUNT]}
COUNT=$(( ${COUNT}+1 ))
done
obviously you would want to change the “ITEMS” variable and do something meaningful in the second loop.
this was posted in the hope that it will be of some use to someone.
GhostScript and Margins
I had a postscript document that simply did not want to come out correctly, the offsets were such that the page content was going well off the visible area.
the following vile hack is one solution:
cat <<EOF>offsetfix.ps %!PS-Adobe-2.0 << /PageOffset [ 16 -52] /Margins [0 0] /.HWMargins [0 0 0 0] >> setpagedevice EOF gs -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite \ -dOptimize=true \ -sOutputFile=output.pdf \ offsetfix.ps input.ps
granted, one could cat the snippit in offsetfix.ps with the original document, but as I’m not sure what else may be using it, I’d rather not.
this also has the advantage of being a bit more portable, albeit rather ugly when compared to the original:
ps2pdf input.ps output.pdf
Atmel AVR Device List
as of 2007-09-20
Continue reading ‘Atmel AVR Device List’ »
AVR Toolchain - Build 2007-09-08
Documentation
AVR Toolchain Build Tests
AVR Libc User Manual
Downloads
AVR-Toolchain - 2007-09-08 Build Binary Package - No Docs
AVR-Toolchain - 2007-09-08 Build Binary Package
Notes
the single greatest number of “bug” reports we get are due to the user not setting the env variable AVR.
on a linux system:
export AVR=/usr/local/avr (or wherever you've installed it, $HOME/avr, /opt/avr, etc ) export AVRROOT=$AVR export AVRBIN=$AVRROOT/bin export AVRLIB=$AVRROOT/lib/avrlib export PATH=$AVR/bin:$PATH
these can be placed in your ~/.bashrc file
of course, the $AVRROOT should be where the user has placed the toolchain and avrlib ( /opt/avr and ~/avr are popular too )
there is a generated rc file in the root of the install dir as well, it can be modified to suit.
From avr-as –help
bash-3.1$ avr-as --help
Usage: avr-as [option...] [asmfile...]
Options:
-a[sub-option...] turn on listings
Sub-options [default hls]:
c omit false conditionals
d omit debugging directives
h include high-level source
l include assembly
m include macro expansions
n omit forms processing
s include symbols
=FILE list to FILE (must be last sub-option)
--alternate initially turn on alternate macro syntax
-D produce assembler debugging messages
--defsym SYM=VAL define symbol SYM to given value
--execstack require executable stack for this object
--noexecstack don't require executable stack for this object
-f skip whitespace and comment preprocessing
-g --gen-debug generate debugging information
--gstabs generate STABS debugging information
--gstabs+ generate STABS debug info with GNU extensions
--gdwarf-2 generate DWARF2 debugging information
--hash-size= set the hash table size close to
--help show this message and exit
--target-help show target specific options
-I DIR add DIR to search list for .include directives
-J don't warn about signed overflow
-K warn when differences altered for long displacements
-L,--keep-locals keep local symbols (e.g. starting with `L')
-M,--mri assemble in MRI compatibility mode
--MD FILE write dependency information in FILE (default none)
-nocpp ignored
-o OBJFILE name the object-file output OBJFILE (default a.out)
-R fold data section into text section
--reduce-memory-overheads
prefer smaller memory use at the cost of longer
assembly times
--statistics print various measured statistics from execution
--strip-local-absolute strip local absolute symbols
--traditional-format Use same format as native assembler when possible
--version print assembler version number and exit
-W --no-warn suppress warnings
--warn don't suppress warnings
--fatal-warnings treat warnings as errors
--itbl INSTTBL extend instruction set to include instructions
matching the specifications defined in file INSTTBL
-w ignored
-X ignored
-Z generate object file even after errors
--listing-lhs-width set the width in words of the output data column of
the listing
--listing-lhs-width2 set the width in words of the continuation lines
of the output data column; ignored if smaller than
the width of the first line
--listing-rhs-width set the max width in characters of the lines from
the source file
--listing-cont-lines set the maximum number of continuation lines used
for the output data column of the listing
@FILE read options from FILE
AVR options:
-mmcu=[avr-name] select microcontroller variant
[avr-name] can be:
avr1 - AT90S1200, ATtiny1x, ATtiny28
avr2 - AT90S2xxx, AT90S4xxx, AT90S8xxx, ATtiny22
avr3 - ATmega103, ATmega603
avr4 - ATmega83, ATmega85
avr5 - ATmega161, ATmega163, ATmega32, AT94K
or immediate microcontroller name.
-mall-opcodes accept all AVR opcodes, even if not supported by MCU
-mno-skip-bug disable warnings for skipping two-word instructions
(default for avr4, avr5)
-mno-wrap reject rjmp/rcall instructions with 8K wrap-around
(default for avr3, avr5)
Known MCU names:
avr1 avr2 avr3 avr4 avr5 avr6 at90s1200 attiny10 attiny11 attiny12
attiny15 attiny28 at90s2313 at90s2323 at90s2333 at90s2343 attiny22
attiny26 at90s4433 at90s4414 at90s4434 at90s8515 at90s8535 at90c8534
at86rf401 attiny13 attiny2313 attiny261 attiny461 attiny861 attiny24
attiny44 attiny84 attiny25 attiny45 attiny85 atmega603 atmega103
at43usb320 at43usb355 at76c711 atmega48 atmega8 atmega83 atmega85
atmega88 atmega8515 atmega8535 atmega8hva at90pwm1 at90pwm2 at90pwm3
atmega16 atmega161 atmega162 atmega163 atmega164p atmega165 atmega165p
atmega168 atmega169 atmega169p atmega32 atmega323 atmega324p atmega325
atmega325p atmega329 atmega329p atmega3250 atmega3250p atmega3290
atmega3290p atmega406 atmega64 atmega640 atmega644 atmega644p atmega128
atmega1280 atmega1281 atmega645 atmega649 atmega6450 atmega6490
atmega16hva at90can32 at90can64 at90can128 at90usb82 at90usb162
at90usb646 at90usb647 at90usb1286 at90usb1287 at94k atmega2560
atmega2561
Report bugs to
Using gdb, ddd, and simulavr with the 2006-03-05 AVR Toolchain
checking the simulator:
$ simulavr -L at90s1200 at90s2313 at90s4414 at90s8515 atmega8 atmega16 atmega103 atmega128 at43usb351 at43usb353 at43usb355 at43usb320 at43usb325 at43usb326
starting the simulator server
$ simulavr --device atmega8 --gdbserver Simulating a atmega8 device. devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TWBR' at 0x0020 ...[ lots more like this ]... avrcore.c:475: MESSAGE: attach: Internal SRAM from 0x0060 to 0x045f decoder.c:3875: MESSAGE: generating opcode lookup_table main.c:415: MESSAGE: Simulating clock frequency of 8000000 Hz Waiting on port 1212 for gdb client to connect...
now simulavr is ready to simulate an atmega8 and is waiting for a client to connect on TCP port 1212.
in the following example, the “stdiodemo” test elf from the avr-libc examples is used, and I started programs from within the base of the avr-libc examples dir.
avr-ddd --debugger $AVRROOT/bin/avr-gdb
(gdb) file stdiodemo/stdiodemo.elf
(gdb) target remote localhost:1212 Remote debugging using localhost:1212 0x00000000 in __vectors ()
(gdb) load Loading section .text, size 0x147c lma 0x0 Loading section .data, size 0x74 lma 0x147c Start address 0x0, load size 5360 Transfer rate: 2858666 bits/sec, 184 bytes/write.
(gdb) break stdiodemo.c:53 Breakpoint 1 at 0xce: file stdiodemo.c, line 53.
(gdb) step Single stepping until exit from function __vectors, which has no line number information. 0x00000064 in __init () (gdb) continue Continuing. Breakpoint 1, main () at stdiodemo.c:58
a screenshot showing the registers window:
a set of screenshots showing avr-ddd and simulavr’s display window.
the binary loaded into this version is a much simpler assembly program chosen to illustrate the simulavr display window. in the avr-ddd screenshot, I’ve marked the instruction that the debugger has just executed and the associated define, showing that it has just set the r16 register to 0xFF. in the simulavr display window screenshot, I’ve marked the section showing how the r16 register field reflects this change.
admittedly, this is not not terribly impressive, but it does show that the applications have the potential for practical use.
|
|
|
AVR Microcontrollers - Getting Started
Basic “getting started” needs
- a few AVRs
- a compiler/linker
- a mechanism to upload/download to/from the microcontroller
- breadboard
- a power supply
- various components ( LEDs, resisters for said, ect )