Δήλωση μεταβλητών

 

Συγγραφέας: Πορλιδάς Δημήτριος

Βιογραφικό Σημείωμα

electronics@porlidas.gr

Facebook

Linkedin


 

 

Οι μεταβλητές είναι τα βασικά στοιχεία που διαπραγματεύεται ένα πρόγραμμα. Περιέχουν τιμές ή δεδομένα και μπορεί να έχουν μια σταθερή τιμή ή το περιεχόμενό τους να εξαρτάται από τις διεργασίες. Ανάλογα με τον τρόπο που θα δηλωθούν μπορούν να δεσμεύσουν μια μόνιμη ή προσωρινή περιοχή στη μνήμη ή να δεσμεύσουν έναν καταχωρητή του μικροελεγκτή. Δηλώνονται είτε στην αρχή του κώδικα μαζί με τις εντολές #include, είτε μέσα σε κάποιο μπλοκ ή ρουτίνα και αν απαιτείται είναι δυνατό να λάβουν αρχική τιμή:

#include <avr/io.h>

#include <util/delay.h>

unsigned char i=0xA0;

Με την παραπάνω εντολή δηλώνεται στην αρχή του κώδικα η μεταβλητή i με αρχική τιμή 0xA0. Οι μεταβλητές που δηλώνονται στην αρχή του κώδικα δεσμεύουν μόνιμες σταθερές θέσεις στη μνήμη και είναι ενεργές για όλη τη διάρκεια λειτουργίας του προγράμματος. Είναι ορατές από όλες τις ρουτίνες και το περιεχόμενό τους μπορεί να τροποποιηθεί από αυτές οποτεδήποτε.

Αν αντί για θέση στη μνήμη απαιτηθεί να δεσμεύσουν συγκεκριμένο καταχωρητή πρέπει να δηλωθούν ως register:

register unsigned char i asm("r3");

Με την παραπάνω εντολή δηλώνεται η μεταβλητή με ονομασία i στον καταχωρητή r3 του μικροελεγκτή. Οι καταχωρητές που είναι διαθέσιμοι για αυτή τη λειτουργία είναι οι r2 ως r15, αλλά οι r8 ως r15 κάποιες φορές είναι απαραίτητοι για χρήση από τον compiler. Επίσης υπάρχει πιθανότητα κάποιος καταχωρητής να χρησιμοποιείται από βιβλιοθήκες που είναι φορτωμένες. Για τους παραπάνω λόγους χρειάζεται προσοχή η δήλωση μεταβλητής σε καταχωρητή.

Όταν κάποια ρουτίνα χρησιμοποιεί μια μεταβλητή και συμβεί διακοπή, δεν είναι δυνατό να μεταβληθεί το περιεχόμενο της μεταβλητής από ρουτίνα της διακοπής. Αν όμως οι ανάγκες του προγράμματος απαιτούν να μεταβληθεί το περιεχόμενό της, τότε πρέπει να δηλωθεί ως volatile:

volatile unsigned char i;

Όταν οι μεταβλητές δηλώνονται μέσα σε κάποια διεργασία, είτε αυτή είναι συνάρτηση, είτε ρουτίνα ή μπλοκ, είναι τοπικές μεταβλητές και είναι προσωρινά ενεργές, για όσο διαρκεί η συγκεκριμένη διεργασία. Δεσμεύουν μια θέση στη μνήμη η οποία απελευθερώνεται μετά το τέλος της διεργασίας. Η χρήση τοπικών μεταβλητών, όπου είναι δυνατόν, είναι προτιμότερη γιατί ο compiler δημιουργεί κώδικα με λιγότερες απαιτήσεις σε μνήμη.

for (unsigned char i1 = 0; i1 < 16; i1++) { /* Your code here */ }

