Pytanie o różnice w czasach dostępu do zmiennych

Tu możesz pisać o swoich problemach z pisaniem programów w języku C dla AVR.
Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1096
Rejestracja: czwartek 03 wrz 2015, 22:02

Pytanie o różnice w czasach dostępu do zmiennych

Postautor: Antystatyczny » środa 23 mar 2016, 15:38

Witam serdecznie i od razu zadam pytanie. Czy są jakieś różnice w czasie dostępu do zmiennych, niech będzie 8 bitowych, w zalezności od tego czy są one zadeklarowane jako pojedyncze zmienne, czy wewnątrz struktury?

Podeprę się konkretnym przykładem:

Kod: Zaznacz cały

//wariant pierwszy
uint8_t x;
uint8_t y;

y = 200;
x = 125;

//wariant drugi

typedef struct
{
   uint8_t x;
   uint8_t y;
}LcdCoordType;

LcdCoordType coord;

y = 200;
x = 125;



Chodzi mi o to, by użyć takiej formy, która będzie oferowała szybszy dostęp do zmiennej x lub y.

Pozdrawiam
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
mokrowski
User
User
Posty: 168
Rejestracja: czwartek 08 paź 2015, 20:50
Lokalizacja: Tam gdzie Centymetro

Re: Pytanie o różnice w czasach dostępu do zmiennych

Postautor: mokrowski » czwartek 24 mar 2016, 20:05

Jeśli kompilator poprawnie wykona pracę to nie ma różnicy w czasie dostępu. W takich przypadkach listing asemblera jest ostateczną wyrocznią bo w bardzo szczególnym przypadku (konkretna platforma np. z małą objętością instrukcji dostępu indeksowego czyli z przesunięciem oraz podany przełącznik optymalizacji na wielkość kodu) może owocować wstawieniem kodu nie "szybkiego" a "małego" :-)

W skrócie: zerknij do asemblera :-)
,,Myślenie nie jest łatwe, ale można się do niego przyzwyczaić" - Alan Alexander Milne: Kubuś Puchatek

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1096
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Pytanie o różnice w czasach dostępu do zmiennych

Postautor: Antystatyczny » czwartek 24 mar 2016, 21:05

Ok, to jest wersja ze strukturą:

Kod: Zaznacz cały

AP_brudnopis.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000088  00000000  00000000  00000094  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00800060  00000088  0000011c  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000001  00800060  00800060  0000011c  2**0
                  ALLOC
  3 .stab         000006cc  00000000  00000000  0000011c  2**2
                  CONTENTS, READONLY, DEBUGGING
  4 .stabstr      00000097  00000000  00000000  000007e8  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .comment      0000002f  00000000  00000000  0000087f  2**0
                  CONTENTS, READONLY

Disassembly of section .text:

00000000 <__vectors>:
   0:   0c 94 2a 00    jmp   0x54   ; 0x54 <__ctors_end>
   4:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
   8:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
   c:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  10:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  14:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  18:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  1c:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  20:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  24:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  28:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  2c:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  30:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  34:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  38:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  3c:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  40:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  44:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  48:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  4c:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  50:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>

00000054 <__ctors_end>:
  54:   11 24          eor   r1, r1
  56:   1f be          out   0x3f, r1   ; 63
  58:   cf e5          ldi   r28, 0x5F   ; 95
  5a:   d8 e0          ldi   r29, 0x08   ; 8
  5c:   de bf          out   0x3e, r29   ; 62
  5e:   cd bf          out   0x3d, r28   ; 61

00000060 <__do_clear_bss>:
  60:   20 e0          ldi   r18, 0x00   ; 0
  62:   a0 e6          ldi   r26, 0x60   ; 96
  64:   b0 e0          ldi   r27, 0x00   ; 0
  66:   01 c0          rjmp   .+2         ; 0x6a <.do_clear_bss_start>

00000068 <.do_clear_bss_loop>:
  68:   1d 92          st   X+, r1

