« SE4Binome2025-1 » : différence entre les versions
Aucun résumé des modifications |
|||
| Ligne 23 : | Ligne 23 : | ||
== Ordonnanceur == | == Ordonnanceur == | ||
[à completer et commenter , seulement des codes là !!!!] | |||
structure d'un process<syntaxhighlight lang="c"> | |||
typedef struct { | |||
uint16_t stackPointer; | |||
void (*functionAddress)(void); | |||
int sleep_time; | |||
int state; | |||
} process; | |||
</syntaxhighlight>Initialisation des leds<syntaxhighlight lang="c"> | |||
void led_init() { | |||
DDRC |= (1<<PLED1) | (1<< PLED2); | |||
DDRB |= (1<<PLED3); | |||
DDRD |= (1<<PLED4) | (1<<PLED5); | |||
} | |||
void led1_blink() { | |||
while(1) { | |||
PORTC ^= (1<<PLED1); | |||
_delay_ms(100); | |||
} | |||
} | |||
void led2_blink() { | |||
... | |||
</syntaxhighlight>initialisation pointeur de pile et pile<syntaxhighlight lang="c"> | |||
void init_stackPointer_tasks(int Cprocess) { //initialise le pointer de pile | |||
if(Tasks_list[Cprocess].state == 0) { | |||
Tasks_list[Cprocess].stackPointer = FIRST_STACK_POSITION - (Cprocess * STACK_LENGTH); | |||
} | |||
} | |||
void init_piles(int Cprocess){ //initilalise la pile | |||
if(Tasks_list[Cprocess].state == 0) { | |||
int save = SP; | |||
SP = Tasks_list[Cprocess].stackPointer; | |||
uint16_t address = (uint16_t)Tasks_list[Cprocess].functionAddress; | |||
asm volatile("push %0" : : "r" (address & 0x00ff) ); | |||
asm volatile("push %0" : : "r" ((address & 0xff00)>>8) ); | |||
SAVE_REGISTERS(); | |||
Tasks_list[Cprocess].stackPointer = SP; | |||
SP = save; | |||
} | |||
} | |||
</syntaxhighlight>scheduler v1<syntaxhighlight lang="c"> | |||
void scheduler() { | |||
Current_task++; | |||
if (Current_task >= NBTASKS) { | |||
Current_task = 0; | |||
} | |||
</syntaxhighlight>ISR<syntaxhighlight lang="c"> | |||
ISR(TIMER1_COMPA_vect, ISR_NAKED) { | |||
SAVE_REGISTERS(); | |||
Tasks_list[Current_task].stackPointer = SP; | |||
scheduler(); | |||
SP = Tasks_list[Current_task].stackPointer; | |||
RESTORE_REGISTERS(); | |||
asm volatile("reti"); | |||
} | |||
</syntaxhighlight>main<syntaxhighlight lang="c"> | |||
void init() { | |||
led_init(); | |||
init_minuteur(DIV, PER); | |||
for(int Cprocess =0 ; Cprocess<NBTASKS; Cprocess++) { | |||
init_stackPointer_tasks(Cprocess); | |||
init_piles(Cprocess); | |||
} | |||
} | |||
int main() { | |||
cli(); | |||
init(); | |||
sei(); | |||
SP = Tasks_list[Current_task].stackPointer; | |||
Tasks_list[Current_task].functionAddress(); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
== Carte Réseau == | == Carte Réseau == | ||
Lors de la répartition des tâches, nous avons opté pour une solution basée sur la carte réseau. Le sujet nous permettait de choisir parmi plusieurs microcontrôleurs. Nous avons retenu l’ATmega32U4, qui nous semble représenter un juste milieu entre l’ATmega16U2 et l’AT90USB. | Lors de la répartition des tâches, nous avons opté pour une solution basée sur la carte réseau. Le sujet nous permettait de choisir parmi plusieurs microcontrôleurs. Nous avons retenu l’ATmega32U4, qui nous semble représenter un juste milieu entre l’ATmega16U2 et l’AT90USB. | ||
Version du 8 novembre 2025 à 18:26
Shield Arduino
Afin de tester notre futur carte réseau, nous avons fait un sheild d'arduino qui prendra le rôle de la carte mère durant.
Schématique
Nous nous sommes évidemment aider de la datasheet de l'atmega328p ainsi que celle de l'arduino uno afin de sélectienner les bon pins.
Plus précisément nous nous insirons très fortement du schéma page 10 de la datasheet de l'arduino :
Nous sommes donc parti de l'exemple fourni par Mr Redon. Mais nous avons utilisé une template disponible dans kicad permettant de créer des sheilds d'arduino Uno R3.
Routage
Au niveau du routage, nous avons tenté de faire simple (sans trop abuser sur les vias. Nous avons positionner le lecteur de carte sd au bord de la carte afin de ne pas avoir de problèmes avec d'autres composants lorsque nous voudrons mettre ou enlever la carte sd.
Soudage
La schématique et le routage terminés, nous avons soudé les différents pins permettant de souder la carte shield à l'arduino, le reste n'étant pas forcément utile pour le moment (il est important de noter que notre shield est arrivé avec des composants présoudés).
Tests
Il faudra ensuite faire des test d'allumage des leds, afin de vérifier le bon fonctionnement du shield
Les leds fonctionnant à merveille, Il est temps de passer de passer à l'ordonnanceur.
Ordonnanceur
[à completer et commenter , seulement des codes là !!!!]
structure d'un process
typedef struct {
uint16_t stackPointer;
void (*functionAddress)(void);
int sleep_time;
int state;
} process;
Initialisation des leds
void led_init() {
DDRC |= (1<<PLED1) | (1<< PLED2);
DDRB |= (1<<PLED3);
DDRD |= (1<<PLED4) | (1<<PLED5);
}
void led1_blink() {
while(1) {
PORTC ^= (1<<PLED1);
_delay_ms(100);
}
}
void led2_blink() {
...
initialisation pointeur de pile et pile
void init_stackPointer_tasks(int Cprocess) { //initialise le pointer de pile
if(Tasks_list[Cprocess].state == 0) {
Tasks_list[Cprocess].stackPointer = FIRST_STACK_POSITION - (Cprocess * STACK_LENGTH);
}
}
void init_piles(int Cprocess){ //initilalise la pile
if(Tasks_list[Cprocess].state == 0) {
int save = SP;
SP = Tasks_list[Cprocess].stackPointer;
uint16_t address = (uint16_t)Tasks_list[Cprocess].functionAddress;
asm volatile("push %0" : : "r" (address & 0x00ff) );
asm volatile("push %0" : : "r" ((address & 0xff00)>>8) );
SAVE_REGISTERS();
Tasks_list[Cprocess].stackPointer = SP;
SP = save;
}
}
scheduler v1
void scheduler() {
Current_task++;
if (Current_task >= NBTASKS) {
Current_task = 0;
}
ISR
ISR(TIMER1_COMPA_vect, ISR_NAKED) {
SAVE_REGISTERS();
Tasks_list[Current_task].stackPointer = SP;
scheduler();
SP = Tasks_list[Current_task].stackPointer;
RESTORE_REGISTERS();
asm volatile("reti");
}
main
void init() {
led_init();
init_minuteur(DIV, PER);
for(int Cprocess =0 ; Cprocess<NBTASKS; Cprocess++) {
init_stackPointer_tasks(Cprocess);
init_piles(Cprocess);
}
}
int main() {
cli();
init();
sei();
SP = Tasks_list[Current_task].stackPointer;
Tasks_list[Current_task].functionAddress();
return 0;
}
Carte Réseau
Lors de la répartition des tâches, nous avons opté pour une solution basée sur la carte réseau. Le sujet nous permettait de choisir parmi plusieurs microcontrôleurs. Nous avons retenu l’ATmega32U4, qui nous semble représenter un juste milieu entre l’ATmega16U2 et l’AT90USB.
Notre carte intègre des LED permettant d’afficher différents états de communication (que nous définirons ultérieurement).
À la demande de M. Redon, nous avons ajouté un MAX232 ainsi que des connecteurs DB9 et DB25. Nous espérons que ces éléments pourront être utiles.