mikrovezérlős rendszerfejlesztés c/c++ nyelven melléklet: c/c++ receptek

15
v: 2013-04-04

Upload: ruzsinszki-gabor

Post on 18-Feb-2015

2.176 views

Category:

Documents


23 download

DESCRIPTION

Mikrovezérlős rendszerfejlesztés C/C++ nyelven könyvek melléklete, amelyben hasznos és rövid C/C++ programrészletek találhatóak meg.

TRANSCRIPT

Page 1: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

v: 2013-04-04

Page 2: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek
Page 3: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek
Page 4: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

Tartalom

0. Dokumentum információk............................5Licenc............................................................................................ 5

Bit és byte műveletek...........................................7Adot bit 1-es értékre állítása.............................................7

Adot bit 0-s értékre állítása...............................................7

Adot bit értékének invertálása..........................................7

Adot bit értékének kiolvasása...........................................7

2 byte-os egész szám felbontása 2db egy bájtos

karakterre...............................................................................7

2db egy byte-os karakterből egy 2 byte-os egész

létrehozása.............................................................................7

8 bites egész szám felső 4 bitjének kinyerése..................7

8 bites egész szám alsó 4 bitjének kinyerése...................8

8 bites bináris szám BCD kódolása...................................8

8 bites BCD kódolt szám binárissá alakítása..................8

Matematikai függvények....................................9Kető adot hatványának előállítása gyorsan..................9

Tömb legkisebb elemének kikeresése................................9

Tömb legnagyobb elemének kikeresése............................9

Tömb átlagának kiszámítása..............................................9

Adot halmaz értékének a leképezése egy másik

halmazban...........................................................................10

16 bites hash kód meghatározása egy byte sorozathoz

............................................................................................... 10

Tömbökkel kapcsolatos függvények.............11Tömb összes elemének beállítása adot kezdőértékre........11

Tömb tartalmának másolása másik tömbbe........................11

Rendezési algoritmusok....................................12Egyszerű cserés rendezés...................................................12

Minimumkiválasztásos rendezés.....................................12

Buborék rendezés...............................................................13

Kétirányú buborék rendezés.............................................13

Shell rendezés.....................................................................14

Gyorsrendezés.....................................................................14

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 4. oldal

Page 5: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

0. Dokumentum információk

Licenc

Nevezd meg! – Így add tovább! 2.5 Magyarország (CC BY-SA 2.5)

Ez a licenc szövegének közérthető nyelven megfogalmazot kivonata. A teljes licenc tartalom a következő

címen érhető el: htp://creativecommons.org/licenses/by-sa/2.5/hu/legalcode

A következőket teheted a művel:

• szabadon másolhatod, terjesztheted, bemutathatod és előadhatod a művet

• származékos műveket (feldolgozásokat) hozhatsz létre

• kereskedelmi célra is felhasználhatod a művet

Az alábbi feltételekkel:

Nevezd meg! – A szerző vagy a jogosult által meghatározot módon fel kell

tüntetned a műhöz kapcsolódó információkat (pl. a szerző nevét vagy álnevét, a mű

címét).

Így add tovább! – Ha megváltoztatod, átalakítod, feldolgozod ezt a művet, az így

létrejöt alkotást csak a jelenlegivel megegyező licenc alat terjesztheted.

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 5. oldal

Page 6: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

A könyvben szereplő kódrészletekre a BSD Public Licence vonatkozik:

Copyright (c) 2013, Ruzsinszki Gábor

Minden jog fenntartva.

Engedélyezet a forráskód és bináris formában történő felhasználás és terjesztés, módosítással vagy

anélkül, amennyiben a következő feltételek teljesülnek:

• A forráskód terjesztésekor meg kell őrizni a fenti szerzői jogi megjegyzést, ezt a feltétellistát és a

következő nyilatkozatot.

• Bináris formában történő terjesztéskor tovább kell adni a fenti szerzői jogi megjegyzést, ezt a

feltétellistát és a következő nyilatkozatot a dokumentációban, illetve a csomaggal részét képező

egyéb anyagokban.

• Sem Ruzsinszki Gábor neve, sem pedig a hozzájárulók neve nem használható fel előzetes írásbeli

engedély nélkül a szofverből származtatot termékek hitelesítésére vagy reklámozására.

EZT A SZOFTVERT A SZERZŐI JOG TULAJDONOSAI ÉS A HOZZÁJÁRULÓK ÚGY BIZTOSÍTJÁK,

„AHOGY VAN”, ÉS SEMMILYEN NYÍLT VAGY BURKOLT GARANCIA – BELEÉRTVE, DE NEM ERRE

