Apelarea rutinelor scrise in limbaj de asamblare

Autor: Razvan Ionescu -10/06/2010-

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);
}

,

Ceva neclar in articolul de mai sus ? Ai vrea sa discuti cu cineva despre proiectul tau ? Vino in fiecare marti seara de la ora 19:00 la Intalnirea Tehnorama, sau ne poti contacta direct.
Vezi aici detalii complete.

Despre... Razvan Ionescu

Acest autor a publicat 8 articole.

Share

FacebookTwitterEmailWindows LiveTechnoratiDeliciousDiggStumbleponMyspaceLikedin

Trimite un comentariu