280 likes | 480 Views
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.
E N D
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 ID218 Riistvaralähedane programmeerimine
Joondatud mäluaadressid I ID218 Riistvaralähedane programmeerimine
Joondatud mäluaadressid IILittle - endian ID218 Riistvaralähedane programmeerimine
Joondatud mäluaadressid IIIBig - endian ID218 Riistvaralähedane programmeerimine
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
Struktuuride korraldamine I • Char muutujad • Short muutujad • Int ja long muutujad • Long long muutujad ID218 Riistvaralähedane programmeerimine
Struktuuride korraldamine II Struct { char a; int b; char c; shotr b; } ID218 Riistvaralähedane programmeerimine
Struktuuride korraldamine III ID218 Riistvaralähedane programmeerimine
Struktuuride korraldamine IV Struct { char a; char c; shotr b; int b; } ID218 Riistvaralähedane programmeerimine
Struktuuride korraldamine V ID218 Riistvaralähedane programmeerimine
Struktuuride korraldamine VI _packed Struct { char a; int b; char c; shotr b; } ID218 Riistvaralähedane programmeerimine
Struktuuride korraldamine VII ID218 Riistvaralähedane programmeerimine
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
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
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
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
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
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
Ujuvkomaga tehted • ARM riistvaraliselt ei toeta • Kompilaator asendab tarkvaralise lahendusega • Väga aeglane ID218 Riistvaralähedane programmeerimine
Inline assembler I • Mälu kokkuhoid • Kiiruse juurdekasv • C-is toetamata operatsioonid ID218 Riistvaralähedane programmeerimine
Inline assembler II • Küllastumine - saturation S-max S-min ID218 Riistvaralähedane programmeerimine
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
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
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
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
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
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