Μπορείτε να δουλέψετε με το RS232 με έναν από τους παρακάτω τρόπους:
Στο ΚΥΠΕΣ του Τμήματος όπου οι σταθμοί εργασίας διαθέτουν συριακή θύρα RS232
Με απομακρυσμένη πρόσβαση (remote desktop) στο ΚΥΠΕΣ
Εγκαθιστώντας virtual serial ports στον χώρο σας
Σε κάθε περίπτωση θα πρέπει να λάβετε υπόψη σας τους περιορισμούς που βάζει ο djgpp compiler που σας ζητείται να χρησιμοποιήσετε στα πλαίσια της άσκησης.
Παρακάτω σας δίνονται οι περιγραφές ενός συνόλου Δραστηριοτήτων τις οποίες μπορείτε να εκτελέσετε ανάλογα με το που θέλετε να δώσετε έμφαση.
Σας συνιστώ να εκτελέσετε οπωσδήποτε τις activity 1 (action 2), activity 2, activity 3
Action 1 - Κρυπτογράφηση
Στόχος: Εξάσκηση με τις κατασκευές της C για χαμηλού επιπέδου προγραμματισμό (bitwise operations)
Aναπτύξτε και ελέγξτε την κρυπτογράφηση, αποκρυπτογράφηση στο δικό σας σταθμό εργασίας για να βεβαιωθείτε πως δουλεύει σωστά. Μια απλή υλοποίηση σε C μπορεί να γίνει χρησιμοποιώντας τις κατασκευές της C για χαμηλού επιπέδου προγραμματισμό (low level C constructs - bitwise operators).
Μια αναφορά σε lightweight cryptographic algorithms μπορείτε να βρείτε στο παρακάτω paper
Shah A., Engineer M. (2019) A Survey of Lightweight Cryptographic Algorithms for IoT-Based Applications. In: Tiwari S., Trivedi M., Mishra K., Misra A., Kumar K. (eds) Smart Innovations in Communication and Computational Sciences. Advances in Intelligent Systems and Computing, vol 851. Springer, Singapore. https://doi.org/10.1007/978-981-13-2414-7_27 https://link.springer.com/chapter/10.1007/978-981-13-2414-7_27Action 2 - Virtual Serial channel
Στόχος: H συσχέτιση του 2ου μέρους του μαθήματος (low level programming) με το 1ο (concurrent programming)
Αναπτύξτε μια εφαρμογή σε Java που θα έχει ένα Transmitter και έναν Receiver. Ο Transmitter θα δέχεται από τον χρήστη το όνομα ενός αρχείου και θα το στέλνει στον Receiver. Ο Receiver θα το παραλαμβάνει και θα το σώζει στο δίσκο σε ένα δικό του directory. H επικοινωνία θα γίνεται χρησιμοποιώντας ένα virtual serial channel που θα υλοποιήσετε εσείς. Αναπτύξτε το απλούστερο virtual serial channel που θα σας επιτρέψει να ελέγξετε την εφαρμογή transmitter/receiver στον ίδιο σταθμό εργασίας. Transmitter και Receiver μπορεί να είναι threads μιας εφαρμογής αλλά και ανεξάρτητες εφαρμογές που θα τρέχουν στον ίδιο σταθμό εργασίας αλλά ακόμη και σε διαφορετικούς. Θεωρήστε την υλοποίηση του virtual serial port για όλες τις παραπάνω περιπτώσεις. Προτείνατε και περιγράψτε λύσεις.
Στόχος: Κατανόηση των παραμέτρων επικοινωνίας του RS232
Action 1
Ελέγξατε τις παραμέτρους επικοινωνίας της θύρας επικοινωνίας RS232 αξιοποιώντας την κατάλληλη γραφική διεπαφή που σας προσφέρει το λειτουργικό σύστημα. Όπως μπορείτε να δείτε έχετε τη δυνατότητα να αλλάξετε τις παραμέτρους αυτές.
Action 2
Αναζητήστε και προτείνετε εναλλακτικές λύσεις για την περίπτωση που ο σταθμός εργασίας σας δεν διαθέτει θύρα RS232.
Στόχος: H διασφάλιση ενός λειτουργικού και αξιόπιστου καναλιού επικοινωνίας που θα διευκολύνει την ανάπτυξη των εφαρμογών σας transimtter and receiver.
Ελέγξατε την φυσική διασύνδεση μεταξύ αποστολέα – παραλήπτη. Τον έλεγχο αυτό μπορείτε να κάνετε χρησιμοποιώντας την εφαρμογή ComTest (http://seg.ece.upatras.gr/Courses/apt/docs/resources/ComTestPrj.zip ) ή ένα terminal.
Χρήση της εφαρμογής COM Test
1. Συνδέστε με το καλώδιο τις δύο θύρες που επιθυμείτε να ελέγξετε. Οι θύρες αυτές μπορεί να βρίσκονται στον ίδιο υπολογιστή ή σε διαφορετικούς.
2. Κατεβάστε από το eclass το αρχείο ComTestPrj.zip αποσυμπιέστε και εκτελέστε την εφαρμογή ComTestPrj.exe. Η εφαρμογή αυτή έχει υλοποιηθεί σε γλώσσα προγραμματισμού Delphi και μπορεί να εκτελεστεί σε λειτουργικό σύστημα Windows XP/2000/Vista.
3. Επιλέξτε ποια θύρα θα παίξει το ρόλο του παραλήπτη και ενεργοποιήστε την κάνοντας κλικ στο αντίστοιχο πλήκτρο Open. Επιπλέον βεβαιωθείτε πως αντίστοιχο το πεδίο Auto receive είναι επιλεγμένο.
4. Ενεργοποιήστε την θύρα που θα παίξει το ρόλο του αποστολέα κάνοντας κλικ στο αντίστοιχο πλήκτρο Open.
5. Γράψτε κάποιο κείμενο προς αποστολή στο πεδίο που βρίσκετε δίπλα στο κουμπί Transmit και αντιστοιχεί στη θύρα αποστολέα και πατήστε το κουμπί Transmit. Το κείμενο θα εμφανιστεί στην μεριά του παραλήπτη, εφόσον το πεδίο Auto receive είναι επιλεγμένο.
H εφαρμογή ComTest χρησιμοποιεί τις παρακάτω παραμέτρους επικοινωνίας
Baud rate: 9600 Parity: oddStop bits: 2Character size: 8 bitsAction 1
Προτείνατε εναλλακτικό τρόπο ελέγχου της φυσικής διασύνδεσης χωρίς τη χρήση της ComTest.
Action 2
Μπορείτε να γράψετε και διαβάσετε στις/από τις σειριακές θύρες αξιοποιώντας το redirection του λειτουργικού συστήματος; Δοκιμάστε το στην πράξη.
Στόχος:
Α) Να δουλέψετε σε ARM based embedded board που δεν διαθέτει OS
Β) Να δείτε πως μπορείτε να αναπτύξετε transmitter and reciever σε ARM based embedded board στο οποίο δεν υπάρχει OS (Mbed NXP LPC1768, FRDM KL25Z)
Ως embedded boards μπορούν να χρησιμοποιηθούν τα:
FRDM KL25Z, και
Raspberry Pi (διαθέτει OS).
Προσέξτε πως για την σύνδεση του embedded board με τον host απαιτείται RS-232 to TTL Converter.
Στόχος: Να δουλέψετε με τον πιο απλό τρόπο αξιοποίησης πόρων του υλικού στο application layer σε σύστημα που διαθέτει OS και σε σύστημα που δεν διαθέτει OS.
Action 1 - Host PC
Αναπτύξτε την εφαρμογή transmitter στην πλευρά του Personal Computer
Action 2 - embedded board
Αναπτύξτε την εφαρμογή receiver στην πλευρά του embedded board. Έχετε τις παρακάτω επιλογές:
Receiver στα Mbed NXP LPC1768 και FRDM KL25Z ως Embedded board
Receiver στο Raspberry ως Embedded board
Για το Raspberry μπορείτε να αξιοποιήσετε τα:
1. Το API που ορίζεται στο Pi4J project. Το API αυτό σας επιτρέπει να διαχειριστείτε GPIO pins και να διασυνδεθείτε με συσκευές πάνω από I2C, SPI, και UART.
2. Το Device I/O API
Στόχος: Να δείτε πως μπορείτε να αξιοποιήσετε πόρους του υλικού από το application layer με άμεση πρόσβαση στο υλικό σε συστήματα με και χωρίς OS.
Action 1 - Host PC
Χρησιμοποιήστε τις συναρτήσεις που σας δίνει ο μεταγλωττιστής σας για άμεση πρόσβαση σε port mapped Ι/Ο (δες pc.h για τον djgpp) για να αναπτύξετε τις συναρτήσεις για ανάγνωση και εγγραφή στο UART.
Σε πρώτη φάση σας συνιστώ να αποφύγετε την ανάπτυξη της συνάρτησης αρχικοποίησης του UART. Χρησιμοποιήστε προς το παρόν την com_init της libcom. Εναλλακτικά μπορείτε να χρησιμοποιήσετε για αρχικοποίηση του UART την συνάρτηση σας την βασισμένη στο αντίστοιχο OS service (για την περίπτωση μας την βασισμένη στο service του BIOS - δες Activity No 7).
H ανάπτυξη της συνάρτησης αρχικοποίησης (initialization) με άμεση πρόσβαση θέλει ιδιαίτερη προσοχή καθώς δεν υπάρχει συμβατότητα μεταξύ του format της λέξης αρχικοποίησης που χρησιμοποιούμε στον al register για την αρχικοποίηση με service του OS και του format του line control register (δες page 11 8250 data sheet στο 1ο μέρος του βασικού συγγράμματος).
Σχόλιο:
Για αξιοποίηση των συναρτήσεων στο djgpp συμπεριλάβετε το αρχείο pc.h και χρησιμοποιήστε τις inportb() και outportb()
Στο openWatcom συμπεριλάβετε το αρχείο conio.h και χρησιμοποιήστε τις inp() και outp().
Action 2 - Mbed NXP LPC1768 ως prototyping board
Για πληροφορίες σχετικά με άμεση πρόσβαση στο υλικό για το Mbed NXP LPC1768 prototyping board ανατρέξτε στο κεφάλαιο 15 (Chapter 15: LPC176x/5x UART1) του User Manual
UM10360, LPC176x/5x User manual, Rev. 3.1 — 2 April 2014
http://www.nxp.com/documents/user_manual/UM10360.pdf
Ένα παράδειγμα με άμεση πρόσβαση στους καταχωρητές του UART θα βρείτε στην σελίδα https://developer.mbed.org/users/4180_1/notebook/cc-io-register-names/
Στόχος: Να δείτε πως μπορείτε να αξιοποιήσετε πόρους του υλικού από το application layer μέσα από υπηρεσίες του λειτουργικού συστήματος (OS services).
Action 1
Χρησιμοποιήστε τις υπηρεσίες του λειτουργικού σας συστήματος για να βρείτε τις θέσεις μνήμης οι οποίες έχουν ανατεθεί στις θύρες που σκοπεύετε να χρησιμοποιήσετε.
Ορίστε τις παραμέτρους επικοινωνίας της θύρας επικοινωνίας RS232 αξιοποιώντας την κατάλληλη γραφική διεπαφή που σας προσφέρει το λειτουργικό σύστημα.
Action 2
Αξιοποιήστε τις υπηρεσίες του ΒΙOS που υποστηρίζουν την RS232 επικοινωνία και αναπτύξτε τις βασικές συναρτήσεις διαχείρισης που απαιτούνται για την ανάπτυξης μιας εφαρμογής που θα σας επιτρέπει να μεταφέρετε ένα αρχείο πάνω από το RS232 από έναν host σε έναν embedded board.
Action 3
Χρησιμοποιήστε τις παραπάνω συναρτήσεις και αναπτύξτε μια εφαρμογή που θα σας επιτρέπει να μεταφέρετε πάνω από το RS232 ένα αρχείο από έναν host σε έναν embedded board.
Στόχος: Να δείτε πως μπορείτε να αξιοποιήσετε πόρους του υλικού από το application layer με αξιοποίηση assembly code σε transmitter and reciever implemented in C.
Μπορείτε να δώσετε μια έκδοση με in-line assembly για κάθε μια από τις εναλλακτικές υλοποιήσεις που δώσατε παραπάνω, δηλαδή, άμεση πρόσβαση στο υλικό και χρήση υπηρεσιών του λειτουργικού συστήματος. Μπορείτε ακόμη αν θέλετε να δώσετε έκδοση με in-line assembly και για την περίπτωση της χρήσης βιβλιοθήκης τρίτου κατασκευαστή, χωρίς αυτό βέβαια να έχει πρακτικό ενδιαφέρον.
Δώστε σε πρώτη φάση το σώμα των συναρτήσεων χρησιμοποιώντας την κλασσική in-line assembly που είδαμε στην παράδοση. Τον κώδικα αυτό μπορείτε να χρησιμοποιήσετε με πολλούς μεταγλωττιστές (Microsoft, Borland, Watcom,…) όχι όμως με τον gcc.
Στη συνέχεια αξιοποιώντας την τεκμηρίωση που θα βρείτε στο DJGPP QuickAsm Programming Guide http://www.imm.dtu.dk/courses/02130/djasm.html μπορείτε να δώσετε το σώμα για τον DJGPP compiler σας.
Using in-line Assembly
Για την ανάπτυξη των συναρτήσεων για την RS232 με χρήση inline assembly έχετε δύο επιλογές:
Α. χρησιμοποιείτε την κλασική assembly σύνταξη της Intel, η οποία έχει αναφερθεί στο μάθημα, με κάποιον συμβατό compiler όπως οι:
Borland Turbo C (http://dn.codegear.com/article/20841)
Watcom C/C++ (http://www.openwatcom.org/index.php/Download)
Β. χρησιμοποιείτε την AT&T assembly σύνταξη, η οποία υποστηρίζεται από τον GCC compiler (άρα και τον DJGPP).
Πληροφορίες για την AT&T σύνταξη και την χρήση της στο GCC (DJGPP) μπορείτε να βρείτε στους παρακάτω συνδέσμους:
http://www.ibm.com/developerworks/library/l-ia.html
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s2
Στόχος: Να δείτε πως μπορείτε να αξιοποιήσετε πιο αποδοτικά (από τους παραπάνω τρόπους) πόρους του υλικού από το application layer.
Action 1 - Host PC
Προσπαθήστε να υλοποιήσετε σε πρώτη φάση τουλάχιστο μια ISR για ανάγνωση χαρακτήρα από το UART. Οι παρακάτω σύνδεσμοι σας δίνουν την βασική πληροφορία που χρειάζεστε για το έργο αυτό.
How do I register my DJGPP function as a hardware interrupt handler?
http://www.delorie.com/djgpp/v2faq/faq18_9.html
Interrupt handler example
http://www.ee.nmt.edu/~rison/ee352_spr00/supp/000128/timer_int.html
Interrupts and Handlers Part 1
http://www.delorie.com/djgpp/doc/ug/interrupts/inthandlers1.html
Action 2 - Mbed NXP LPC1768 ως prototyping board
Μελετήστε τον τρόπο που το NXP LPC1768 υποστηρίζει την δυνατότητα αυτή.
Στις διαλέξεις του μαθήματος δίνονται οι βασικές πληροφορίες για μια υλοποίηση βασισμένη πάνω στην βιβλιοθήκη mbed. Σε πρώτη φάση δουλέψτε μόνο με το mbed και αναπτύξτε μια εφαρμογή που θα χρησιμοποιεί την σειριακή με loopback. Στη συνέχεια μπορείτε να δοκιμάσετε τις χρήση των διακοπών στην επικοινωνία με τον host πάνω από πραγματική σειριακή σύνδεση. Χρησιμοποιήστε σε πρώτη φάση terminal από την μεριά του host. To απαραίτητο υλικό δόθηκε στις διαλέξεις του μαθήματος.
Action 2.1
Συνδέστε τις ακίδες 9 και 10 και αναπτύξτε μια εφαρμογή που θα διαβάζει από τον χρήστη μια πρόταση και θα την βάζει σε ένα buffer (ονομάστε τον txBuffer). Στην συνέχεια θα την παίρνει από τον buffer και θα την τυπώνει στον host.
Action 2.2
Τροποποιήστε την παραπάνω εφαρμογή ορίζοντας έναν ακόμη buffer rxBuffer. Φτιάξτε μια συνάρτηση sendLine() που θα διαβάζει τους χαρακτήρες από τον txBuffer και θα τους γράφει στην σειριακή. Βάλτε την ως ISR στο TxIrq. Διασφαλίστε τον αμοιβαίο αποκλεισμό στην πρόσβαση του txBuffer.
Στην sendLine ISR φροντίστε να στείλετε τον πρώτο χαρακτήρα του txBuffer ώστε να ενεργοποιηθούν οι διακοπές αν αυτές είχαν σταματήσει γιατί άδειασε ο txBuffer.
if (com.writeable() && (txBuffer was empty)) {
Get fisrt charater from Send first character
Send character to serial to start tx interrupts, if stopped
//com.putc(char);
}
Φτιάξτε μια συνάρτηση readLine() που θα διαβάζει τους χαρακτήρες από την σειριακή και θα τους γράφει στον rxBuffer. Βάλτε την ως ISR στο RxIrq της σειριακής. Διασφαλίστε τον αμοιβαίο αποκλεισμό στην πρόσβαση του rxBuffer.
Action 2.3
Μετατρέψτε τους buffer txBuffer και rxBuffer σε κυκλικούς.
Σύγκριση των εναλλακτικών υλοποιήσεων με βάση το CPU time.
Μέτρηση του χρόνου (CPU time) που δαπανάται για την αποστολή και για την λήψη χαρακτήρα για κάθε μία από τις εναλλακτικές μεθόδους που υλοποιήσατε.
Τα παρακάτω στοιχεία έχουν ενδιαφέρον σε μια τέτοια σύγκριση:
average, standard deviation, min, max and 99,5 %.
Κάντε μια προσπάθεια αιτιολόγησης των αποτελεσμάτων.
Περιγράψτε την διαδικασία που ακολουθήσατε και τον τρόπο με τον οποίο κάνατε τις μετρήσεις.
Για την βελτίωση της απόδοσης της εφαρμογής σας είναι σκόπιμο να βελτιώσετε τον χρόνο εκτέλεσης επιλεγμένων συναρτήσεων. Μπορείτε να χρησιμοποιήσετε τον GNU Profiler gprof.
Ένα παράδειγμα εφαρμογής για το mbed μπορείτε να βρείτε στο παρακάτω σύνδεσμο https://developer.mbed.org/users/ykuroda/code/iSerial/
όπου συγκρίνονται οι 2 υλοποιήσεις βιβλιοθήκες Serial και iSerial.
“OBEX (abbreviation of OBject EXchange, also termed IrOBEX) is a communications protocol that facilitates the exchange of binary objects between devices.” Source: WikiPedia
“OBEX is a transfer protocol that defines data objects and a communication protocol two devices can use to exchange those objects. OBEX is designed to enable devices supporting infrared communication to exchange a wide variety of data and commands in a resource-sensitive standardized fashion.” Bluetooth
Εξετάστε τη δυνατότητα χρησιμοποίησης του πρωτοκόλλου OBEX πάνω από το RS232.
“Although OBEX was initially designed for infrared, it has now been adopted by Bluetooth, and is also used over RS-232, USB, WAP, …” Source: WikiPedia