1 / 28

Riistvarapõhine programmeerimine

Riistvarapõhine programmeerimine. Loeng 15 ARM kontrollerite programmeerimine C-s II osa. ARM programmeerimine. Joondatud mäluaadressid Struktuuride korraldamine Bit – väljad Jagamine Ujuvkomaga tehted Inline assembler. Joondatud mäluaadressid I.

eavan
Download Presentation

Riistvarapõhine programmeerimine

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Riistvarapõhine programmeerimine Loeng 15 ARM kontrollerite programmeerimine C-s II osa

  2. ARM programmeerimine • Joondatud mäluaadressid • Struktuuride korraldamine • Bit – väljad • Jagamine • Ujuvkomaga tehted • Inline assembler ID218 Riistvaralähedane programmeerimine

  3. Joondatud mäluaadressid I ID218 Riistvaralähedane programmeerimine

  4. Joondatud mäluaadressid IILittle - endian ID218 Riistvaralähedane programmeerimine

  5. Joondatud mäluaadressid IIIBig - endian ID218 Riistvaralähedane programmeerimine

  6. Joondatud mäluaadressid IV int convert_little (char *data) { int a0, a1, a2, a3; a0 = *(data++); a1 = *(data++); a2 = *(data++); a3 = *(data++); return a0|(a1<<8)|(a2<<16)|(a3<<24); } ID218 Riistvaralähedane programmeerimine

  7. Struktuuride korraldamine I • Char muutujad • Short muutujad • Int ja long muutujad • Long long muutujad ID218 Riistvaralähedane programmeerimine

  8. Struktuuride korraldamine II Struct { char a; int b; char c; shotr b; } ID218 Riistvaralähedane programmeerimine

  9. Struktuuride korraldamine III ID218 Riistvaralähedane programmeerimine

  10. Struktuuride korraldamine IV Struct { char a; char c; shotr b; int b; } ID218 Riistvaralähedane programmeerimine

  11. Struktuuride korraldamine V ID218 Riistvaralähedane programmeerimine

  12. Struktuuride korraldamine VI _packed Struct { char a; int b; char c; shotr b; } ID218 Riistvaralähedane programmeerimine

  13. Struktuuride korraldamine VII ID218 Riistvaralähedane programmeerimine

  14. Bit – väljad I • Tuleb vältida bit-väljade kasutamist • 1 bit vajab terve sõna • iga operatsioon - mälupöördumine • Tuleb kasutada maskid ja loogilised operatsioonid ID218 Riistvaralähedane programmeerimine

  15. Bit – väljad II Vale: . . . Set sta1 = 1 and sta2 = 0 . . . void do_something (int *sta1, int *sta2) { if (sta1) { . . . . ; do A if sta1 = 1 } if (sta2) { . . . . ; do B if sta2 = 2 } } ID218 Riistvaralähedane programmeerimine

  16. Bit – väljad III Õige: void do_something (int *sta) { int status = *sta if (status & 0x1) { . . . . ; do A } if (status & 0x2) { . . . . ; do B } } ID218 Riistvaralähedane programmeerimine

  17. Jagamine I • ARM riistvara jagamist ei toeta • Kompilaator jagab tarkvaraliselt • Vajab 20 kuni 100 tsüklit (integer division) • Tuleb asendada korrutamisega ID218 Riistvaralähedane programmeerimine

  18. Jagamine II Sümboli ekraaniasukoha (x, y) leidmine: typedef struct { int x; int y; } point; point_getxy(unsigned int offset, int bytes_per_line) { point p; p.y = offset / bytes_per_line; p.x = offset - p.y * bytes_per_line; return p; } Jagamise tulemus – jagatis ja jääk ID218 Riistvaralähedane programmeerimine

  19. Jagamine III Sümboli ekraaniasukoha (x, y) leidmine (parandatud): typedef struct { int x; int y; } point; point_getxy(unsigned int offset, int bytes_per_line) { point p; p.x = offset % bytes_per_line; p.y = offset / bytes_per_line; return p; } ID218 Riistvaralähedane programmeerimine

  20. Ujuvkomaga tehted • ARM riistvaraliselt ei toeta • Kompilaator asendab tarkvaralise lahendusega • Väga aeglane ID218 Riistvaralähedane programmeerimine

  21. Inline assembler I • Mälu kokkuhoid • Kiiruse juurdekasv • C-is toetamata operatsioonid ID218 Riistvaralähedane programmeerimine

  22. Inline assembler II • Küllastumine - saturation S-max S-min ID218 Riistvaralähedane programmeerimine

  23. Inline assembler III Ülesanne: Funktsioon a + 2xy Kui Smin < a + 2xy < Smax; S = a +2xy Kui a + 2xy > Smax; S = Smax Kui a + 2xy < Smin; S = Smin ID218 Riistvaralähedane programmeerimine

  24. Inline assembler IV int qmac (int a, int x, int y) { int i; i = x * y; /* multiplication */ if (i >= 0) { /* xy on positive */ i = 2 * i; if (i < 0) {i = 0x7FFFFFFF;} /* dbl saturated */ if (a + i < a) { return 0x7FFFFFFF;}/* add sat. */ return a + i; } if ( a + 2 * i > a) { return 0x80000000;} /* a saturated */ return a + 2 * i; } ID218 Riistvaralähedane programmeerimine

  25. Inline assembler V int sat (short *x, short *y, unsigned int N) { int a = 0; do { a = qmac (a, *(x++), *(y++)); } while (--N); return a; } ID218 Riistvaralähedane programmeerimine

  26. Inline assembler VI _inline int qmac (int a, int x, int y) { int i; const int mask = 0x80000000; i = x * y; _asm { ADDS i, i, i /* dbl */ EORVS i, mask, i, ASR 31 /* saturate dbl */ ADDS a, a, i /* acc */ EORVS a, mask, a, ASR 31 /* saturate acc */ } return a; } ID218 Riistvaralähedane programmeerimine

  27. Kokkuvõte I • Struktuuri elementide järjekord • char, • short, • int, • long, • long long • Tuleb vältida joondamata andmeid • Tuleb vältida bit-väljade kasutamist ID218 Riistvaralähedane programmeerimine

  28. Kokkuvõte II • Ujuvkoma tehted on väga aeglased, vajavad abiprotsessori • Inline assembler • Parandab kiirust • Parandab mälukasutamist • Lisab uued funktsioonid ID218 Riistvaralähedane programmeerimine

More Related