KORLÁTOZVA AZ ELADHATÓSÁGOT VAGY EGY ADOTT CÉLRA VALÓ ALKALMATOSSÁGOT – NEM

ÉRVÉNYESÍTHETŐ. A SZERZŐI JOG TULAJDONOSAI ÉS A HOZZÁJÁRULÓK SEMMILYEN ESETBEN

SEM VONHATÓK FELELŐSSÉGRE A SZOFTVER HASZNÁLATÁBÓL EREDŐ SEMMILYEN

KÖZVETLEN, KÖZVETETT, VÉLETLENSZERŰ, KÜLÖNLEGES, PÉLDAADÓ VAGY SZÜKSÉGSZERŰ

KÁROKÉRT (BELEÉRTVE, DE NEM ERRE KORLÁTOZVA A HELYETTESÍTŐ TERMÉKEK VAGY

SZOLGÁLTATÁSOK BESZERZÉSÉT, ÜZEMKIESÉST, ADATVESZTÉST, ELMARADT HASZNOT VAGY

ÜZLETMENET MEGSZAKADÁSÁT), BÁRHOGY IS KÖVETKEZETT BE, VALAMINT A FELELŐSSÉG

BÁRMILYEN ELMÉLETÉVEL – AKÁR SZERZŐDÉSBEN, AKÁR OKOZOTT KÁRBAN (BELEÉRTVE A

HANYAGSÁGOT ÉS EGYEBET), AKKOR IS, HA AZ ILYEN KÁR LEHETŐSÉGÉRE FELHÍVTÁK A

FIGYELMET.

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 6. oldal

Page 7: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

Bit és byte műveletek

Az alábbi példákban a szám változó egy egész szám típus, míg a bit a műveletre kijelölt bit

sorszáma. A kód értékelhetetlen eredményt fog eredményezni, ha a műveletre kijelölt bit értéke nagyobb,

mint N-1, ahol N a típus bitjeinek számát jelöli.

Adot bit 1-es értékre állítása

szam |= 1 << bit;

Adot bit 0-s értékre állítása

szam &= ~(1 << bit);

Adot bit értékének invertálása

szam ^= 1 << bit;

Adot bit értékének kiolvasása

bitertek = szam & (1 << bit);

2 byte-os egész szám felbontása 2db egy bájtos karakterre

void bont(int szam){

char also = szam & 0x00FF;char felso = (szam & 0xFF00) >> 8;

}

2db egy byte-os karakterből egy 2 byte-os egész létrehozása

int osszerak(char also, char felso){

int eredmeny = also;eredmeny += (felso << 8);return eredmeny;

}

8 bites egész szám felső 4 bitjének kinyerése

inline char Higher(char value){

return (value & 0xF0) >> 4;}

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 7. oldal

Page 8: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

8 bites egész szám alsó 4 bitjének kinyerése

inline char Lower(char value){

return value & 0x0F;}

8 bites bináris szám BCD kódolása

char BCDEncode(char binary){

if (binary > 99) binary = 99;if (binary < 0) binary = 0;char target = (binary % 10) << 4;return target += (binary / 10);

}

8 bites BCD kódolt szám binárissá alakítása

char BCDDecode(char bcd){

char ret = (bcd & 0xF0) >> 4;return (ret * 10) + (bcd & 0x0F);

}

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 8. oldal

Page 9: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

Matematikai függvények

Kető adot hatványának előállítása gyorsan

inline int KettoHatvanya(int kitevo){

return 1 << kitevo;}

Tömb legkisebb elemének kikeresése

int TombMinimum(int tomb[], int elemszam){

int Minimum = tomb[0];for (int i=0; i<elemszam; i++){

if (tomb[i] < Minimum) Minimum = tomb[i];}return Minimum;

}

Tömb legnagyobb elemének kikeresése

int TombMaximum(int tomb[], int elemszam){

int Maximum = tomb[0];for (int i=0; i<elemszam; i++){

if (tomb[i] < Maximum) Maximum = tomb[i];}return Maximum;

}

Tömb átlagának kiszámítása

int TombAtlag(int tomb[], int elemszam){

long int osszeg = 0;for (int i=0; i<elemszam; i++){

osszeg += tomb[i];}return osszeg / elemszam;

}

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 9. oldal

Page 10: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

Adot halmaz értékének a leképezése egy másik halmazban

long Map(long Value, long InMinimum, long InMaximum, long → OutMinimum, long OutMaximum){

return (Value - InMinimum) * (OutMaximum - OutMinimum) / → (InMaximum - InMinimum) + OutMinimum;}

16 bites hash kód meghatározása egy byte sorozathoz

