Fórum témák
» Több friss téma |
Ez nem C, de ki lehet belőle indulni. Persze flow-ban nem fog menni...
Hello. Ismerkedek a Flowcode al, amit egyszer szeretnék összehozni vele, egy 2 hengeres kistraktor henger hömérsékleteit kijelezni 2x2 darab 7 szegmenses kijelzön pl 0 tol 99 fokig. Mi a járhatobb ut, 2xDS1820 vagy 2xLM35 (1wire vagy analog) ?
Köszönöm
Kezdőnek egyszerűbb az lm 35- az csak egy ADC beolvasás , és ebben az alkalmazásban nem is fontos a tizedfokos pontosság .
Sziasztok!
Mai aktuális találós kérdésem az lenne, hogy hogyan lehet digitekre bontani egy 10 elemű(ULONG) számot a legrövidebb kóddal, a legkevesebb számítással? Nem a blokkok száma a lényeges, hanem a valós programsorok száma, amit a C forrásban fogok majd megnézni. Ha a szimulációhoz a végére szükséges egy blokk a törésponthoz, az nem számit bele a hosszba és a változók kezdő értékkel való feltöltéséhez szükséges blokk sem az elején, csak a számításhoz szükséges programsorok. A változóknak ne adjunk alapértéket a létrehozásnál, mert úgy is fel kell őket tölteni a programban, így tárhelyet spórolunk (Ha a létrehozásnál alapértéket adunk, ahhoz is fel lesz haszálva egy-két programsor, tehát duplán és feleslegesen foglalunk program memóriát, a C kódban ez látható, ha belenézünk!). Csak Flowcode megoldást küldjetek légyszíves! Határidő ma este. Jó fejtörést! A hozzászólás módosítva: Dec 19, 2012
Szia!
Ez a léptetős, korrigálós módszer nem működne FlowCode -ban. Sajnos nem tudom próbálni...
Annyira már nem akartam belemenni, hogy a végleges gépi kód legyen a legkisebb, bár igazából a helykihasználás miatt ez lenne a lényeg. Itt elsősorban logikai feladatot szerettem volna megfogalmazni, amin jól lehet törni a fejünket.
Az is egy jó kérdés, hogy amit Flow-ban, vagy C-ben megírunk, az végül is mire fordul. A fordítókba be van-e építve az a sok finesz, amit ilyen asm kódok formájában találhatunk a neten, mint követendő példák. A gyanúm az, hogy az univerzális követelmények miatt nincsenek. Szóval itt inkább az eddig használt digitekre bontástól eltérő, kevesebb számítással elvégezhető rutin lenne a feladat. Eddig a 10 digithez legalább 20 MOD , osztás és kivonás művelet lett felhasználva(korábban fel is lett téve pár db megoldás). Én most arra lennék kíváncsi, hogy hogyan oldanátok meg ezt programhatékonyabban. Az biztos, hogy a C kód is kevesebb sort tartalmaz, ami a folyamatábrából fordítódik. Az asm-ot még nem néztem, de mindjárt meglesem, hogy a két megoldás között mekkora a lefordított kódméretbeni különbség...
Szia! Nem tudom hogy ilyenre gondoltál e.
Ebben a kódban egyetlen osztás vagy modulo sincs! Mindegy milyen nyelen írjuk meg. Bitenként átforgatja a számot, ha egy BCD digiten a msb 1, akkor a digithez 3 -at hozzáad.
32 bites számra csak 33 assembly utasítás a return -nak együtt. A hozzászólás módosítva: Dec 19, 2012
Ezzel szemben a Flowcode a csatolt számítással 70bájt RAM-ot és 1126bájt program memóriát foglal.
A feladat referenciájáúl szolgáló kódom pedig 63bájt RAM-ot és 396byte RAM-ot, ami kb. 198 assemly utasításnál kevesebbnek felel meg egy 18F-ben. Láthatod, hogy nem lehet összemérni az általad példának felhozott kóddal, nem is ez a cél most itt, ez túlhaladná a flow-t választók érdeklődési körét. Az eddig itt használt számítás menetét beillesztem ide szövegesen is, ha nem tudnád megnyitni a forrást:
Szia!
Igen, ez egy jó megközelítés! A szimulátor hibáját én észre se vettem, de valóban hibázik nálam is. A megoldásodon lehetne még finomítani, mert 86bájt RAM-ot és 550bájt program memóriát fogyaszt. Ennek oka a lehetséges minimumtól több művelet. Ennek ellenére ügyes, hogy felismerted, hogy ciklusba lehet szervezni a feladatot és alulról lehet bontogatni a számot és tömbbe rakhatod az eredményt, bár én nem string tömbre számítottam, méretét tekintve mindegy, mert bájtokat foglal az elemszám szerint. Az eredeti megoldáshoz képest ez máris a fele memóriát használja csak! A hozzászólás módosítva: Dec 19, 2012
Az előbb elírtam, 396bájt flash akart lenni...
Egyébként az az érdekes, hogy a C kód sorszáma nem tér el az én verziómtól, még is nagyobb kódot fordít!
Ha még töröd a fejed a méret csökkentésen, akkor vedd ki az LCD-s részeket és 18F252-be fordítsd, hogy össze tudd hasonlítani a memóriaigényeket. 16F-re egyébként 257szót írt ki... Még annyit, hogy a szimulátor 9digittel még jól elboldogul! A hozzászólás módosítva: Dec 19, 2012
Ram:81bytes
Rom:524bytes 10-el is elboldogul egészen addig amíg az első digit 1-es utána ront.
Tetszik az X>0 húzás! Az ember mindig tanul! A flowcode rejteget még titkokat!
Viszont a ram:63, rom:396 még távol van, máshol kell keresni a megodlás. Segíteni nem akarok, másoknak is legyen lehetősége. szerk: Az x>0 megoldással(nálam cik<10), ram:62, rom:392. A hozzászólás módosítva: Dec 19, 2012
Akkor csak jó volt valamire az én progim is
Abszolút! Írtam, hogy az eredetihez képest jelentősen jobb a megközelítése a feladatnak, kis módosítással megtalálnád a megoldást is!
A kicsi megoldások pedig hasznosak lehetnek azoknak, akik kevesebb flowcode forrást láttak, azaz új a fejlesztői környezet. Annyit hozzátennék, hogy amikor a ciklus blokkban beállítjuk a ciklusok számát, akkor a fordító létre hoz egy ciklus számlálót a C kódban, de nem lehet hozzáférni blokk oldalról. Kár, hogy nem lehet, mert egy változóval és néhány művelettel (x=x-1), kevesebbet kellene kódolni, miután a for ciklus ezt megteszi eleve. Ez sem túl hatékony megoldás a Flow fejlesztőitől... A hozzászólás módosítva: Dec 19, 2012
ram:72
rom:358 Nem semmi! Több sorba bontott alap műveletekkel, sokkal kisebb lett a kód! Ez tanulságos! Kisebb lett 38bájttal, mint az enyém, gratulálok! A RAM is csökkent az első verziódhoz képest, de még magasabb, mint a én verziómban. Kérdés, hogy mi a fontosabb!? Alkalomtól függ, hogy a RAM-al vagy a ROM-al van gondunk.
Kár hogy hibás volt ugyanis a szam2 rossz hosszúságúra volt beállítva és ha ulongnak állítom be akkor már nem jó, ezért töröltem.
A hozzászólás módosítva: Dec 19, 2012
Köszönöm mindkettötöknek. Tehát akkor ingujját feltürni és neki esni az ADC net.Esetleg van valahol arra már példa hogy hogyan oldjam meg hogy a kiolvasott értéket hogyan jelenitsem meg a kijelzön(nemtudom megfogalmazni magyarul, pl. 10 foknál az elsö kijelzön az 1 es jelenjen meg, másodikon a 0 jelenjen meg.)? Elöbb linkeltek egy véletlenszám generálot ami 7segmenses kijelzön jeleniti meg a számokat.Használható ehhez is? Köszönöm
Aha! Kis turpisság! A rövidebb változóhoz tartozó műveletek kevesebb kódot kérnek!
Egyébként valamivel kevesebb RAM-ot hazsnál, ram:75 de több flash-t, rom:528. Akkor még kellene valami csavar, hogy csökkenjen a méret!
Hát elég nagy lett ez igaz, viszont ez is egy különleges megközelítés, nekem eszembe se jutott volna a string művelet. Az jó kérdés, hogy igazából az ASCII kódokat tartalmazza a változó, ami bizonyos műveleteknél jobb, másoknál egyáltalán nem jó azaz további feldolgozást igényel. A C kód, amire fordul elég nagy és a kód is nagyra fordul(ram:94, rom:1296), ezért nem igazán teljesíti a feladat méretbeli részét.
Mindenesetre ismét egy érdekes gondolatmenetet láthattunk! Köszi!
ram:86, rom:710. Visszafejlődés.
Vigyázz, 16F-eknél nem a bájtokat írja ki, hanem a szavakat(word)! Ezért kértem, hogy 18F252-re fordítsunk!
Elnézést kérek, engem is megtréfált az egyik változó ezért hibás méreteket írtam le eddig. A pontosan működő verzió adatai a következők:
ram:72 rom:458 Ezek szerint kokozo nem nagy az eltérés a két program között... |
Bejelentkezés
Hirdetés |