-
Addition avec un ATmega328p.
- Pas d’utilisation de la pile, de l’assembleur en quelque sorte, code factorisé :
int main(void)
{
buffer[MAX_BUFFER]='\0';
goto start;
number_get:
if(base>strlen(digits)) goto *next;
number=0;
_number_get:
char c=serial_get();
char *f=strchr(digits,c);
int pos=f?f-digits:-1;
if(f==NULL || pos>=base) goto *next;
number *= base;
number += pos;
serial_put(c);
goto _number_get;
number_put:
if(base>strlen(digits)) goto *next;
char *p=buffer+MAX_BUFFER;
unsigned int copy=number;
_number_put:
int digit=copy%base;
*--p=digits[digit];
copy /= base;
if(copy && p>buffer) goto _number_put;
serial_print(p);
goto *next;
start:
serial_init(9600);
serial_print("Addition Calculator\n");
goto read_first_number;
read_first_number:
serial_print("first number: ");
next=&&read_second_number;
goto number_get;
read_second_number:
op1=number;
serial_print("\nsecond number: ");
next=&&make_addition;
goto number_get;
make_addition:
op2=number;
number=op1+op2;
serial_print("\naddition: ");
next=&&end;
goto number_put;
end:
serial_print("\n");
return 0;
}
- Programmation structurée en fonctions, utilisation minimale de la libc :
int number_get(int base){
if(base>strlen(digits)) return 0;
int number=0;
while(1){
char c=serial_get();
char *f=strchr(digits,c);
int pos=f?f-digits:-1;
if(f==NULL || pos>=base) break;
number *= base;
number += pos;
serial_put(c);
}
return number;
}
void number_put(unsigned int number,int base){
if(base>strlen(digits)) return;
if(number){
int digit=number%base;
number_put(number/base,base);
serial_put(digits[digit]);
}
return;
}
int main(void)
{
serial_init(9600);
serial_print("Addition Calculator\n");
serial_print("first number: ");
unsigned int op1=number_get(BASE);
serial_print("\nsecond number: ");
unsigned int op2=number_get(BASE);
unsigned int result=op1+op2;
serial_print("\naddition: ");
number_put(result,BASE);
serial_print("\n");
return 0;
}
- Utilisation lourde de la libc :
int main(void)
{
unsigned int op1,op2;
stdio_init(9600);
printf("Addition Calculator\n");
printf("first number: ");
scanf("%d",&op1);
printf("\nsecond number: ");
scanf("%d",&op2);
unsigned int result=op1+op2;
printf("\naddition: %d\n",result);
return 0;
}
- Listez dans les 3 cas les ressources du microcontrôleur mobilisées.