C and assembly development introduction

From Hackspire
Revision as of 20:35, 30 March 2014 by Vogtinator (talk | contribs) (Small grammatical fixes and /usr/bin instead of /bin)
Jump to navigation Jump to search

This tutorial describes how to set up an environment and use the Ndless SDK to write native Ndless-compatible programs for the TI-Nspire on Linux.

If you are looking for a Windows tutorial, get one in the development resources of ndlessly.

This article is written for the Ndless SDK v3.6 and higher.

Setting up a development environment

Building and installing the toolchain and the SDK

  • Get the latest Ndless SDK build for C, C++ and assembly development on TI-Nspire.
You may also prefer to use the freshest in-development version of the Ndless SDK from GitHub. Just git-clone it:
git clone git://github.com/OlivierA/Ndless.git
  • Make sure your system has the following dependencies: GMP (libgmp-dev), MPFR (libmpfr-dev), MPC (libmpc-dev) and wget. Install them with your system's package manager if not.
  • Run the SDK's build_toolchain.sh script that will download and build a complete ARM toolchain compatible with Ndless, and install it to ~/ndless_toolchain (edit the PREFIX variable at the beginning of the script to change this). You don't need to be root for this.
cd Ndless-SDK/toolchain/
./build_toolchain.sh

Running the script again will continue from the last successful step (not redownloading everything for instance). At the end of a successful build you should see Done!. Alternatively you can verify the build using echo $?. 1 indicates a failure.

  • Now either:
    • If you don't like messing with PATH stuff, it's easy to just link the files inside. As root in the SDK's ndless/bin directory, run "link ./nspire-* /usr/bin/nspire-*" where * is replaced with gcc, as and ld.
    • Add the following folders to your PATH environment variable: /home/[you]/ndless_toolchain/bin and the SDK's Ndless-SDK/ndless/bin. ~/.bash_profile should be a good place for this, just add something like this to it:
export PATH="/home/[you]/ndless-toolchain/bin:/<path_to_SDK>/Ndless-SDK/ndless/bin:${PATH}"
  • Build the SDK, only if you are using the GitHub's clone version of the SDK:
cd Ndless
make

Verifying the installation

  • Open a console, and run:
$ nspire-gcc

If everything has been set up correctly you should see something similar to:

arm-none-eabi-gcc: no input files

nspire_emu setup

You can use the nspire_emu emulator for windows (nspire_emu/nspire_emu.exe) for testing on your computer. It runs in Wine. Follow the instructions in nspire_emu_resources/_ReadMe.txt of the SDK. The setup requires dumping boot images from your calculator and running nspire_emu/wrapper_nspire_emu.sh.

5-minute tutorial

As a convention for the next chapters, lines starting with $ are commands you should type in a console. Other lines are the command's output.

Your first build

Ndless comes with sample programs in the _samples/ directory of the Ndless SDK. We will try to build the C Hello World. Change the current directory of the console:

$ cd "<my_ndless_sdk_copy>/_samples/helloworld"

Check the content of the directory:

$ ls
Makefile  hello.c

A Makefile is a script which describes how to build the program. It is interpreted by GNU Make, which is run with the command make. So let's make the program:

$ make
nspire-gcc -Wall -W -marm -Os -c hello.c
mkdir -p .
nspire-ld-bflt  hello.o -o ./helloworld.tns

make tells us the different commands used during the building process.

nspire-gcc is Ndless's wrapper for the GNU C Compiler GCC, which compiles C and assembly source files to object files (here hello.o).

nspire-ld-bflt is the wrapper for the GNU linker ld, which combines object files to produce an executable in the bFLT binary format supported by Ndless.

A C program

Let's have a look at the Hello World source code hello.c. It follows the C conventions.

It has an entry point:

int main(void) {

and a return code (required but currently ignored by Ndless and the OS):

  return 0;
}

All Ndless programs require the standard include file, os.h:

#include <os.h>

This allows programs to call syscalls provided by the TI-Nspire Operating System. Some syscalls are functions from the C standard library, others are part of the C POSIX library. There are also functions of Nucleus RTOS on which is based the TI-Nspire OS.

We are also using the nspireio2 library provided with the SDK:

#include <nspireio2.h>

Let's now say hello with nspireio2:

	nio_console csl;
	lcd_ingray(); // because nspireio2 doesn't support colors
	clrscr(); // clear the screen
	// 53 columns, 29 rows. 0px offset for x/y.
	// Background color 0 (black), foreground color 15 (white)
	nio_InitConsole(&csl, 53, 29, 0, 0, 0, 15);
	nio_DrawConsole(&csl);
	nio_printf(&csl, "hello world!");
	wait_key_pressed();
	nio_CleanUp(&csl);

Your first program

You can copy the helloworld directory and start to adapt the source code.

If you want to create a program from scratch:

  • Create a new directory for the program
  • Type in a console:
cd "<your directory path>"
nspire-tools new <program>
where <program> is your program name. This will create a Makefile to build <program>.tns
  • Create a new .c file and edit your program
  • Run the make command to build it

Going further

  • Pick up a good C tutorial before writing your own programs
  • Learn the syntax of GNU Make's Makefiles to adapt them to your own build requirements
  • Learn to use GNU GCC features and extensions