Microchip'i C keel - Printerisõbralik versioon +- Elektroonikafoorum.com (https://elektroonikafoorum.com) +-- Foorum: Arutelud (https://elektroonikafoorum.com/forum-3.html) +--- Foorum: Programmeerimine (https://elektroonikafoorum.com/forum-5.html) +--- Teema: Microchip'i C keel (/thread-382.html) |
Microchip'i C keel - felch - 06-06-2012 Õpin seda ja tekkis tüüpiline algaja küsimus. Neti abiga palju targemaks ei saanud. Küsimus on andmetüüpide konverteerimises. Saan DS1337-kellalt aja ja tahan moodustada faili nimega yyyy-mm-dd.csv (aasta-kuu-päev). Hüva, kellalt saadav aasta on WORD tüüpi, muu aga BYTE: Kood: typedef struct Kood: char FailiName[32]; // logifaili nime moodustamiseks Mida paganat... ??? RE: Microchip'i C keel - tvtv - 07-06-2012 Failinime moodustamisel on äkki järgmisest näitest abi: Kood: #include <string.h> See võib mitte kompileeruda, mul pole hetkel C-kompilaatorit käepärast, et seda kontrollida ja ei kasuta C-d väga tihti. Kui sa pead silmas seda rida, kus sa teed FileName + ".csv", siis üldiselt (kui just Microchip pole mingit erandit teinud) C-s on stringid char-i massiivid, "+"-märgiga neid omaval kokku liita ei saa, selleks on meetod "strcat". Ilmselt kahe konstandi korral "+" siiski töötab. RE: Microchip'i C keel - Mtj - 07-06-2012 FailiName=(itoa ((DS_Aeg->tm_year,pFailiName); Tundub et sulgusid on puudu. RE: Microchip'i C keel - felch - 07-06-2012 Tänud nõu andmast, probleem on lahendatud. Osa oli sellest, et ma ei saa ikka C bürokraatiale (minu meelest) pihta ja osa oli C18 erinippides. Lõplik koodilõik tuli säärane: Kood: ... Selgub, et 18-seeria puhul tuleb kasutada *pgm funtsiooni (strcatpgm2rm jne) sest muidu ei suudeta flashist asja RAMi lugeda (ilmselt ei kasutata siis TBLRD*+ asmi käsku. Miks aga see on vajalik info liigutamisel RAMi sees, pole selge. Igatahes nii netis soovitati ja nii toimis ka. Ma ei saa aru...räägitakse ju, et C-s on kõik lihtne ja eriti mugav...? RE: Microchip'i C keel - andrei - 08-06-2012 (07-06-2012, 08:45 PM)felch Kirjutas: Selgub, et 18-seeria puhul tuleb kasutada *pgm funtsiooni (strcatpgm2rm jne) sest muidu ei suudeta flashist asja RAMi lugeda (ilmselt ei kasutata siis TBLRD*+ asmi käsku. Miks aga see on vajalik info liigutamisel RAMi sees, pole selge. Igatahes nii netis soovitati ja nii toimis ka.Ma ei ole küll Microchipi C kompilaatori spetsialist, seega järgnev on vaid mingi tõenäosusega paika pidav jutt: See konkreetne kompilaator paneb tähele, et: 1. strcatpgm2rm teine argument on tüüpi "const char*" - ehk et viitab read-only mälualale. 2. ":" on fikseeritud string, mida kasutatakse ainult strcatpgm2rm teise argumendina. Pannes kokku 2 pluss 2 (ehk tehes lihtsat konstantide kasutuse analüüsi), leiabk kompilaator, et ":" võib paigutada RAM-i asemel flash'i. (07-06-2012, 08:45 PM)felch Kirjutas: Ma ei saa aru...räägitakse ju, et C-s on kõik lihtne ja eriti mugav...?Eks igal asjal mõned kitsaskohad, millesse eriti alustades võib kinni jääda või ebaefektiivselt teha. Aga kui ka edaspidi tunned C-s millestki puudust, kriba ikka siia; ma ei ütle, et ma kõike oskan, aga mitme peale ikka hea lahenduse leiab. Stringitöötlus on ka Basicuga võrreldes suhteliselt algelisemal tasemel. Kui leiad sprintf kasutamise võimaluse üles nagu kasutaja Mtj soovitas, siis saad oma koodijupi märksa lühemaks. Eraldi muutujaid "year", "month" jt. ei pea ka tegema, võib ka otse kasutada "DS_Aeg->tm_year" jne. RE: Microchip'i C keel - tvtv - 11-06-2012 Mikronkontrolleri jaoks on sprintf vb. liiga ressursinõudlik, kui sul seda funktsiooni just palju tarvis pole. Selline tähelepanek ka veel, et DS1337 hoiab suuremaid numbreid BCD formaadis. Võrreldes kümnendnendsüsteemiga on neid tunduvalt lihtsam ja odavam stringiks teisendada. Võrdlemiseks ja tehte tegemiseks on samas vaja eraldi funktsioone. Microchip-i teek <math.h> peaks sisaldama ka mingeid funktsioone BCD formaadis numbritega manipuleerimiseks, aga ka nende ise kirjutamine pole eriti keeruline. Sinu juhul vb. mingi järgmine lahendus oleks mõistlikum (eeldusel, et tm_year, tm_month ja tm_day on BCD formaadis): Kood: // ... Loomulikult makrode ja funktsioonide kasutamine on alati lubatud, tulemus oleks igatahes loetavam. Ja mul endiselt pole C-kompilaatorit käepärast, niiet ei tea, kas toodud näida ka copy-paste meetodis toimib. RE: Microchip'i C keel - A.R. - 11-06-2012 Natuke kogemust sellest PICi sprintf-st. On C-s kirjutatud PICi programmi üks lõik. (Kogu C teksti pikkus 837 rida.) Kood: A=input_buffer[0]; mille listingu sama lõik näeb välja nii: Kood: 203: Algseisu(); (Viidi log faili ) Selle PICi hex faili asm logi pikkus on 12656 rida. Ruumi kokkuhoiu mõttes ma kõike siia ei toonud. RE: Microchip'i C keel - andrei - 11-06-2012 sprintf on üks tihedamini taasleiutatud jalgrattaid. Googeldage "minimal sprintf implementation" ja kindlasti leiate midagi enda vajadustele ja lubatud flash'i mahule sobivat. Standardis on ära toodud müriaad formaatimise võimalusi ja sestap on standardne funktsioon kole flashimahukas, aga kui kasutate ainult "%s", "%d" ja "%x"-i, siis võib ka kilobaidi või paariga hakkama saada. Edu! RE: Microchip'i C keel - A.R. - 13-06-2012 (11-06-2012, 01:13 PM)andrei Kirjutas: sprintf on üks tihedamini taasleiutatud jalgrattaid. Vaatasin sinna C18 sisse ja sprintf kutsub välja vfprrintf.c Seal see on kõik võimalused kenasti kirjas. Kui nüüd seal natuke "koristada" siis võib küll ruumi juurde saada. Tapselt samuti on seal siinuse jaoks sincos funktsioon, mida annaks vajadusel natuke täiendada. Aga äkki annaks sinna PICi külge sokutada üks mälupulk, nii 300 GB () ja sealt võtta kõik vajalik. Piisaks ju ka 300 MB aga uhkus ei anna ju häbeneda. RE: Microchip'i C keel - felch - 13-06-2012 Ma leidsin, et C18 sprintf ei toeta float arve Seda on manuaalis ka otse öeldud. |