Με την παραπάνω εντολή δηλώνεται η μεταβλητή i1 στη ρουτίνα μιας εντολής for. Η μεταβλητή αυτή είναι ενεργή για όσο διαρκεί η ρουτίνα και στη συνέχεια απελευθερώνεται ο χώρος που καταλαμβάνει καθώς και η ονομασία της.

 Μια τοπική μεταβλητή μπορεί να παραμείνει ενεργή και να διατηρεί το περιεχόμενό της αν δηλωθεί ως static. Η μεταβλητή αυτή είναι αόρατη από το υπόλοιπο πρόγραμμα και το όνομά της μπορεί να χρησιμοποιηθεί και σε άλλες διεργασίες αλλά σε διαφορετικά μπλοκ ή ρουτίνες χωρίς να προκύψει σύγχυση.

static unsigned char i;

Οι μεταβλητές είναι δυνατό να εμφανίζονται και ως πίνακες οι οποίοι περιέχουν δεδομένα. Οι πίνακες όταν δηλώνονται γράφεται και η διάστασή τους, διαφορετικά ο compiler θα τους αποδώσει διάσταση 1. Όταν αρχικοποιείται ένας πίνακας κατά τη δήλωσή του, δε χρειάζεται να γραφεί η διάστασή του αλλά λαμβάνεται ως διάσταση το πλήθος των δεδομένων της αρχικοποίησης. Σε έναν πίνακα έχουμε τη δυνατότητα να εισάγουμε λιγότερα ή περισσότερα δεδομένα από τη διάστασή του. Σε περίπτωση που εισάγουμε λιγότερα, στις θέσεις που δεν έχουμε παρέμβει παραμένουν τα προηγούμενα δεδομένα ή μηδενικά αν δεν υπήρχαν δεδομένα. Σε περίπτωση που εισάγουμε περισσότερα, δίνοντας δείκτη μεγαλύτερο από τη διάσταση του πίνακα, τότε τα δεδομένα που εισάγουμε καταλαμβάνουν θέσεις στη μνήμη που ενδέχεται να είναι δεσμευμένες από δεδομένα του προγράμματος, με αποτέλεσμα να τα τροποποιήσουν και να δημιουργηθούν προβλήματα στη λειτουργία του προγράμματος.

Πιο συνηθισμένη μορφή είναι οι μονοδιάστατοι πίνακες οι οποίοι μπορούν να αποτελέσουν και μια σειρά δεδομένων (string):

unsigned char name[] = {'D','i','m','i','t','r','i','o','s',' ','P','o','r','l','i','d','a','s'};

                                         // 18 characters string with initial values

unsigned char name[10];                  // 10 characters string

Οι πολυδιάστατοι πίνακας δηλώνονται ως εξής:

int mat[2][2]={{3,7},{-6,4}};            // 2x2 matrix with initial values

int mat[10][4];                          // 10x4 matrix

Το μέγεθος των μεταβλητών μπορεί να είναι 8bit, 16bit, 32bit ή 64bit και μπορεί να είναι προσημασμένες ή μη. Όταν είναι μη προσημασμένες χαρακτηρίζονται ως unsigned. Οι προσημασμένες μεταβλητές έχουν τη μορφή του συμπληρώματος ως προς 2. Οι μεταβλητές ανάλογα με το μέγεθός τους δηλώνονται ως: char (8bit), int (16bit ή 32bit, ανάλογα με τον επεξεργαστή, στους AVR8 είναι 16bit), short (16bit), long (32bit). Το Atmel Studio 7.0 υποστηρίζει επίσης τη βιβλιοθήκη stdint.h για μεταβλητές συγκεκριμένου πλάτους με ονοματολογία int8_t, int16_t, int32_t, in64_t για προσημασμένες μεταβλητές 8, 16, 32, 64 bit και uint8_t, uint16_t, uint32_t, uin64_t αντίστοιχα, για μη προσημασμένες, καθώς και ολόκληρο το σετ της ίδιας βιβλιοθήκης για μεταβλητές και συναρτήσεις (http://www.cplusplus.com/reference/cstdint/).

 

©2016 Πορλιδάς Δημήτριος

 

 

Σας ευχαριστώ για την υποστήριξή σας ώστε να γίνει η ιστοσελίδα μου καλύτερη.

© 2016 Πορλιδάς Δημήτριος