//eredeti forrása: http://www8.cs.umu.se/~isak/snippets/crc-16.c

#define POLY 0x8408

unsigned short crc16(char *data_p, unsigned short length){

unsigned char i;unsigned int data;unsigned int crc = 0xffff;

if (length == 0) return (~crc);do{

for (i=0, data=(unsigned int)0xff & *data_p++;i < 8; →i++, data >>= 1)

{if ((crc & 0x0001) ^ (data & 0x0001))

crc = (crc >> 1) ^ POLY;else crc >>= 1;

}} while (--length);crc = ~crc;data = crc;return crc;

}

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 10. oldal

Page 11: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

Tömbökkel kapcsolatos függvények

Tömb összes elemének beállítása adot kezdőértékre

#include <string.h>

int tomb[20]; //tömb amit nullázunk

//a második paraméter az érték amit a tömbbe írunk//a tömbb típusával megegyező típus lehet.memset(tomb, 0, sizeof(tomb));

Tömb tartalmának másolása másik tömbbe

#include <string.h>

int forras[] = {0, 3, 5, 2, -1}; //ezt másoljukint cel[5]; //ebbe másolunk

memmove(cel, forras, sizeof(forras));

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 11. oldal

Page 12: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

Rendezési algoritmusok

Egyszerű cserés rendezés

void CsereRendez(int tomb[], int elemszam){

for (int i = 0; i<elemszam - 1; i++ ){

for (int j = i + 1; j<elemszam; j++){

if (tomb[i] > tomb[j]){

int tmp = tomb[i];tomb[i] = tomb[j];tomb[j] = tmp;

}}

}}

Minimumkiválasztásos rendezés

void RendezMinimum(int tomb[], int elemszam){

for (int i = 0; i<elemszam - 1; i++){

int min = i;for (int j = i+1; j<elemszam; j++){

if (tomb[j] < tomb[min]) min = j;}if( i != min){

int tmp = tomb[i];tomb[i] = tomb[min];tomb[min] = tmp;

}}

}

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 12. oldal

Page 13: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

Buborék rendezés

void RendezBuborek(int tomb[], int elemszam){

for (int i = elemszam; --i>=0; ){

int cserelt = 0;for (int j = 0; j<i; j++){

if (tomb[j] > tomb[j+1]){

int tmp = tomb[j];tomb[j] = tomb[j+1];tomb[j+1] = tmp;cserelt = 1;

}}if (!cserelt) return;

}}

Kétirányú buborék rendezés

void RendezKetiranyuBuborek(int tomb[], int elemszam){

int j;int limit = elemszam;int st = -1;while (st < limit){

st++;limit--;int cserelt = 0;for (j = st; j < limit; j++){

if (tomb[j] > tomb[j + 1]){

int tmp = tomb[j];tomb[j] = tomb[j + 1];tomb[j + 1] = tmp;cserelt = 1;

}}if (!cserelt) return;else cserelt = 0;for (j = limit; --j >= st;){

if (tomb[j] > tomb[j + 1]){

int tmp = tomb[j];tomb[j] = tomb[j + 1];tomb[j + 1] = tmp;

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 13. oldal

Page 14: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

cserelt = 1;}

}if (!cserelt) return;

}}

Shell rendezés

void RendezShell(int tomb[], int elemszam){

int h[] = {1,4,13,40,121}; /** TAOCP 3. */int s,lep,x,i,j;

for (s = 4; s >=0; s--){

lep = h[s];for(j = lep; j < elemszam; j++){

i = j - lep;x = tomb[j];while(i >=0 && tomb[i]>x ){

tomb[i+lep] = tomb[i];i = i - lep;

}tomb[i+lep] = x;

}}

}

Gyorsrendezés

void Gyors(int T[], int lo0, int hi0){

int lo = lo0;int hi = hi0;int mid;

if ( hi0 > lo0){

mid = T[ ( lo0 + hi0 ) / 2 ];while( lo <= hi ){

while( ( lo < hi0 ) && ( T[lo] < mid )) ++lo;while( ( hi > lo0 ) && ( T[hi] > mid )) --hi;if( lo <= hi ){

int tmp= T[lo]; T[lo] = T[hi]; T[hi] = tmp;++lo;--hi;

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 14. oldal

Page 15: Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet: C/C++ receptek

}}if( lo0 < hi ) QuickSort( T, lo0, hi );if( lo < hi0 ) QuickSort( T, lo, hi0 );

}}

void RendezGyors(int tomb[], int elemszam){

QuickSort(tomb, 0, elemszam - 1);}

Mikrovezérlős rendszerfejlesztés C/C++ nyelven melléklet : C/C++ receptek 15. oldal