joi, 10 iunie 2010

Arduino si Assembler

Apelarea rutinelor scrise in limbaj de asamblare
Din mai multe motive poate fi necesar sa folosim rutine scrise in limbaj de asamblare. De exemplu: lipsa spatiului, viteza, siguranta sau, pur si simplu, faptul ca dispunem deja de ele si nu vrem sa le rescriem ;-)
Exista doua feluri in care putem utiliza in sketch-urile Arduino limbajul de asamblare:
1. Inline, asa cum e documentat in AVR GCC Inline Assembler Cookbook, cu o sintaxa destul de complexa
sau
2. Incepand cu versiunea 0018 se pot utiliza programe scrise in intregime in assembler. Dupa cautari fara succes pe forumul Arduino si diverse incercari, am ajuns la urmatoarea varianta:
- in folderul libraries din kitul Arduino facem un nou folder, cu un nume gen "UtileASM"
- in acest folder facem un fisier header, gen "UtileASM.h"

extern "C" {
void Incrementeaza(void);
}

- tot in acest folder salvam fisierul cu programul in limbaj de asamblare, gen "UtileASM.S" atentie la extensia care trebuie scrisa cu majuscula ".S" si nu ".s"

#include <avr/io.h>
.extern un_numar
.global Incrementeaza
Incrementeaza:
push r16
lds r16, un_numar
inc r16
sts un_numar, r16
pop r16
ret

- sketch-ul va contine ceva gen:

/*
Titlu: Demonstratie Arduino si Assembler
Autor: [iard]
Data: 2010-06-09
*/

#include <UtileASM.h>

volatile int un_numar; // variabila in RAM, nu intr-un registru
extern void Incrementeaza(void);

void setup() {
Serial.begin(9600);
}

void loop() {
un_numar = 7; // valoare initiala
Serial.print("Numarul initial = " );
Serial.println(un_numar);
Incrementeaza(); // apelul subrutinei assembler
Serial.print("Numarul incrementat = " );
Serial.println(un_numar);
delay(1000);
}

Niciun comentariu:

Trimiteți un comentariu