Tuesday, December 14, 2010

building arm toolchain, compiling, and loading into flash on stm32 discovery

you need macports for this to work

to build the arm toolchain go here:

in a terminal do:
git clone https://github.com/esden/summon-arm-toolchain.git

edit summon-arm-toolchain
set SUDO=sudo
set LIBSTM32_EN=1
save and go back to terminal

follow the instructions in the README

this will take a long time and you have to type in your password a few times

add ~/sat/bin to PATH in your .bash_profile

download this: http://www.robsons.org.uk/blinky.zip

unzip it, edit Makefile and everywhere it says arm-elf change it to arm-none-eabi
now run openocd and telnet localhost 4444

run these commands in telnet:
stm32x unlock
flash erase_sector 0 0 last
flash write_bank 0 ~/Downloads/blinky/blinky.bin 0
reset init

the green led should blink, the blue led should blink twice as fast, and when you hold the usr button the green led should stop blinking.


OpenOCD on OS X using flyswatter and stm32 discovery

Making OpenOCD talk to my flyswatter and stm32 discovery using jtag was kind of a pain. I'm going to write up some instructions on how i made it work in case someone else needs it in the future (or i have to do it again).

You need:
a breadboard
an stm32 discovery
a tin can tools flyswatter
OpenOCD from git (0.4.0 doesn't work)
most recent commit on version i'm using is on 12/10/2010, cbf48bed6a26279900ad00e6d6462a7f29676175
libftdi (0.18)

0) i removed solder bridges 11, 16, 17, and 18 but i'm not sure if that's necessary. i wasn't sure what the ST Link does when you power the board so i just disconnected sb11, sb17, and sb18. i shouldn't have removed sb16 so now i have to put a 510 ohm resistor between BOOT and ground.

1) libusb-compat:
sudo make install

2) libftdi:
sudo make install

3) edit openocd/tcl/target/stm32.cfg
after the line that says:
set _BSTAPID5 0x06418041
add a new line that says:
set _BSTAPID6 0x06420041
change the line that says:
-expected-id $_BSTAPID4 -expected-id $_BSTAPID5
-expected-id $_BSTAPID4 -expected-id $_BSTAPID5 -expected-id $_BSTAPID6

4) OpenOCD:
./autoreconf -i -f
./configure --enable-maintainer-mode --enable-ft2232_libftdi --enable-usbprog
sudo make install

5) create a file called openocd.cfg with these contents:

#daemon configuration
telnet_port 4444
gdb_port 3333

source [find interface/flyswatter.cfg]
source [find target/stm32.cfg]

#i'm not sure if setting WORKAREASIZE is essential, but the
#default is 16k (0x4000) which is more ram than the stm32
#discovery has so i lowered it

6) to run (in same directory as openocd.cfg):

7) to telnet in:
telnet localhost 4444

8) to probe flash:
flash probe 0

i haven't changed what's on the flash yet but i'll update once i get gcc compiled and have something to flash it with.

here's a picture of my flyswatter setup/breadboard/power supply

here's a picture of my crazy jtag octopus connection

Monday, June 21, 2010

automaticly balancing data when growing a cluster

I've been thinking about load balancing lately and how to dynamically grow a cluster and its data set. I'd like to define "balance factor" as follows:

If the number of nodes in the cluster grows by a factor of x, at some future point when the data set has also grown by a factor of x the balance factor is the ratio of the smallest node to the largest node.

In my use case it is impractical for any node to know the size of all the nodes. Load balancing decisions must be made probabilistically on limited data. Today I happened across this blog post, which is very applicable to my scenario. It presents a very good solution for load balancing between a fixed number of bins, but when adding nodes without taking the system offline it is useful to look at more than 2 random points to maximize balance factor.

I did some experiments on different values for x and n (where n is the number of random points examined), and experimentally determined an approximate equation for balance factor b:

b = 1-(1/x)^(n-1)

(by approximate I mean that it is close enough for the range of values I care about, which is x between 1.1 and 10 and n between 2 and 25. It might be exactly right but I don't have time to do a proof before band practice.)

If you actually want to use this though, you need to determine n given x and the desired b. With some manipulation we get:

n = 1 + log(1-b)/log(1/x)

Let me know if you found this useful.