mikrovezérlős rendszerfejlesztés c/c++ nyelven melléklet: c/c++ receptek
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
v: 2013-04-04
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
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
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
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
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
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
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
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
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
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
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
}}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