C embedded – State machine

Utilizarea „State Machine”-ilor (SM) este larg rapandita in programare. Un SM este un automat de stari programat sa execute anumite functii in corelatie cu anumite evenimente si semnale externe.
Decizii de design :
– Reprezentarea evenimentelor
– Reprezentarea starilor
– Reprezentarea tranzitiilor
– Distribuirea evenimentelor catre StateMachine

Metode si modele de creere a unui SM :
– Switch-uri imbricate
– Tabel de stari
– OO State Design Pattern
– Abordare mixta

Cereintele unui SM:
– Intretinerea simpla
– Utilizarea memoriei minimala
– Eficienta

Reprezentarea comuna a unui SM:

Metoda Switch-urilor imbricate
– Starile si evenimentele sunt reprezentate de enumeratii – Cel puțin două niveluri ale declarațiilor de comutare; una pentru expedierea statului, celălalt pentru selectarea semnalului.
– Acțiuni de tranziție sunt puse în aplicare în declarația de comutare a selectarii semnalului

Pro:
– Simpla și pe scară largă instituit
– Amprenta de memorie mică (o singură variabilă care conține starea)
Contra:
– O posibilitate redusă de refolosire a codului
– Distribuirea liniara in timp a evenimentelor si a semnalelor
Exemplu:


typedef enum
{
SIG_1, /* signal 1 */
SIG_2 /* signal 2 */
} signal_t;

typedef enum
{
STATE_1, /* state 1 */
STATE_2 /* state 2 */
} state_t;

state_t cur_state;
void init(void)
{
cur_state = STATE_1;
}
void tran(state_t target_state)
{
cur_state=target_state;
}

dispatch(signal_t signal)
{
switch(cur_state)
{
case STATE_1:
switch(signal)
{
case SIG_1:
/* trans action */
tran(STATE_2);
break;
}
break;
case(STATE_2):
switch(signal)
{
case SIG_1:
/* trans action */
break;
case SIG_2:
/* trans action */
tran(STATE_1);
break;
}
break;
}
}

C embedded – Simplicity concept

– Logical operations can always be written in many ways.
– Choose the form that is easiest to understand.

Example:


extern int x, y, z;
void f (void)
{
if ((x < 4) && !(y || (z == 1)))
{
printf("do something");
}

if ((y == 0) && (z != 1) && (x < 4))
{
printf("do something");
}
if (!((x >= 4) || y || (z == 1)))
{
printf("do something");
}

if (x < 4)
{
if (!(y || (z == 1)))
{
printf("do something");
}
}
}

MISRA-C:2004, Rule 12.4: The right-hand operand of a logical && or || shall not
contain side effects.

MISRA-C:2004, Rule 12.5: The operands of a logical && or || shall be primary
expressions.
– i.e. constants or parenthesized.

MISRA-C:2004, Rule 12.6: The operands of logical operators shall be effectively
Boolean.
– i.e. serve a boolean purpose

Quadcopter (3) – Hardware și Software setup

Am început procesul de configurare a software-ului și folosit eclipse pentru compilare și flashing. Instalarea a mediului de dezvoltare cu eclipse îl găsiți aici: Multiwii 328p Developing in Eclipse. Eclipse e un IDE foarte ușor de configurat și folosit. Am urmat câțiva pași de configurare simplii, am configurat conform cu website-ul de mai sus.
Cele mai importante configurări sunt:
– Quadcopter configuratia X

– Configuratia hardware de baza:

– Software-ul open source l-am luat de aici : MultiWii Software

– Configuratia telecomenzii:

– In Config.h am modificat urmatoarele :

– Configuratia pentru receiver-ul radio:
MultiWii Receiver
THR —-> Channel 3 Throttle.
ROL —-> Channel 1 Aileron.
PIT —-> Channel 2 Pitch.
YAW —-> Channel 4 Rudder.
AX1 —-> Channel 5
AX2 —-> Channel 6

– Configuratia Motoare/ESC
MultiWii ESC
D9 —-> ESC/Motor 9 (back right)
D10 —-> ESC/Motor 10 (front right)
D3 —-> ESC/Motor 3 (front left)
D11 —-> ESC/Motor 11 (back left)

Configuratia finala pe care am folosit-o pentru testele mele este următoarea:

Urmează armarea motoarelor și alte reglaje…
Weekend plăcut tuturor !