Hallo,
ich habe zwei kleine aber interessante Fragen.
1. Warum ist der vom XC8 erzeugte Maschinencode wesentlich größer als
beim AVR-GCC?
2. Was bedeutet "Data Memory Usage: 22 bytes", wenn sich im Quellcode
ein mehrere hundert Byte großes Array befindet?
MPLAB XC8 C Compiler:
1 | Program Memory Usage: 3996 bytes 48,8 % Full
|
2 | Data Memory Usage: 22 bytes 2,1 % Full
|
AVR-GCC Compiler:
1 | Program Memory Usage: 1958 bytes 23,9 % Full
|
2 | Data Memory Usage: 20 bytes 2,0 % Full
|
USART printf test (TINY824):
1 | #define F_CPU 3333333UL
|
2 | #include <avr/io.h>
|
3 | #include <util/delay.h>
|
4 | #include <stdio.h>
|
5 |
|
6 | static void USART0_sendChar(char c)
|
7 | {
|
8 | while(!(USART0.STATUS & USART_DREIF_bm)) {}
|
9 | USART0.TXDATAL = c;
|
10 | }
|
11 |
|
12 | static int USART0_printChar(char c, FILE *stream)
|
13 | {
|
14 | USART0_sendChar(c);
|
15 | return 0;
|
16 | }
|
17 |
|
18 | static FILE USART_stream = FDEV_SETUP_STREAM(USART0_printChar, NULL, _FDEV_SETUP_WRITE);
|
19 |
|
20 | int main(void)
|
21 | {
|
22 | stdout = &USART_stream;
|
23 |
|
24 | PORTB.DIRSET = PIN2_bm; // PB2 output (USART0 TxD)
|
25 | USART0.BAUD = 231; // 57600 Bd @ 3.33MHz
|
26 | USART0.CTRLB = USART_TXEN_bm; // enable transmitter
|
27 |
|
28 | char strng[681];
|
29 | for(int i=0;i<681;i++)
|
30 | {
|
31 | strng[i] = 32;
|
32 | }
|
33 | for(int j=0;j<10;j++)
|
34 | {
|
35 | for(int i=0;i<10;i++)
|
36 | {
|
37 | strng[i+68*j] = i+48;
|
38 | }
|
39 | for(uint8_t i=0;i<26;i++)
|
40 | {
|
41 | strng[i+68*j+12] = i+65;
|
42 | }
|
43 | for(uint8_t i=0;i<26;i++)
|
44 | {
|
45 | strng[i+68*j+40] = i+97;
|
46 | }
|
47 | }
|
48 | for(int i=0;i<10;i++)
|
49 | {
|
50 | strng[66+68*i] = 13;
|
51 | strng[67+68*i] = 10;
|
52 | }
|
53 | strng[680] = 0;
|
54 |
|
55 | _delay_ms(5000);
|
56 |
|
57 | while(1)
|
58 | {
|
59 | printf("%s\r\n", strng);
|
60 | _delay_ms(1000);
|
61 | }
|
62 | }
|
Für den AVR-GCC Compiler muss die Zeile
1 | static FILE USART_stream = FDEV_SETUP_STREAM(USART0_printChar, NULL, _FDEV_SETUP_WRITE);
|
durch
1 | static FILE USART_stream = { 0, 0, _FDEV_SETUP_WRITE , 0, 0, USART0_printChar, NULL, 0 };
|
ersetzt werden.