RPI Assembler tutorial 1

Het is waarschijnlijk veel nuttiger om een ‘high-level’ programeertaal te leren dan architectuurspecifieke assembler, maar het geeft wel een zeer goed idee in wat er in de processor gebeurt.

ARM op de RPI

ARM is een 32-bit architectuur dat als doel flexibiliteit heeft. Het is handig voor mensen die de vrijheid willen in het ontwerpen van hun eigen hardware, maar niet voor systeemontwikkelaars, die met de verschillen van ARM moeten werken.

Ik gebruik een RPI3B. Er zijn een aantal verschillen met ARM op de raspberrypi en de ‘standaard’ ARM assember. Dit word beter uitgelegd op de ARM website!

Assembler schrijven

Assembler is (voor alle architectuuren) een dunne laag boven de binaire code. binaire code is waarnaartoe je een programma compiled.

Als je assembler schrijft (ARM assembler) kan je computer dat niet uitvoeren. Hiervoor moet je daar de binaire code voor hebben. Dit kunnen we doen met een compiler (voor assembler ook wel assembler genoemd, omdat die de assembler ‘assembleerd’). Die binaire code, wat ook wel een executable wordt genoemd kan dan worden uitgevoerd op een computer (de rpi in dit geval).

Hiervoor kunnen we de GNU assembler gebruiken die in de GCC (Gnu Compiler Colection) zit die standaard op een raspberrypi is geinstaleerd.

Als je een text-editor opent (nano, emacs of vim in een terminal, leafpad of geany in een Desktop omgeving) kan je de bronbestanden (sourcefiles) openen. Deze hebben de extentie ‘.s’ Dat is de standaard voor ARM assembler

Het eerste programma

We moeten ergens beginnen, dus laat ons beginnen met een programmatje dat niets meer doet dan een error-code weergeven. Ik gebruik meestal engelstaalige comments. (die beginnen met /* en eindigen met */ in assembler)

/* -- first.s */
/* This is a comment */
.global main /* 'main' is our entry point and must be global */

main:          /* This is main */
    mov r0, #2 /* Put a 2 inside the register r0 */
    bx lr      /* Return from main */

sla dit op als ‘first.s’

om het te ‘assembleeren’ kun je:

as -o first.o first.s

gebruiken. Nu moet je het nog linken om een executable te krijgen:

gcc -o first first.o

nu kan je het uitvoeren

./first ; echo $?

Je zult normaal error code 2 moeten zien (of gewoon 2). Dat is die #2 die in de op de voorlaatste regel staat.

Alleen is code compilen met zo veel stappen niet echt handig dus kan je hiervoor een makefile gebruiken

# Makefile
all: first
 
first: first.o
    gcc -o $@ $+
 
first.o : first.s
    as -o $@ $<
 
clean:
    rm -vf first *.o

Uitleg bij wat er net gebeurd is

de eerste 2 regels zijn comments. deze worden gebruikt om weer te geven wat een stukje code doet, en worden niet uitgevoerd (de compiler negeert deze)

.global main /* 'main' is our entry point and must be global */

dit is iets wat de compiler vertelt dat het iets speciaals is. Het begint met een punt (.) en word gevolgd door de naam van de functie. .global moet wel, omdat de C runtime de main functie anders niet aanroept.

main:

Dit is een label. Elk label is opgemaakt als: ‘label: instructie’ Dit kan gesplitst worden over 2 regels (zoals hier)

mov r0, #2 /* Put a 2 inside the register r0 */

Dit is de instructie de 2 in register 0 zet. Dit overschrijft wat er in register 0 staat op dat moment.

bx lr      /* Return from main */

Dit betekend Branch Exchange. Dit beindigd ons programma

De error code is wat in r0 is opgeslagen. dit moet r0 zijn.

Dit was alles voor deel 1.

PureFTP Installatie op een Raspberrypi

om gemakkelijk bestanden over te brengen naar je raspberrypi kan je gebruik maken van ftp. Hiervoor gaan we pure-ftpd gebruiken wat je toelaat om ‘virtuele’ gebruikers toe te voegen en te verwijderen.

Pureftpd instaleren

pure-ftpd kan eenvoudig geïnstalleerd worden met

sudo apt-get install pure-ftpd

Dan moet je nog de ftpgroup gebruikersgroep en ftpuser gebruiker aanmaken. Deze gebruiker mag niet kunnen inloggen.

sudo groupadd ftpgroup sudo useradd ftpuser -g ftpgroup -s /sbin/nologin -d /dev/null

FTP map en virtuele gebruiker instellen.

om een FTP map aan te maken gebruik je als root (sudo)

mkdir /FTP sudo chown -R ftpuser:ftpgroup /FTP

om een gebruiker aan te maken bv ‘upload’ kan je

sudo pure-pw useradd upload -u ftpuser -g ftpgroup -d /FTP -m

gebruiken. Je zal wel nog een password moeten instellen. Als je een andere gebruiker wilt toevoegen, verander je gewoon ‘upload’ naar de gewenste gebruikersnaam. Als dat gedaan is, moet je een virtuele gebruikersdatabase aanmaken. Dit zal je telkens je een gebruiker maakt/verwijderd moeten doen.

sudo pure-pw mkdb

Er moet ook nog een auth-methode worden gezet

sudo ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/60puredb

Nu kan je pure-ftpd herstarten met

sudo service pure-ftpd restart

Test het met een programma zoals filezilla

Extra instellingen

Er zijn een heleboel extra instellingen die je kan aanpassen:

sudo nano /etc/pure-ftpd/conf/ChrootEveryone

en zet er ‘yes’. (en dan ctrl+X, y en enter om op te slaan). Verander ‘ChrootEveryone’ met het volgende en zet er de overeenkomende waarden er in

in ‘NoAnonymous’ zet je ‘yes’ in ‘AnonymousCantUpload’ zet je ‘yes’ in ‘AnonymousCanCreateDirs’ zet je ‘no’ in ‘DisplayDotFiles’ zet je ‘no’ in ‘DontResolve’ zet je ‘yes’ in ‘ProhibitDotFilesRead’ zet je ‘yes’ in ‘ProhibitDotFilesWrite’ zet je ‘yes’ in ‘FSCharset’ zet je ‘UTF-8’

Als je het nu herstart en inlogt met de ‘upload’ gebruiker kan je bestanden overzetten, als je inlogt met de ‘pi’ gebruiker kan je in de home-map van de pi user.

sudo service pure-ftpd restart

Skyz update 7

Ik heb het locatie systeem op skyz aangepast. Hiermee wordt op de startpagina je locatie beter ingeschat, hiervoor is wel locatietoegang nodig en het werkt het best op toestelen met gps. ook de voorspelingstijd op 16 dagen ingesteld, met een interval van 1 dag. Edit: Wegens bug is het terug per 5d, met een interval van 3u

Verbind met je raspberrypi vanaf een webbrowser (webmin tutorial)

Je kan je raspberrypi op verschillende manieren beheren. Met VNC en SSH zijn de meest gebruikte, maar deze vereisen dat er een programma is geïnstalleerd op de computer die je gebruikt om met je raspberrypi verbinding te maken. In deze tutorial leg ik uit hoe je webmin instelt om verbinding te maken via een web controle paneel.

Lees verder

Skyz update 6

Ik heb de laatste feature voor skyz afgewerkt. Nu kan je weerdata zien voor luchthavens (of andere weerstations die METAR data uitzenden) op basis van de ICAO code (Brussel is EBBR, Oostende is EBOS). Ook komt de beta-versie nu gewoon op de normale niet beta versie.