WOJSKOWA AKADEMIA TECHNICZNA
SYSTEMY WBUDOWANE
SPRAWOZDANIE
Z
ZADANIA LABORATORYJNEGO T3
Warsztat projektanta systemów mikrokomputerowych – środowiska uruchomieniowe
Grupa szkoleniowa: I7X6S1
Sprawozdanie wykonali : Michał Małek
Piotr Rusinowski
Andrzej Sobolewski
Prowadzący ćwiczenie: mgr inż. Waldemar Szylberg
Specyfikacja szczegółowych zadań określonych przez wykładowcę
Na podstawie dokumentacji technicznej
Określ wyposażenie techniczne zestawu laboratoryjnego
Dokonaj specyfikacji oprogramowania
Stanowiska do wytwarzania oprogramowania
Oprogramowania diagnostycznego łącza komunikacyjnego
Oprogramowania technologicznego
Oprogramowania stanowiącego system uruchomieniowy
Stanowiska do wytwarzania oprogramowania
Oprogramowanie komunikacyjne
Oprogramowanie typu terminal
Oprogramowanie typu monitor
Opracuj specyfikacje wymagań i zestawów testów akceptacji dla projektowanego mikrokomputerowego systemu wbudowanego
Przeprowadź konfigurację oprogramowania tworzącego system uruchomieniowy
FLASHLDR
LpwerCASE ApBuilder
ConcurrentSciences Soft-Scope Debugger
ConcurrentSciences CSI-Locates
ConcurentSciences CSI-Mon
SOFTPROBE
Opracuje zestaw makr automatyzujących procesy kompilacji, łączenia i osadzania oprogramowania użytkowego
Zaprojektuj i uruchom program o funkcjonalności określonej przez wykładowcę
Czyszczenie ekranu
Wyświetlanie wprowadzonej pozycji x oraz y
Na podanych współrzędnych x oraz y wyświetlanie gwiazdki w postaci :
* *
*
* *
Program wbudować i umiejscowić na płycie EV386EX. Następnie zweryfikować poprawność realizacji postawionych wymagań i wyniki przedstawić prowadzącemu ćwiczenie i zamieścić je w sprawozdaniu z ćwiczeń laboratoryjnych
Informacje dodatkowe
Do prezentacji wyników wykorzystać hyperterminal
Wyświetlanie zrealizować przy wykorzystaniu poleceń (sekwencji esc) zgodnych ze standardem ASCII
Transmisje poleceń wyświetlania terminala ANSI oprzeć na połączeniu przy pomocy interfejsu RS323C i funkcji transmisji danych udostępnianych w przykładzie HELLO
Wykorzystać przykład HELLO i modyfikując go zrealizować postawione wymagania
Osadź napisany program w pamięci flash komputera docelowego
Dokonaj odbioru systemu wbudowanego przeprowadzając wyspecyfikowane testy akceptacji
Specyfikacja elementów stanowiska laboratoryjnego
Elementy sprzętowe
Płyta INTEL EV386EX
Komputer klasy IBM PC
Oprogramowanie
Concurrent Sciences Soft-Scope
Dev-C++
Borland Turbo Assembler
Borland C/C++
Dokumentacja sekwencji esc – Internet
Opis konfiguracji stanowiska laboratoryjnego
Płyta Intel EV386EX (podłączona do zasilacza) jest połączona z komputerem klasy IBM PC za pomocą kabla szeregowego (RS232C). Kabel jest podłączony do portu COM1 na komputerze oraz portu COM1 na płycie EV386EX.
Oprogramowanie komputera hosta zostało wcześniej zainstalowane i prawidłowo skonfigurowane
Specyfikacja testów akceptacyjnych dla wytwarzanego systemu wbudowanego
Testy semantycznej poprawności wytwarzanego oprogramowania
Sprawdzenie poprawności napisanego programu jest możliwa w procesie kompilacji.
Aby uruchomić skrypt za pomocą którego zbudowany zostanie nasz program wpisujemy w linii poleceń ‘build.bat’. Jeśli zostaną utworzone pliki ‘hello.exe’ oraz ‘hello.hex’ oznacza to że nasz program został poprawnie zbudowany (jest poprawny pod względem semantycznym i syntaktycznym) i teraz należały skopiować plik ‘hello.hex’ do katalogu z którego uruchamiać będziemy program ‘flashldr.exe’. Jeśli powyższe dwa pliki nie zostały utworzone należy przejrzeć wynik wykonania skryptu bat w oknie konsoli sprawdzając w którym pliku powstały błędy podczas kompilacji po czym należy te błędy poprawić oraz powtórzyć ww. czynności.
Test poprawności załadowania oprogramowania
Po pozytywnym zakończeniu drugiego testu przystępujemy bo wbudowania utworzonego oprogramowania. Należy zrestartować płytę za pomocą przycisku RESET znajdującego się na jej powierzchni. Za pomocą programu Concurrent Sciences Soft-Scope należy załadować program do pamięci (plik ‘hello.hex’) płyty. Jeśli program załadował się poprawnie nie otrzymamy żadnych komunikatów od debuggera.
Test poprawności działania wbudowanego oprogramowania
Należy włączyć zasilanie na płycie EV386EX, a na komputerze-hoście uruchomić oprogramowanie terminala – program HyperTerminal. Po uruchomieniu programu należy wybrać port COM1 oraz ustawić prędkość transmisji na 38400 b/sek i wcisnąć przycisk ‘połącz’. Jeśli udało się nawiązać połączenie w lewym dolnym rogu powinien widnieć napis ‘Connected’ a w oknie terminala powinien być widoczny wynik działania wbudowanego programu. Jeśli nie mamy żadnego obrazu należy sprawdzić czy mamy połączenie, jeśli nie należy sprawdzić czy płyta EV386EX została włączona oraz czy wszystkie niezbędne kable są podłączone. Jeśli mamy połączenie a nadal nie widać żadnych wyników najprawdopodobniej jest błąd w działaniu naszego programu. W takim przypadku należy błąd usunąć i wrócić do testu nr 1.
Specyfikacje elementów stanowiska do testowania uruchamianego systemu wbudowanego
W celu przeprowadzenia testu uruchamianego oprogramowania wbudowanego na płytę Intel EV386EX potrzebujemy dodatkowego komputera zgodnego ze standardem IBM-PC wyposażonego w interfejs RS232C, dzięki któremu będziemy moli nawiązać połączenie, oprogramowanie terminalowe (u nas HyperTerminal) aby móc zaobserwować wynik działania wbudowanego oprogramowania.
Opis realizacji zadań postawionych przez wykładowcę
Wytworzenie oprogramowania
Zmodyfikowany przez nas fragment kodu programu ‘hello.c’ :
while(1)
{
while(DelayFlag); /* Wait until DelayFlag is cleared */
sprintf(doWyswietlenia4,"\x1B[32m\x1B[1;1Hx : ");
SerialWriteStr(SIO_PORT,doWyswietlenia4);
SerialReadStr(SIO_PORT, X, 3);
x=atoi(X);
sprintf(doWyswietlenia2,"\x1B[32m\x1B[1;4H%d",x);
SerialWriteStr(SIO_PORT,doWyswietlenia2);
sprintf(doWyswietlenia5,"\x1B[32m\x1B[3;1Hy : ");
SerialWriteStr(SIO_PORT,doWyswietlenia5);
SerialReadStr(SIO_PORT, Y, 3);
y=atoi(Y);
sprintf(doWyswietlenia3,"\x1B[32m\x1B[3;4H%d",y);
SerialWriteStr(SIO_PORT,doWyswietlenia3);
sprintf(doWyswietlenia,"\x1B[2J\x1B[32m\x1B[%d;%dH* *\x1B[%d;%dH*\x1B[%d;%dH* *",y,x,y+1,x+1,y+2,x);
SerialWriteStr(SIO_PORT,doWyswietlenia);
DelayFlag = 1;
}
Opis użytych sekwencji escpae :
\x1B[2J – czyszczenie ekranu
\x1B[32m – ustawienie koloru tekstu na zielony
\x1B[x;yHtext – przeniesienie kursora do pozycji (x,y) oraz wypisanie w tym miejscu tekstu text
Przygotowanie programu do wbudowania
Proces kompilacji został zautomatyzowany za pomocą dostarczonego pliku wsadowego ‘build.bat’, który wykorzystuje następujące narzędzia w procesie kompilacji:
bcc.exe – kompilator języka C++ firmy Borland
tasm.exe – kompilator języka Asembler firmy Borland
tlink.exe – linker w firmy Borland
csiloc.exe – lokator CSi - Locate firmy Concurrent Sciences, Inc.
Uruchomienie pliku wsadowego build.bat spowodowało skompilowanie plików hello.c, icu.c, rsetintr.c, timer.c, serial.c oraz rstartup.asm do postaci plików *.obj. Następnie za pomocą programu tlink.exe (linker) utworzony został plik hello.exe, jak również plik hello.map. Ostatnim krokiem było wykonanie programu csiloc.exe, który plik hello.map użył do wygenerowania pliku hello.hex (plik do wbudowania).
Przebieg procesu wbudowywania oprogramowania
Procedura wbudowywania oprogramowania polegała na zrestartowanie płyty za pomocą przycisku RESET, a następnie wgraniu do jej pamięci naszego programu (za pomocą debuggera Concurrent Sciences Soft-Scope).
Sprawdzanie poprawności działania systemu wbudowanego
Weryfikację funkcjonalności działania systemu wbudowanego dokonaliśmy za pomocą programu HyperTerminal. Przy jego pomocy nawiązano połączenie z płytą. Program prosił o podanie współrzędnych x oraz y, a następnie wyświetlał zadany tekst w podanym miejscu.
Raport z przeprowadzonych testów akceptacyjnych
Testy semantycznej poprawności wytwarzanego oprogramowania
Po uruchomieniu skryptu ‘build.bat’ cały proces kompilacji przeszedł bez błędów, utworzone zostały pliki ‘hello.exe’ oraz ‘hello.hex’. świadczy to o poprawności konfiguracji zainstalowanego oprogramowania oraz o poprawności napisanego oprogramowania pod względem semantycznym.
Zakończony pozytywnie.
Test poprawności załadowania oprogramowania
Po wgraniu wytworzonego systemu wbudowanego na płytę debugger nie zgłosił żadnych błędów.
Zakończony pozytywnie.
Test poprawności działania wbudowanego oprogramowania
Po włączeniu urządzenia oraz na komputerze hoście ustawieniu odpowiednich wartości dla połączenia w programie HyperTerminal system wbudowany poprawnie odczytywał współrzędne oraz w zadanym miejscu wyświetlał znak „gwiazdki”.
Zakończony pozytywnie.
Wnioski z przeprowadzonego ćwiczenia
Celem ćwiczenia było przygotowanie systemu wbudowanego działającego zgodnie z wytycznymi z punktu 1.5 sprawozdania. Zostało ono w pełni zrealizowane. Dużym ułatwieniem były gotowe skryptu bat ułatwiające przygotowanie oprogramowania do wbudowania oraz przykładowy program hello, który zmodyfikowaliśmy zgodnie z postawionymi wymaganiami. Ćwiczenie umożliwiło nam zapoznanie się z procesem wbudowywania oprogramowania oraz z procesem jego tworzenia.
Wydruk kodu źródłowego przygotowanego oprogramowania
/* Copyright (C) Intel Corporation 1994
All Rights Reserved.
The Software is provided "AS IS."
LIMITATION OF LIABILITY: NEITHER INTEL NOR ITS VENDORS OR AGENTS
SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA,
INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR
OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*/
#include "80386EX.h"
#include "EV386EX.h"
#include <string.h>
#include <conio.h>
#include <DOS.h>
#include <stdlib.h>
#include <stdio.h>
extern char far HelloString[];
void interrupt far TimerISR(void);
#define BAUD_CLKIN 1843200L /* Clock rate of COMCLK, ie. External clocking */
/* _DEBUG_ must be defined on the command Line.
The debugger uses SIO_0 for communications to host. So while under the
debugger we must avoid using SIO_0
*/
#if _DEBUG_ == 0
#define SIO_PORT SIO_1
#else
#define SIO_PORT SIO_0
#endif
#define TIMER TMR_1
char ABORT, _REALCVTVECTOR;
int DataSeg; /* Created for Assembly language Data Segment register initialization */
volatile int DelayFlag; /* Declare volatile so compiler does not optimize out accesses */
void main(void)
{
char doWyswietlenia[100],doWyswietlenia2[100],doWyswietlenia3[100],doWyswietlenia4[100],doWyswietlenia5[100],X[3],Y[3];
int x=1,y=1;
/********************************************
***** Initialize Peripherals *****
*********************************************/
#if _DEBUG_ == 0 /* Debugger uses & Initializes ICU Master*/
/* Initialize Interrupt Control Unit */
InitICU(ICU_TRIGGER_EDGE, /* Signal interrupt on rising edge, Master */
0x20, /* Vector base number of Master */
MCAS_IR2, /* Which IRQ is for cascade to Slave, Internal Slave connects to IR2 */
ICU_TRIGGER_EDGE, /* Signal interrupt on rising edge, Slave */
0x30, /* Vector base number of Slave */
0,0); /* Pins to connect externally, None for master or slave */
#else
InitICUSlave(ICU_TRIGGER_EDGE, 0x30, 0);
#endif
/* Place Timer interrupt service routine into interrupt vector table */
SetIRQVector( TimerISR, /* Address of Interrupt service routine */
TMR1_IRQ, /* IRQ for the Interrupt service routine, Not the vector number */
INTERRUPT_ISR); /* Type of Interrupt, INTERRUPT_TYPE Means IF flag is cleared, Real-mode parameter ignored */
/* Intialize Timer */
_SetEXRegWord(CLKPRS, 0x1f3); /* Initialize Clock prescale */
InitTimer(TIMER, /* Which Timer */
TMR_RATEGEN | TMR_CLK_BIN, /* Mode, Rate Generator (continuous), Binary clocking mode */
TMR_CLK_INTRN, /* Clocking Source - Internal */
TMR_OUT_ENABLE, /* Disable Clock output to pins */
0xFFFF, /* Initial Clock Counter value */
TMR_ENABLE); /* Enable Timer */
Disable8259Interrupt(IR1+IR5+IR6+IR7, IR0+IR1+IR3+IR4+IR5+IR6+IR7);
Enable8259Interrupt(IR2,IR2); /* Enable slave interrupt to master(IR2), Enable slave IR2 */
_enable(); /* Enable Interrupts */
/* Intialize Serial Port */
InitSIO(SIO_PORT, /* Which Serial Port */
SIO_8N1, /* Mode, 8-data, no parity, 1-stop */
SIO_MCR_RTS+SIO_MCR_DTR, /* Modem line controls */
9600, /* Baud Rate */
BAUD_CLKIN); /* Baud Clocking Rate */
DelayFlag = 0; /* Don't delay first string */
while(1)
{
while(DelayFlag); /* Wait until DelayFlag is cleared */
sprintf(doWyswietlenia4,"\x1B[32m\x1B[1;1Hx : ");
SerialWriteStr(SIO_PORT,doWyswietlenia4);
SerialReadStr(SIO_PORT, X, 3);
x=atoi(X);
sprintf(doWyswietlenia2,"\x1B[32m\x1B[1;4H%d",x);
SerialWriteStr(SIO_PORT,doWyswietlenia2);
sprintf(doWyswietlenia5,"\x1B[32m\x1B[3;1Hy : ");
SerialWriteStr(SIO_PORT,doWyswietlenia5);
SerialReadStr(SIO_PORT, Y, 3);
y=atoi(Y);
sprintf(doWyswietlenia3,"\x1B[32m\x1B[3;4H%d",y);
SerialWriteStr(SIO_PORT,doWyswietlenia3);
sprintf(doWyswietlenia,"\x1B[2J\x1B[32m\x1B[%d;%dH* *\x1B[%d;%dH*\x1B[%d;%dH* *",y,x,y+1,x+1,y+2,x);
SerialWriteStr(SIO_PORT,doWyswietlenia);
DelayFlag = 1;
}
}
void interrupt far TimerISR(void)
{
DelayFlag = 0;
NonSpecificEOI();
}