vineri, 10 iunie 2016

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;
  }
}

miercuri, 8 iunie 2016

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

duminică, 5 iunie 2016

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 !