Get the Flash Player to see this player.

time2online Joomla Extensions: Simple Video Flash Player Module
Pierwszy program

Mając już podstawy systemu Linux na urządzeniach wbudowanych możemy napisać nasz pierwszy program. Najprościej pokazać, to co już zrobiliśmy czyli wypisać jakieś informację na konsolę i zgasić diodę, gdy zostanie naciśnięty odpowiedni przycisk. Wiemy już w jakich plikach schowane są informację o portach GPIO oraz wiemy do jakich nóżek przylutowane są diody. Teraz wystarczy posklejać to w całość i odpalić program na naszym minikomputerze. Poniższy program czeka na naciśnięcie przycisku podłączonego do nóżki 26 (czyli user_key), gdy zostanie wykryty dany przycisk, to dioda podłączona do nóżki 164 (dioda led3) na chwilę gaśnie i zostaje wysłany odpowiedni komunikat na konsole. Gdy chcemy zamknąć aplikację, to wystarczy nacisnąć CTRL + C, program wykryje zdarzenie zamykania i wskoczy do procedury signal_ctrlic. W tej procedurze zwolni porty GPIO 164 i 26, aby można było ponownie je wykorzystać. Program jest także zabezpieczony przed zamykaniem procesu, gdy tylko chcemy zabić proces, to aplikacja wchodzi do procedury signal_kill i zwalnia porty GPIO. Cały program wygląda następująco:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>

#define PRZYCISK    "26"
#define DIODA    "164"    

//PROTOTYPY FUNKCJI
int export_GPIO(char gpio_pin[]);            //eksport wyprowadzenia do przesrzeni użytkownika
int unexport_GPIO(char gpio_pin[]);            //odeskportowanie wyprowadzenia do jądra
int direction_GPIO(char gpio_pin[], char direction[]);    //ustawienie kierunku "in"/"out"
int set_GPIO(char gpio_pin[], int value);        //ustawienie stanu wyjścia "0"/"1"
int check_GPIO (char gpio_pin[]);
static void signal_kill (int signo);
static void signal_ctrlic (int signo);

int main (int argc, char *argv[]){
 printf("Hello Kwiecie! Nacisnij przycisk, a zmieniesz stan diody led3");

while (export_GPIO(PRZYCISK)!=0){};
while (export_GPIO(DIODA)!=0){};

while (direction_GPIO(DIODA,"out")!=0){};
while (direction_GPIO(PRZYCISK,"in")!=0){};
 
 while (1){
 set_GPIO(DIODA, 0);
 if (!check_GPIO(PRZYCISK)){
 printf ("\n Nacisnales przycisk i dioda gasnie \n");
 set_GPIO(DIODA, 1);

 }

 if (signal (SIGTERM, signal_kill) == SIG_ERR){
 printf ("Blad obslugi sygnalu SIGTERM");
 exit(1);
 }
 if (signal (SIGINT, signal_ctrlic) == SIG_ERR){
 printf ("Blad obslugi sygnalu SIGTERM");
 exit(1);
 }
 sleep(1);
 }
 return 0;
}


/* ustawia numer portu GPIO, który będzie można dalej modyfikować i ustawiac jako wejść lub wyjście ------------------------------------------------------------------------------- */
int export_GPIO(char gpio_pin[]){

 FILE *fd;

 fd = fopen("/sys/class/gpio/export", "w");

 if (!fd){
 fprintf (stderr, "Blad otwarcia pliku\n");
 return -1;
 }else{
 fprintf (fd,"%s", gpio_pin);
 }
 fclose (fd);
 return 0;
}

/* zwalnia port GPIO wystarczy podać numer nóżki ------------------------------------------------------------------------------- */
int unexport_GPIO(char gpio_pin[]){    

 FILE *fd;
 
 fd = fopen("/sys/class/gpio/unexport", "w");

 if (!fd){
 fprintf (stderr, "Blad otwarcia pliku\n");
 return -1;
 }else{
 fprintf (fd,"%s", gpio_pin);
 }
 fclose (fd);
 return 0;
}

/* ustawia kierunek pinu in lub out ------------------------------------------------------------------------------- */
int direction_GPIO(char gpio_pin[], char direction[]){

 FILE *fd;
 char path [50] ="";

 strcat(path, "/sys/class/gpio/gpio");
 strcat(path, gpio_pin);
 strcat(path, "/direction");

 fd = fopen(path, "w");
 
 if (!fd){
 fprintf (stderr, "Blad otwarcia pliku\n");
 return -1;
 }else{
 fprintf (fd,"%s",direction);
 }
 fclose (fd);
 return 0;
}

/* ustawia wartość pinu 0 lub 1 ------------------------------------------------------------------------------- */
int set_GPIO(char gpio_pin[], int value){

 FILE *fd;
 char path [50] ="";

 strcat(path, "/sys/class/gpio/gpio");
 strcat(path, gpio_pin);
 strcat(path, "/value");

 fd = fopen(path, "w");
 
 if (!fd){
 fprintf (stderr, "Blad otwarcia pliku\n");
 return -1;
 }else{
 fprintf (fd,"%d", value);

 }
 fclose (fd);
 return 0;
}

/* sprawdza stan pinu i podaje 0 lub 1 ------------------------------------------------------------------------------- */
int check_GPIO(char gpio_pin[]){

 FILE *fd;
 char path [50] ="";
 char bufor [4];
 int temp;

 strcat(path, "/sys/class/gpio/gpio");
 strcat(path, gpio_pin);
 strcat(path, "/value");

 fd = fopen(path, "r");

 if (!fd){
 fprintf (stderr, "Blad otwarcia pliku\n");
 return -1;
 }else{

 if (!fgets(bufor,3,fd)){
 fprintf (stderr, "Blad odczytu danych\n");
 return -1;
 }else{
 temp = atoi (bufor);
 }
 }
 fclose (fd);
 return temp;
}

/* event dzięki któremu zwolnione są porty gpio po wyłączeniu programu za pomocą kill proces ------------------------------------------------------------------------------- */
static void signal_kill (int signo){
 unexport_GPIO(PRZYCISK);
 unexport_GPIO(DIODA);
 printf ("Zabiles process hello i zwolniles gpio\n");
 exit(1);
}
/* event dzięki któremu zwolnione są porty gpio po wyłączeniu programu za pomocą kill proces ------------------------------------------------------------------------------- */
static void signal_ctrlic (int signo){
 unexport_GPIO(PRZYCISK);
 unexport_GPIO(DIODA);
 printf ("Zamknales process hello za pomoca ctrl + c i zwolniles gpio\n");
 exit(1);
}

Mając już program trzeba go skompilować pod daną architekturę. My użyjemy do tego kompilatora zainstalowanego przy okazji kompilacji jądra, czyli arm-none-linux-gnueabi-. Aby nie wpisywać tych poleceń w konsole tworzymy plik Makefile o zawartości:

CROSS=arm-none-linux-gnueabi-

hello:
 $(CROSS)gcc -o hello hello.c
clean:
 @rm -vf hello *.o *~

Teraz wystarczy wejść do katalu z naszym plikiem i wywołać instrukcję "make". Zostanie utworzony plik hello, który należy wgrać na kartę SD (na partycję z plikami). Przy użyciu polecenia:

sudo cp hello /media/Angstrom/

Aby uruchomić program na minikomputerze należy wpisać jego nazwę np:

./hello
./hello &

W drugim poleceniu będziemy mieć kontrole nad konsolą i będziemy mogli wypróbować zabicie procesu, a w pierwszym odpaleniu będziecie mogli potestować zamykanie programu dzięki CTRL + C.

Kliknij, aby pobrać całość