0000006a <.do_clear_bss_start>:
  6a:   a1 36          cpi   r26, 0x61   ; 97
  6c:   b2 07          cpc   r27, r18
  6e:   e1 f7          brne   .-8         ; 0x68 <.do_clear_bss_loop>
  70:   0e 94 3e 00    call   0x7c   ; 0x7c <main>
  74:   0c 94 42 00    jmp   0x84   ; 0x84 <_exit>

00000078 <__bad_interrupt>:
  78:   0c 94 00 00    jmp   0   ; 0x0 <__vectors>

0000007c <main>:
  7c:   8f ef          ldi   r24, 0xFF   ; 255
  7e:   80 93 60 00    sts   0x0060, r24
  82:   ff cf          rjmp   .-2         ; 0x82 <main+0x6>

00000084 <_exit>:
  84:   f8 94          cli

00000086 <__stop_program>:
  86:   ff cf          rjmp   .-2         ; 0x86 <__stop_program>


A to z prostą zmienną:

Kod: Zaznacz cały

AP_brudnopis.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000088  00000000  00000000  00000094  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00800060  00000088  0000011c  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000001  00800060  00800060  0000011c  2**0
                  ALLOC
  3 .stab         000006cc  00000000  00000000  0000011c  2**2
                  CONTENTS, READONLY, DEBUGGING
  4 .stabstr      00000097  00000000  00000000  000007e8  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .comment      0000002f  00000000  00000000  0000087f  2**0
                  CONTENTS, READONLY

Disassembly of section .text:

00000000 <__vectors>:
   0:   0c 94 2a 00    jmp   0x54   ; 0x54 <__ctors_end>
   4:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
   8:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
   c:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  10:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  14:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  18:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  1c:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  20:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  24:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  28:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  2c:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  30:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  34:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  38:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  3c:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  40:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  44:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  48:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  4c:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>
  50:   0c 94 3c 00    jmp   0x78   ; 0x78 <__bad_interrupt>

00000054 <__ctors_end>:
  54:   11 24          eor   r1, r1
  56:   1f be          out   0x3f, r1   ; 63
  58:   cf e5          ldi   r28, 0x5F   ; 95
  5a:   d8 e0          ldi   r29, 0x08   ; 8
  5c:   de bf          out   0x3e, r29   ; 62
  5e:   cd bf          out   0x3d, r28   ; 61

00000060 <__do_clear_bss>:
  60:   20 e0          ldi   r18, 0x00   ; 0
  62:   a0 e6          ldi   r26, 0x60   ; 96
  64:   b0 e0          ldi   r27, 0x00   ; 0
  66:   01 c0          rjmp   .+2         ; 0x6a <.do_clear_bss_start>

00000068 <.do_clear_bss_loop>:
  68:   1d 92          st   X+, r1

0000006a <.do_clear_bss_start>:
  6a:   a1 36          cpi   r26, 0x61   ; 97
  6c:   b2 07          cpc   r27, r18
  6e:   e1 f7          brne   .-8         ; 0x68 <.do_clear_bss_loop>
  70:   0e 94 3e 00    call   0x7c   ; 0x7c <main>
  74:   0c 94 42 00    jmp   0x84   ; 0x84 <_exit>

00000078 <__bad_interrupt>:
  78:   0c 94 00 00    jmp   0   ; 0x0 <__vectors>

0000007c <main>:
  7c:   8f ef          ldi   r24, 0xFF   ; 255
  7e:   80 93 60 00    sts   0x0060, r24
  82:   ff cf          rjmp   .-2         ; 0x82 <main+0x6>

00000084 <_exit>:
  84:   f8 94          cli

00000086 <__stop_program>:
  86:   ff cf          rjmp   .-2         ; 0x86 <__stop_program>



Jak widać,w obu przypadkach dostęp do zmiennej jest identyczny... Ok, czyli mam odpowiedź, dzięki.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.


Wróć do „Programowanie AVR w C”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość