Commit d8927986803e847c9916570d9b35c99ed592c681

Authored by pfrison
1 parent 6601d4de

test ordonnanceur concluant

Showing 1 changed file with 70 additions and 20 deletions   Show diff stats
tests/atmega2560/ordonanceur/ordonanceur.c
... ... @@ -84,10 +84,49 @@ asm volatile ( \
84 84 "pop r0 \n\t" \
85 85 );
86 86  
  87 +/** Configure les ports */
  88 +void init_ports(){
  89 + //TODO DDRXs
  90 +}
  91 +
  92 +/** ----- Liaison serie ----- */
  93 +void init_serial(int speed){
  94 + UBRR0 = CPU_FREQ/(((unsigned long int)speed)<<4)-1; //Set baud rate
  95 + UCSR0B = (1<<TXEN0 | 1<<RXEN0); //Enable transmitter & receiver
  96 + UCSR0C = (1<<UCSZ01 | 1<<UCSZ00); //Set 8 bits character and 1 stop bit
  97 + UCSR0A &= ~(1 << U2X0); //Set off UART baud doubler
  98 +}
  99 +void send_serial(unsigned char c){
  100 + loop_until_bit_is_set(UCSR0A, UDRE0);
  101 + UDR0 = c;
  102 +}
  103 +unsigned char get_serial(void){
  104 + loop_until_bit_is_set(UCSR0A, RXC0);
  105 + return UDR0;
  106 +}
  107 +
  108 +/** ----- Taches ----- */
  109 +void task_print_a(void){
  110 + while(1){
  111 + send_serial('a');
  112 + _delay_ms(1000);
  113 + }
  114 +}
  115 +void task_print_b(void){
  116 + while(1){
  117 + send_serial('b');
  118 + _delay_ms(700);
  119 + }
  120 +}
  121 +
  122 +/** ----- Ordonnancement ----- */
87 123 struct task{
88 124 uint16_t sp_vise;
89   - uint8_t state;
90 125 };
  126 +uint8_t cpt = 0;
  127 +uint8_t premier_lancement = 0;
  128 +struct task print_a = {0x0300};
  129 +struct task print_b = {0x0500};
91 130  
92 131 /** Démarre le timer pour l'ordonnancement */
93 132 void init_timer(){
... ... @@ -97,32 +136,43 @@ void init_timer(){
97 136 OCR1A = NB_TICK;
98 137 TIMSK1 |= _BV(OCIE1A);
99 138 }
100   -
101   -/** Configure les ports */
102   -void init_ports(){
103   - //TODO DDRXs
104   -}
105   -
106   -/** Alumme la LED 13 pour témoigné du bon fonctionnement de la carte */
107   -void temoin_allumage(){
108   - DDRA = 0x01;
109   - PORTA = 0x01;
110   - _delay_ms(500);
111   - PORTA = 0x00;
112   -}
113   -
114   -/** Reception de l'interruption généré par le timer (changement de contexte) */
  139 +/** Changement de contexte */
115 140 ISR(TIMER1_COMPA_vect){
116   - // TODO
  141 + if(premier_lancement == 0){
  142 + premier_lancement++;
  143 + sei();
  144 + SP = print_a.sp_vise;
  145 + task_print_a();
  146 + }else if(premier_lancement == 1){
  147 + SAVE_CONTEXT();
  148 + print_a.sp_vise = SP;
  149 + premier_lancement++;
  150 + sei();
  151 + SP = print_b.sp_vise;
  152 + task_print_b();
  153 + }else{
  154 + if(cpt==0){
  155 + SAVE_CONTEXT();
  156 + print_b.sp_vise = SP;
  157 + SP = print_a.sp_vise;
  158 + RESTORE_CONTEXT();
  159 + cpt++;
  160 + }else if(cpt==1){
  161 + SAVE_CONTEXT();
  162 + print_a.sp_vise = SP;
  163 + SP = print_b.sp_vise;
  164 + RESTORE_CONTEXT();
  165 + cpt = 0;
  166 + }
  167 + }
117 168 sei();
118 169 }
119 170  
120 171 int main(void){
121   - temoin_allumage();
122   -
123 172 // Initialisation
124 173 init_timer();
125   - init_port();
  174 + init_ports();
  175 + init_serial(9600);
126 176 sei();
127 177  
128 178 while(1){}
... ...