Porting (o cambio strategico)
da un embedded proprietario
a un Linux Embedded
problemi, soluzioni...
ed esperienze in evoluzione
commitsoftware
mobile apps
& mobile web
embedded
transport
back-end services
field-force
rich-client & web
cross-media
consulting, engineering, project delivery
background
■ sviluppo in C/C++
■
STL, templates, boost...
■ integrazione componenti nativi
■
■ COM, DLL,LIB, SO...
cross-compiling
■ x86, ARM,...
■ protocolli su socket
■
■ ASIO, winsocket
state-machines, vincoli temporali
esperienze embedded
Automazione e sistemi di controllo
■
distribuzione carburanti
■
■
componente outdoor per vendita
prodotti e accettazione pagamenti
trasporto pubblico
■
componente di scrittura e
validazione titoli di viaggio
Sistemi real-time per controllo remoto
■
tele-laboratorio
■
librerie protocollo RTAI su linux
summary
descrizione architettura
evoluzione dell'ambiente di sviluppo
nuovi componenti
nuovi strumenti
problemi incontrati, soluzioni adottate...
futuri miglioramenti
diagramma architetturale
spostamento funzionalità
su Linux (nuovo hardware)
comunicazione
seriale
prima
GPRS
GPS
TERMINALE
PROPRIETARIO
Back-end Server
Interface
dopo
GPRS
GPS
TERMINALE
LINUX
WLAN
RS 485 utente
RS 485 operatore
TERMINALE
PROPRIETARIO
Back-end Server
Interface
deploy componenti software
app monolitica
>>
comps distribuiti
GUI
APP FRAMEWORK
STATE
MACHINE
CONNECTION
MANAGER
BACKEND I/O
CARD I/O
porting elementi
su nuovo sistema
prima
dopo
CARD I/O
CONNECTION
MANAGER
GATEWAY
STATE
MACHINE
RS 485 utente
RS 485 operatore
BACKEND I/O
GUI
funzionalità sviluppate
■ creazione GUI e StateMachine (SM)
■ protocollo livello Sessione
■ comunicazione delle due applicazioni
■ solo su Linux
■ protocollo di livello Presentazione
■ gestione dei comandi SM >> GUI
■ gateway seriale
■ per regolare l'accesso alla seriale per comunicazione
Back-end da parte di più applicazioni
■ remotizzazione libreria Back-end I/O
modalità di programmazione
■ Prima:
■
■
■
■
Applicazione monolitica sviluppata su
Framework proprietario
maggiore attenzione alle risorse perchè più limitate
necessità di gestire la sincronizzazione fra i diversi
task all'interno dell'applicazione
no librerie di terze parti, incluse STL.
■ Dopo:
■
■
■
Applicazione distribuita su più componenti:
divisione dei compiti fra binari separati
unico e completo ambiente di sviluppo
■ debug non simulato
"...one of the most highly
regarded and expertly designed
C++ library projects in the
world."
"We aim to establish "existing
practice" and provide reference
implementations so that Boost
libraries are suitable for eventual
standardization."
1. Boost.Accumulators
2. Boost.Any
3. Boost.Array
4. Boost.Chrono 1.2.3
5. Boost.Concept_Check
6. Boost.Container
7. Boost.Date_Time
8. Boost.Foreach
9. Boost.Function
10. Boost.Functional/Hash
11. Boost.Heap
12. Boost.Interprocess
13. Boost.Intrusive
14. Boost.Lambda
15. Boost.Lexical_Cast 1.0
16. Boost.Move
17. Boost.MPI
18. Boost.Program_options
19. Boost.PropertyTree
20. Boost.Proto
21. Boost.Random
22. Boost.Ratio 1.0.1
23. Boost.Ref
24. Boost.Signals
25. Boost.Signals2
26. Boost.StaticAssert
27. Boost String
Algorithms Library
28. Thread 3.0.1
29. Boost.TR1
30. Boost.Tribool
31. Boost.Typeof
32. Boost.Units 1.1.0
33. Boost.Unordered
34. Boost.Variant
35. Boost.Xpressive
StateMachine Framework
■ framework descrittivo alto livello
■ definizione di stati e transizioni
■ con relative guardie ed azioni
■ conseguente pulizia del codice
■ nessun if di transizione
■ il framework ti "obbliga"
■ a creare più state machine
■ a definire stati "veri", non assimilabili a
funzioni o ad aggregati di stati
nuova State Machine
■ gerarchica
■ device adapter unica interfaccia
■
con primitive sul dispositivo
Boot SM
Device
Adapter
Serial SM
Back-end interface
SM
Main SM
Operator SM
Shift Management
SM
dettagli StateMachine (1/2)
MainSM espone verso le altre SM una serie di
metodi:
■ per l'interazione delle SM fra di loro, quali raise di eventi
template <class Evt>
boost::msm::back::execute_return SM_main_wrapper::process_event(Evt& ev)
{
return boost::static_pointer_cast<SM_Main>(fsm_)->process_event(ev);
}
■ per l'interazione con il DeviceAdapter
dettagli StateMachine (2/2)
esempio di dichiarazione di SM
// front-end: define the FSM structure
struct sm_main_: public msm::front::state_machine_def<sm_main_>
esempio di tabella di transizione
struct transition_table: mpl::vector<
//
Start
Event
Next Action
//+-----------------------------------------------------+----------------+------------+-----------+
a_row< st_start
, ev_init_start, SM_Boot, &v::Init > ,
_row< SM_Boot::exit_pt<acme::st_ini_exit>, none
, st_ini
>,
1. transizione con azione su base evento fra SM diverse
2. transizione senza azione su uscita da metodo nella stessa SM
compilazione del codice
■ compilazione in debug
■ tempi lunghi: alcune decine di minuti.
■ utilizzo di CLang invece di GCC
■ dimensioni elevate: circa 40Mb
■ in release non verificato inaccettabile
distribuzione binari di tali dimensioni
■ notevole utilizzo risorse (e.g. memoria RAM)
■ durante la compilazione
■ non sufficenti PC con 4Gb RAM
ambienti di sviluppo
■ GUI (sistema proprietario)
■ macchina Windows
■ Visual Studio 2008
■ simulatore del terminale proprietario
■ StateMachine
■ macchina Linux Ubuntu
■ CodeBlocks
■ Back-end Server Interface
■ non testabile in modalità debug (causa time-out)
■ "printf" logging su entrambi i terminali
improvements
■ StateMachine
■ Unit Test alcune funzionalità
■ uso librerie GTest e GMock
■ con GMock verifica transizioni SM
■ estendere test a tutte le funzionalità
■ su Linux possibililtà di usare Valgrind
■ individuare e risolvere eventuali
problemi di "memory leaks"
domande? commenti?
Grazie per la vostra attenzione...
Scarica

da un embedded proprietario a un Linux Embedded