Operating Systems for Embedded Computing (2007) - lab2
Operating Systems for Embedded Computing
Lab Assignment 2 - The Nibbles Contest
Within this lab assignment you have to develop a limited version of
the famous Snake/Nibbles game for the Lego NXT hardware. The idea
of this lab are due to Simon Kågström from BTH
(
Simons original lab). The primary learning objective of this lab is to get in
touch with an embedded developer board and the usage of the basic
tool-chain for embedded software including cross-compilers and boot
monitors. The Lego NXT contains a 32-Bit ARM7 RISC-processor
produced by Atmel and in addition an ATMEL AVR 8-Bit
microcontroller for handling I/O. The availability of many
peripherials makes the Lego NXT an ideal candidate for experiencing
an embedded system.
The learning objectives of this lab are:
- architecture and programming of RISC processors (ARM)
- understanding of the development process for embedded devices
- tool-chain for ARM (cross compilation, linking, boot assistant/loader)
- low level assembler programming for RISC-architectures
- driver development / heardware-near programming
- code size optimization
The primary task of this lab is to create a version of the Nibbles game with minimal code size. You can use direct assembly programming for optimizing the code size. The Nibbles game must fullfill the following specification:
- The game must be playable
- The game area must have at least 16x16 pixel.
- All 4 buttons must be used.
- When eating an apple the snake's lengths must increase.
- The initial lenghts of the snake must be one.
- The snake and the apples should be visualized as pixels (one apple one pixel). Please use the SuperPixel-functions for bigger pixels.
- The initial number of apples must be configurable (by implementing the function start_game(int apples)). The number of apples is always greater or equal than one.
- The configured number of apples must be visable all time (except at the point in time when the snake eats an apple and when the snake is longer than the maximum number of pixels on the play field minus the number of configured apples).
- The snake should start in the center of the game area.
- When the snake hits itself the function start_game must return.
- At the end of the playing field, the snake should "rotate" to the other end
- The game should be implemented in ARM-Assembler (Thumb- or ARM-Mode).
- The Assembler-Source must be commented. You are allowed to start from a C-Version of the game.
- The game should be translated with the arm-elf-gcc cross-compiler.
- The team with the smallest code size (.text segments and .data segments of all functions - main, start_game plus your own functions - use: "arm-elf-objdump - h sam7s256.o" for determining your code size)
- You are allowed to use all functions already provided in the start-kit.
Getting Started
At first you have to set-up a build-environment for the
ARM-processor. You need the arm-elf-gcc on your development
computer and the libnxt-utils for downloading program images onto
the NXT main unit. Libnxt supports 2 modes. One for burning the
program image into the internal flash memory and one for direct
transfer and execution from RAM. The two modes can be configured in
the makefile of the start-kit.
The start-kit
contains a few files from the
original Lego firmware
and a few ATMEL-specific low-level functions. After the
installation of the build environment you can compile a small demo
program by entering "make" in the directory of the extracted
start-kit. You must connect the Lego NXT main unit via USB and can
then download the program image (m_sched.bin) by entering "fwexec
m_sched.bin". In order to be able to download the program you must
start the NXT main unit in reset mode by pushing the small button
at the back (close to the USB-port). The main program of the demo
program should be used as the starting point for the nibbles game.
You have to edit the file program.c. The start-kit gives already a
simple frame for handling the buttons and for drawing on the
screen.
Useful ATMEL Documentation:
- AT91-ARM-Documentation (The Lego NXT incoorperates the AT91SAM7S256)
- ARM7TDMI Technical Reference Manual (including an overview of ARM assembler programming)
You should start implementing a version of the game on your desktop computer. For Windows you can use Bernhard Rabe's
Win32-SnakeRuntime
. Torsten Becker ported Bernhard's runtime to ncurses. You can find it
here
.
Have fun with this lab and may the smallest nibbler win!
Highscores:
Martin & Wolfgang | 0xDC |
Arne & Christoph | 0xDC |
Frederik & Torsten & Lars | 0xE1 |
Stefan & Jan-Arne | 0xE4 |
Andreas R. | 0x11C |
Frank & Christoph | 0x134 |
Frank & Robert | 0x15A |
Fabian & Andreas | 0x1FE |
Ville & Antoine | 0x2B6 |