Difference between revisions of "HelloWorld"
From ArmadeusWiki
(→Links) |
(→Putting it all together in a Makefile) |
||
(36 intermediate revisions by 7 users not shown) | |||
Line 1: | Line 1: | ||
+ | |||
On this page you will learn how to create your first C application for your Armadeus board | On this page you will learn how to create your first C application for your Armadeus board | ||
==Source code== | ==Source code== | ||
− | First take your favorite editor/IDE and create the following program: | + | *First take your favorite editor/IDE and create the following program: |
− | + | <source lang="c"> | |
− | + | #include <stdio.h> | |
− | + | #include <stdlib.h> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | Save it as hello.c | + | int main(int argc, char *argv[]) |
+ | { | ||
+ | printf( "APF says: Hello World ! ;-)\n" ); | ||
+ | exit(0); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | *Save it as ''hello.c'' in YOUR_ARMADEUS_PROJECT_PATH/target/demos/ directory. | ||
==Compilation== | ==Compilation== | ||
− | The C cross compiler is installed in '' | + | The C cross compiler is installed in ''buildroot/output/host/usr/bin/'' and is named ''arm-linux-gcc''. You can access it with the ''$ARMADEUS_TOOLCHAIN_PATH'' environment variable: |
+ | <pre class="host"> | ||
+ | $ cd YOUR_ARMADEUS_PROJECT_PATH/ | ||
+ | $ make shell_env | ||
+ | $ source ./armadeus_env.sh | ||
+ | $ echo $ARMADEUS_TOOLCHAIN_PATH | ||
+ | </pre> | ||
+ | |||
There are 2 possibilities to use it: | There are 2 possibilities to use it: | ||
− | * either add '' | + | * either add ''$ARMADEUS_TOOLCHAIN_PATH'' to your ''PATH'' environment variable and then call ''arm-linux-gcc'' instead of ''gcc'' |
− | * or call directly '' | + | * or call directly ''$ARMADEUS_TOOLCHAIN_PATH/arm-linux-gcc'' |
− | So to compile your small program | + | So to compile your small program (here ''hello.c'' was saved in ''armadeus/target/demos/'' directory) do: |
− | + | <pre class="host"> | |
+ | $ cd YOUR_ARMADEUS_PROJECT_PATH/target/demos/ | ||
+ | $ $ARMADEUS_TOOLCHAIN_PATH/arm-linux-gcc -o hello hello.c | ||
+ | </pre> | ||
+ | or | ||
+ | <pre class="host"> | ||
+ | $ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH | ||
+ | $ cd YOUR_ARMADEUS_PROJECT_PATH/target/demos/ | ||
+ | $ arm-linux-gcc -o hello hello.c | ||
+ | </pre> | ||
==Running== | ==Running== | ||
Copy your ''hello'' executable on your board either through TFTP or NFS | Copy your ''hello'' executable on your board either through TFTP or NFS | ||
===TFTP=== | ===TFTP=== | ||
− | Be sure to have TFTP server installed, [[Connection_with_U-Boot_on_Linux#TFTP_server| if not it's explained here]] | + | * Be sure to have TFTP server installed, [[Connection_with_U-Boot_on_Linux#TFTP_server| if not it's explained here]]. Copy ''hello'' to your TFTP directory: |
− | Copy ''hello'' to TFTP directory: | + | <pre class="host"> |
− | + | $ cp hello /tftpboot/ | |
− | Load your executable on the target (here my host IP is 192.168.0.2): | + | </pre> |
+ | * Load your executable on the target (here my host IP is 192.168.0.2): | ||
+ | <pre class="apf"> | ||
# tftp -g -r hello -l /usr/bin/hello 192.168.0.2 | # tftp -g -r hello -l /usr/bin/hello 192.168.0.2 | ||
− | Give it executable rights, if lost during TFTP transfer: | + | </pre> |
+ | * Give it executable rights, if lost during TFTP transfer: | ||
+ | <pre class="apf"> | ||
# chmod a+x /usr/bin/hello | # chmod a+x /usr/bin/hello | ||
− | Launch it: | + | </pre> |
+ | * Launch it: | ||
+ | <pre class="apf"> | ||
# /usr/bin/hello | # /usr/bin/hello | ||
− | + | APF says: Hello World ! ;-) | |
# | # | ||
+ | </pre> | ||
Now it's up to you ! ;-) | Now it's up to you ! ;-) | ||
===NFS=== | ===NFS=== | ||
− | Be sure to have NFS server installed, [[Network_Configuration| if not it's explained here]]< | + | * Be sure to have NFS server installed, [[Network_Configuration| if not it's explained here]]. I now assume that your server has 192.168.0.2 as IP address and ''/local/exports/'' as NFS export directory. |
− | I assume that your NFS drive is accessible from ''/mnt/host'' | + | * Copy your executable: |
− | Launch your prog: | + | <pre class="host"> |
− | + | $ cp hello /local/exports/ | |
+ | </pre> | ||
+ | * Mount NFS on your target (I assume that your NFS drive is accessible from ''/mnt/host'' on the target): | ||
+ | <pre class="apf"> | ||
+ | # mount -t nfs 192.168.0.2:/local/exports /mnt/host | ||
+ | </pre> | ||
+ | * Launch your prog: | ||
+ | <pre class="apf"> | ||
+ | # /mnt/host/hello | ||
+ | </pre> | ||
==Putting it all together in a Makefile== | ==Putting it all together in a Makefile== | ||
You can put your program compiling and copying in a ''Makefile'' to make things cleaner: | You can put your program compiling and copying in a ''Makefile'' to make things cleaner: | ||
− | + | <source lang="make"> | |
− | + | CC=arm-linux-gcc | |
− | + | CFLAGS=-W -Wall | |
− | + | LDFLAGS= | |
− | + | ||
− | + | EXEC=hello | |
+ | SRC=$(wildcard *.c) | ||
+ | OBJ=$(SRC:.c=.o) | ||
− | + | all: $(EXEC) | |
− | + | $(EXEC): $(OBJ) | |
− | + | $(CC) -o $@ $^ $(LDFLAGS) | |
− | + | %.o: %.c | |
− | + | $(CC) -o $@ -c $< $(CFLAGS) | |
− | + | .PHONY: clean install | |
− | + | clean: | |
− | + | rm -rf *.o | |
− | + | rm -f $(EXEC) | |
− | + | install: all | |
− | + | cp -f $(EXEC) /tftpboot/ | |
+ | </source> | ||
− | + | {{Warning| If you do a cut & paste with previous commands, don't forget to check TABS for each target (Makefiles are using TABS and not SPACES) !! In that case make will complains about a missing separator line 11}} | |
Then, just do: | Then, just do: | ||
− | + | <pre class="host"> | |
+ | $ make clean install | ||
+ | </pre> | ||
==Links== | ==Links== | ||
* [http://www.handhelds.org/minihowto/porting-software.html Things to know when porting x86 software to ARM] | * [http://www.handhelds.org/minihowto/porting-software.html Things to know when porting x86 software to ARM] | ||
− | * [http://gl.developpez.com/tutoriel/outil/makefile/ Les Makefiles, comment ça marche ?] | + | * [http://gl.developpez.com/tutoriel/outil/makefile/ Les Makefiles, comment ça marche ?] |
− | * [http://www.advancedlinuxprogramming-fr.org/doku.php Livre en ligne: Programmation Linux Avancée] | + | * [http://www.advancedlinuxprogramming-fr.org/doku.php Livre en ligne: Programmation Linux Avancée] |
+ | |||
+ | [[Category:Software]] | ||
+ | [[Category:Programming language]] |
Latest revision as of 20:14, 22 September 2015
On this page you will learn how to create your first C application for your Armadeus board
Contents
Source code
- First take your favorite editor/IDE and create the following program:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf( "APF says: Hello World ! ;-)\n" );
exit(0);
}
- Save it as hello.c in YOUR_ARMADEUS_PROJECT_PATH/target/demos/ directory.
Compilation
The C cross compiler is installed in buildroot/output/host/usr/bin/ and is named arm-linux-gcc. You can access it with the $ARMADEUS_TOOLCHAIN_PATH environment variable:
$ cd YOUR_ARMADEUS_PROJECT_PATH/ $ make shell_env $ source ./armadeus_env.sh $ echo $ARMADEUS_TOOLCHAIN_PATH
There are 2 possibilities to use it:
- either add $ARMADEUS_TOOLCHAIN_PATH to your PATH environment variable and then call arm-linux-gcc instead of gcc
- or call directly $ARMADEUS_TOOLCHAIN_PATH/arm-linux-gcc
So to compile your small program (here hello.c was saved in armadeus/target/demos/ directory) do:
$ cd YOUR_ARMADEUS_PROJECT_PATH/target/demos/ $ $ARMADEUS_TOOLCHAIN_PATH/arm-linux-gcc -o hello hello.c
or
$ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH $ cd YOUR_ARMADEUS_PROJECT_PATH/target/demos/ $ arm-linux-gcc -o hello hello.c
Running
Copy your hello executable on your board either through TFTP or NFS
TFTP
- Be sure to have TFTP server installed, if not it's explained here. Copy hello to your TFTP directory:
$ cp hello /tftpboot/
- Load your executable on the target (here my host IP is 192.168.0.2):
# tftp -g -r hello -l /usr/bin/hello 192.168.0.2
- Give it executable rights, if lost during TFTP transfer:
# chmod a+x /usr/bin/hello
- Launch it:
# /usr/bin/hello APF says: Hello World ! ;-) #
Now it's up to you ! ;-)
NFS
- Be sure to have NFS server installed, if not it's explained here. I now assume that your server has 192.168.0.2 as IP address and /local/exports/ as NFS export directory.
- Copy your executable:
$ cp hello /local/exports/
- Mount NFS on your target (I assume that your NFS drive is accessible from /mnt/host on the target):
# mount -t nfs 192.168.0.2:/local/exports /mnt/host
- Launch your prog:
# /mnt/host/hello
Putting it all together in a Makefile
You can put your program compiling and copying in a Makefile to make things cleaner:
CC=arm-linux-gcc
CFLAGS=-W -Wall
LDFLAGS=
EXEC=hello
SRC=$(wildcard *.c)
OBJ=$(SRC:.c=.o)
all: $(EXEC)
$(EXEC): $(OBJ)
$(CC) -o $@ $^ $(LDFLAGS)
%.o: %.c
$(CC) -o $@ -c $< $(CFLAGS)
.PHONY: clean install
clean:
rm -rf *.o
rm -f $(EXEC)
install: all
cp -f $(EXEC) /tftpboot/
Then, just do:
$ make clean install