Založen: Feb 14, 2005 Příspěvky: 9006 Bydliště: Brno (JN89GF)
Zaslal: út prosinec 06 2016, 21:56 Předmět: Programování PICů v C (XC8)
Protože mě už nebaví matlat se s assemblerem, začal jsem se učit Cčko. Problémky průběžně řeším hlavně s Googlem. Ale teď jsem narazil na zajímavost, kterou nechápu.
Mám jednoduchej kód pro výpis textů na LCD:
kód:
void main ()
{
LCDinit ();
printf ("Test HD44780");
LCDctrl (0xC0); // druhy radek prvni znak
Pokud vypisuju jen texty v ASCII ("Test HD44780") tak má program zabráno 9 % programové a 8 % datové paměti. Jakmile chci použít formátování, tak s každým dalším použitým formátem (%u, %X drasticky narůstá zabraná paměť. V tomto případě 29 % programové a 16 % datové. Čím to sakra je?
Mám to jen v PIC16F628A s 2 "kB", je to jen zkoušení. XC8 je free verze, je možný, že je to tím?
Dík.
Založen: Dec 26, 2004 Příspěvky: 1426 Bydliště: Košice - okolie
Zaslal: út prosinec 06 2016, 22:07 Předmět:
printf a podobne fcie ako sprintf zaberaju samotne vela miesta. Pre male picky resp ak chyba miesto, je lepsie si napisat vlastnu kniznicu pre konverziu.
Edit: Pri tejto picke to bude este vyraznejsie aj preto, ze je to len 8bit s minimom instrukcii.
Osobne som uz prestal pouzivat radu 16F a 18F a pouzivam len 24F..., cena je tam porovnatelna mozno trosku vyssia, ale zato vykon a funkcnost nasobne vacsia
Založen: Feb 14, 2005 Příspěvky: 9006 Bydliště: Brno (JN89GF)
Zaslal: út prosinec 06 2016, 22:24 Předmět:
Hmm, to jsou teda pěkně neefektivní konverze. Jinak tu mám i výkonnější typy ale jen tu řadu 18F. Mě to zatím na ty moje hlouposti stačí. Uvidíme časem.
Díky.
Založen: Mar 21, 2006 Příspěvky: 34079 Bydliště: Bratislava
Zaslal: st prosinec 07 2016, 18:52 Předmět:
Funkcia printf je velky moloch, ktory ma vela moznosti. Na PC to je jedno, pretoze je v standardnej kniznici, takze je v pamati iba raz aj ked ju pouziva mnoho programov. Ale na vypisovanie neformatovanych textov alebo jednoduchych cisiel v malom MCU je to overkill.
BTW. Je dolezite pochopit, ze C nepozna retazce - uz aj pre spravne pouzitie funkcie word2dec() od mtajovskeho.
Založen: Feb 14, 2005 Příspěvky: 9006 Bydliště: Brno (JN89GF)
Zaslal: st prosinec 07 2016, 21:35 Předmět:
Však uvidíme, jak to půjde časem, zatím se bavím psaním knihoven pro obsluhu všeho možnýho. Mám hotový to HD44780 a teď jsem dopsal sw implementaci 1-Wire.
rnbw napsal(a):
BTW. Je dolezite pochopit, ze C nepozna retazce - uz aj pre spravne pouzitie funkcie word2dec() od mtajovskeho.
Založen: Sep 19, 2007 Příspěvky: 3698 Bydliště: Praha
Zaslal: st prosinec 07 2016, 23:10 Předmět:
To se myslí tak, že v C není syntakticky nic, co by popisovalo řetězec. C má jen pointer na začátek úseku paměti, kde se předpokládá obsah řetězce znaků ukončený nulou. Samotný pointer nic neříká o délce řetězce a ukončení nulou je jen konvence z nouze.
Na rozdíl od možností C++, kde máme standardní knihovní šablonu pro řetězce (obecně jakýchkoliv objektů, ne jen znaků) std::basic_string a její specializaci pro znaky - typedef std::basic_string<char> string;
Nebo C#, kde je přímo třída String. Tyto záležitosti pak samy o sobě obsahují vše - datový obsah, jeho velikost a potřebné operace nad daty.
Naposledy upravil mtajovsky dne st prosinec 07 2016, 23:14, celkově upraveno 1 krát.
Založen: Mar 21, 2006 Příspěvky: 34079 Bydliště: Bratislava
Zaslal: st prosinec 07 2016, 23:13 Předmět:
forbidden napsal(a):
Tomu nerozumím, jak mám chápat, že nezná řetězce?
kód:
char *s = "hello world";
Je řetězec ne?
s je pointer typu char, ktory ukazuje na adresu, kde sa nachadza danych 11 znakov textu a za nimi nulovy byte. Mozes na to pouzit rozne retazcove funkcie z kniznice, ale je to len obycajny pointer.
Cize keby si tam mal este
kód:
char *s2 = "test";
a nasledne urobil:
kód:
s = s2;
tak pointer s bude ukazovat na rovnaku adresu ako s2. Takze printf(s) aj printf(s2) vypise "test" - rovnako ako keby to boli v inom jazyku retazce a urobil si priradenie. Ale ked teraz urobis
kód:
s[0] = 'x';
tak oba vypisu "xest", pretoze si nezmenil prvy znak retazca s, ale byte na adrese s, na ktoru ukazuje aj s2.
forbidden - nepoužívej io funkce standartní knihovny (stdio), ale odlehčené funkce kompilátoru pro mcu. Většina moderních křížových kompilátorů by něco takového měla mít, při nejhorším pogoogli po nějakých implementacích a naportuj to na toho PICe...
nebo jak tu někdo poznamenal - napiš si vlasní. Takhle se hodně naučíš.
Založen: Feb 14, 2005 Příspěvky: 9006 Bydliště: Brno (JN89GF)
Zaslal: čt prosinec 08 2016, 9:46 Předmět:
OK, v tom se budu muset zorientovat a zažít si to. A hlavně prostě zkoušet. Díky oběma.
Longin: manuál k XC8 má 600 stran, zatím jsem do něho radši nekoukal. Učím se to z knížky od Matouška a i když není až tak stará, tak tam používá třeba MCC18 na překlady, ale to se právě v některých věcech od XC8 liší. Takže semtam něco nefunguje a musím bádat proč a jak. Takže je možný, že XC8 odlehčený funkce obsahuje, když je určený pro 8-mi biťáky.
Ten tvůj PIC má 2kB FLASHky. To je na hrátky s printf a sprintf dost málo
Další kámen úrazu je v v datové paměti, kde si podle mě zbytečně ukládáš konstatní řetězce - jednou jsou ve programové paměti a podruhé v datové zbytečně. Kompilátor by měl umět vytvářet a přistupovat ke konstatním proměnným jenom ve FLASHCe, ale pochybuju, že toho dosáhneš použitím const v Cčku.
Trošku OT:
Chápu, že se chceš asi urputně držet svých 8-bitových PICů, co jsou za zenitem, ale možná by stálo za úvahu pouvažovat o nějakých modernějších 8-bitových mcučkách, které nemají takové paměťové limitace, periferie jako ten PIC a nemají krkolomný přístup k programování v C...a stojej zhruba stejně.
Například nové STM8 jsou dobrý (k SDCC kompilátoru máš slušný příklady), AVR8 nebo modernější PIC8, když už seš zvyklý na PICy...
Založen: Feb 14, 2005 Příspěvky: 9006 Bydliště: Brno (JN89GF)
Zaslal: čt prosinec 08 2016, 12:10 Předmět:
Však já mám tu printf přesměrovanou na LCD právě pomocí putch.
A konstatnty, který není nutno držet v datové samozřejmě jen do programové nacpu, to není problém. To jde bez problémů.
Ten kód zatím nemá žádnej hlubší smysl, jen si tak zkouším, takže zbytečně obsazená datová paměť mě momentálně netrápí. Mě jen překvapilo, jak moc to naroste při použití těch formátovaných výstupů.
A na osmibiťácích taky netrvám, jen jich mám v šuplíku hodně a chci je využít. A taky jsem si říkal, že začnu na těch nejjednodušších. Nicméně PICů se chci držet už jen ze zvyku. Pro mě momentálně nemá smysl začínat s něčím novým. Jestli napíšu 5 programů za rok, myslím smysluplných projektů, který někde použiju, tak je to moc. Mám to jen jako zábavu, není moc času se tomu věnovat.
Leda bych změnil zaměstnání, kde bych elektroniku využil, to by byla jiná.
Založen: Feb 14, 2005 Příspěvky: 9006 Bydliště: Brno (JN89GF)
Zaslal: pá prosinec 09 2016, 10:39 Předmět:
Tak jsem trochu zklamanej celkovou efektivitou překladu. Blbej výpočet třeba: t=625*(LSB+(256*MSB)) zabere v tom osmibitu taky hodně místa.
Tak to vypadá, že si zas budu hrát hlavně s logickýma bitovýma operacema, akorát místo v assembleru, tak v Cčku.
Anebo se fakt vybodnout na malý osmibity a užívat si komfortu rozežraných funkcí na něčem výkonnějším.
Časy uváděny v GMT + 1 hodina Jdi na stránku 1, 2, 3Další
Strana 1 z 3
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.