knihovna? co to vlastně je?

Zdravím,

měl bych otázečku ohledně knihoven. vim že něco takového existuje a že se importuje #include nebo tak nějak. Můžete mi prosim lépe objasnit co to ta knihovna vlastně je, co je v té hnihovne, jak se vytváří a jak se s ní pracuje?

s pozdravem
Pawalos

to je třebas to, že si napíšeš celou komunikaci např.proLCD diaplej nebo obsluhu I2C sběrnice a tu si uložíš jako samostatný soubor. A abys to nemusel kopírovat do hlavmího programu nebo to pořád psát tak jí tam prostě jenom na includuješ a voláš jí jako podprogram např…
Snad je to jasné

hm hm, to chápu, a můžu se eště zeptat jak tu knihovnu založim? si otevřu projekt a namačkám ,add new file to project…, a uložim to do složky projektu, nějak si to pojmenuju a jakou to bude mít koncovku ? .lib ?

Toto nie je kniznica ale preklad viacerych *c suborov, ak sa odladena komunikacia s LCD ulozi ako *.c subor a nevygeneruje sa kniznica.
Kniznica je nieco podobne, ale nemusi byt nikde vidiet jej zdrojovy kod. A tym ani nemusi byt moznost jeho editacie a tym ani pokazenia. Pri oddelenom preklade je *.c subor (napriklad s tou obsluhou LCD) zahrnuty do projektu a teda moze byt lubovolne - i omylom - zmeneny. Pri oddelenom preklade sa ani jednotlive *.c do seba neincluduju. To je skoro zvrhlost, ale pre zaciatocnikov-samoukov ospravedlnitelna. Sam som si tym presiel, nez som pochopil “zac je toho loket” :slight_smile:

promiň, ale dělám v asm a tam to používám tak jsem psal…

Takže nic :wink:

hm :slight_smile: tak tedkom sem se trochu zamotal :slight_smile:
tak abych se trochu srovnal, píšu to v asembleru a v C nevim jak to funguje a Martin píše o programování v C že? takže tem soubor co naincluduju tedy neni knihovna? to je tedy jen nějaký přídavný soubor?

Ano, sorry, programujem v C (GCC). Nejak mi uslo, ze sa jednalo o asm.

Kniznica ma priponu .a a neincludujem ju. Vyberam ju v polozke Project\Option\Libraries. potom sa mozem odvolavat na funkcie, ktore ale v mojom (ani v include subore) nie su definovane.
Cez include sa vkladaju najcastejsie rozne headre (
.h) bud vlastne, alebo dodavane s prekladacom obsahujuce vela uzitocnych funkcii. To vsak nie su kniznice, ale headre najcastejsie s deklarovanymi konstatntami a deklaraciami funkcii (t.j. len s popisom, ze nejaka taka funkcia sa niekde nachadza, deklaracia vsak neobsahuje definiciu samotnej funkcie) pripadne i s jednoduchymi funkciami. Otazka na zaciatku znela na kniznice a nie na zdrojove subory. Neviem ako sa s kniznicami pracuje v asm, ale ako som pisal hlavny rozdiel je v tom, ze zdrojovy text kniznice - na rozdiel od headrov - sa do suboru nevklada.
Ak niekto svoj kod s roznymi uzitocnymi funkciami ktory includuje do svojho zdrojaku nazyva “kniznicou”, treba vediet, ze sa nejedna o kniznicu v pravom slova zmysle. Neviem, co by som k tomu uz viac napisal. Snad ma doplni niekto s lepsimi vyjadrovacimi schopnostami. :slight_smile:

no ani já nevěděl, že se jedná o asm, a hlavně jak on má ten includ napsaný tak tak se zapisuje v céčku… v asm je to .include “název souboru.přípona”

Ahoj, nevím s jakým uC pracuješ, já dělám s PIC a u nich je #include tzv. directiva (tedy příkaz) překladače - v mém případě je to MPASM od Microchipu (mluvím samozřejmě o práci v assembleru). Zde je popis této directivy z manuálu MPASM:

4.41 #include – INCLUDE ADDITIONAL SOURCE FILE

4.41.1 Syntax
Preferred:
#include include_file
#include “include_file”
#include <include_file>
Supported:
include include_file
include “include_file”
include <include_file>

4.41.2 Description
The specified file is read in as source code. The effect is the same as if the entire text of the included file were inserted into the file at the location of the include statement.
Upon end-of-file, source code assembly will resume from the original source file. Up to 5 levels of nesting are permitted. Up to 255 include files are allowed.

Tato directiva tedy vkládá do Tvého vlastního zdrojového textu jiný (dříve vytvořený) zdrojový text a to na to místo, kde je directiva #include umístěna. Velmi často se to taky využívá k vložení tzv. definičního souboru, který obsahuje definici všech registrů procesoru a to tak, že zcela na začátek vlastního zdrojového textu napíšeš např. #include p16f84.inc a pak už nemusíš ve vlastním zdrojovém kódu pracně vypisovat na které adrese leží který registr, protože tyto informace si překladač vezme ze souboru *.inc. Musíš však potom samozřejmě používat přesné názvy registrů, tak jak jsou uvedeny v definičním souboru, včetně velkých a malých písmen atd.
Zdrojový text ze vkládaného souboru se tedy v Tvém zdrojovém textu vůbec neobjeví, ale překladač jej samozřejmě přeloží a zahrne do výsledného binárního souboru.
Důležité je nastavit správně cestu ke vkládanému souboru (v manuálu bývá popsán způsob, jakým překladač hledá cestu k souboru a taky to, jak lze toto hledání ovlivnit.

Možná by bylo dobré, kdybys napsal, s čím pracuješ a jaké vývojové prostředí používáš (já používám MPLAB IDE od Microchipu).
Vlasťa

knihovna sem to nazval protože sem si tak nějak myslel že je to něco jako knihovna. nevěděl jsem tak se tomu říká odborně, takže se velice omlouvám za zmatky vzniklé z mojí nevědomosti. Dočetl sem se že se tím vkládá část programu, tak jsem zpočítku myslel že je to něco jako knihovna podprogramů. vlasta_vlcek to popsal velice pochopitelně a už je mi to jasné. a jak tedy tento soubor vytvořim? nedal by jste mi sem nějaký náhled? a bylo by možné to použít i na podprogramy? že bych třeba skočil někam na adresu na page3 a tam to vložil? pak bych jen v hlavním zdrojovém kódu přepnul page a zavolal si tem podprogram?

pracuji s PIC16F… v asembleru, MPLAB

Mám dojem, že si stále nerozumíme.

Dáme si příklad:

  1. Napíši a odladím kousek programu v assembleru, který má za úkol číst data z nějaké klávesnice. Nazvu jej např. KLAV.ASM a pod tímto názvem si jej někam uložím.
  2. Napíši si a odladím kousek programu v assembleru, který má za úkol zobrazit obsah registru W na displeji. Nazvu jej např. DISP.ASM a pod tímto názvem si jej opět někam uložím.
  3. Napíši si a odladím kousek programu v assembleru, který má za úkol vyrobit krátký zvukový signál (pípnutí). Nazvu jej např. ZVUK.ASM a pod tímto názvem si jej opět někam uložím.

A nyní budu chtít napsat program, který něco dělá (je jedno co) a kromě toho má za úkol testovat klávesnici a pokud na ní něco zmáčknu, tak kód této klávesy zobrazit na displeji a krátce pípnout.

Tu část programu, která “něco dělá” samozřejmě musím napsat. Ale program, který umí číst klávesnici již mám hotov (klav.asm), rovněž tak program, obsluhující displej a zvuk (disp.asm, zvuk.asm), takže tyto již nemusím znovu psát, ale stačí, když je vložím do mého nově vytvářeného programu.

A to mohu udělat dvěma způsoby:

  1. Zkopírují přes schránku obsah souborů klav.asm, disp.asm, zvuk.asm a ručně je vložím na správná místa do mého programu nebo

  2. Na správná místa mého programu vložím:
    #include <klav.asm>
    #include <disp.asm>
    #include <zvuk.asm>

Když pak spustím překladač (v MPLAB = Build All nebo Make) tak ten neudělá nic jiného, než že čte můj zdrojový text řádek po řádku a pokud mu rozumí, přidělí mu správný binární kód instrukcí a dat, kterému rozumí programovací zařízení, kterým se to pak “napálí” do procesoru.

V případě metody č. 1 je vše jednoduché, překladač pouze zkontroluje syntaxi zápisu a je hotov.

V případě metody č. 2, však překladač v určitém místě narazí na #include <klav.asm>, a udělá to, že najde na disku soubor klav.asm, jeho obsah vloží do mého zdrojového textu na místo, kde bylo toto directivum, totéž udělá se zbývajícími dvěmi soubory disp.asm, zvuk.asm a všechno to pak přeloží do jediného binárního souboru s koncovkou hex, kterou pak můžeš předhodit programátoru a ten jím nakrmí programovou paměť procesoru.

Rozdíl mezi těmito dvěmi metodami je tedy pouze v tom, že v prvém případě jeden jediný zdrojový text obsahuje kompletní text, který potřebuji ke správné funkci celého programu (včetně všech těch částí, které obsluhují klávesnici, displej a zvuk) kdežto v druhém případě obsahuje pouze nově napsaný text a neobsahuje ony již dříve vytvořené texty pro klávesnici, displej a zvuk (obsahuje jen odkazy na ně). Zdůrazňuji, že mluvím o zdrojových textových souborech, nikoliv o přeloženém binárním kódu, který je pochopitelně v obou případech stejný!

Takže ono se vlastně dá v tomto slova smyslu mluvit při práci v assembleru o knihovnách, protože já si takto mohu vytvořit zdrojové kódy (podprogramy) pro jednotlivé dílčí operace, které se při práci s uC často vyskytují a pokud je mám správně (= univerzálně) napsané, tak je pak mohu použít v libovolném nově vytvářeném programu.

Rozdíl od vyšších jazyků je v tom, že takto v assembleru vytvořená knihovna je pro všechny čitelná, což nemusí být vždy žádoucí. Na druhou stranu je v tom i určitá výhoda, protože velmi často se dostaneš do situace, kdy je podprogram napsán pro jiný typ mikrořadiče, což může znamenat, že zdrojový kód je použitelný (protože instrukční sada je shodná), ale nesouhlasí např. adresy portů. Pokud máme čitelný zdrojový kód, není nic snažšího, než přepsat pár řádků programu, které definují porty a jsme hotovi.

Myslím, že je v podsatě jedno, který z uvedených způsobů použiješ. Přiznám se, že já používám directivum #include pouze k připojení definičních souborů a všechny ostatní (i dříve vytvořené “knihovní” podprogramy) ručně vkládám (kopíruji) do svého programu. Dělám to proto, že chci mít v jednom jediném dokumentu kompletní zdrojový text. Zkušení programátoři sice určitě namítnou, že při rozsáhlejších projektech je pak zdrojový text měně přehledný, ale mně to takto vyhovuje. Navíc - programátorů, kteří píší rozsáhlejší projekty v assembleru bychom asi dneš už příliš nenašli :slight_smile:.

Zdraví

Vl.

ááááha :smiley: tak tedkom už je mi v tom jasno :smiley:
ale tyto ,knihovny, si můžu dělat jen z dobře odladěných podprogramů ne? protože při ladění programu a krokování se do té knihovny nedostanu že?

ale ještě jestli můžu dotaz, co je to za soubor když má koncovku .inc?

Samozřejmě, jedná se téměř vždy o fungující a ověřené podprogramy, které by měly být, jak už jsem psal, napsány co nejvíce univerzálně (většinou mají definován nějaký vstup dat a výstup dat - často to bývá pracovní registr, takže pak stačí uložit data do “vstupního” registru, zavolat podprogram a po jeho vykonání si zpracovaná data vyzvednout ve “výstupním” registru).

Protože jsou však tyto podprogramy psány v assembleru a jsou tedy čitelné, je možno je v případě potřeby samostatně editovat anebo, jak už jsem uvedl, zařadit (zkopírovat) je přímo do svého zdrojového textu a tam si s nimi můžeš dělat cokoliv Tě napadne (třeba i pokazit původně dobře pracující podprogram :slight_smile:.

Soubory s koncovkou .inc obsahují definice veškerých registrů a jejich jednotlivých bitů. Jsou to normální textové soubory.
Nejlépe to pochopíš, když si některý z nich otevřeš a podíváš se, co obsahují. Pokud máš standardní instalaci Microchipu, pak je najdeš zde: … Program Files/Microchip/MPASM Suite.
Tak např. uvidíš, že u PIC16F84A je registr STATUS umístěn na adrese 0003h, registr TRISA na adrese 0085h, bit RP1 v registru STATUS je v pořadí šestým bitem atd.
Úplně klidně si můžeš z tohoto souboru zkopírovat pouze řádky, které Tě zajímají a vložit si je na začátek svého programu, ať máš všechno hezky přehledně po ruce. To je dobré u jednodušších programů, kde používáš např. jen port a registr STATUS. Pokud však začneš dělat něco rozsáhlejšího a začneš využívat např. A/D převodník, pár čítačů, komunikační porty a pod., pak Ti množství potřebných registrů naroste takovým způsobem, že jejich definice, vložené do programu, by zabraly celou stránku textu. V takovém případě je lepší napsat na začátek zdrojového textu: #include <p16f84.inc> a máš jistotu, že od této chvíle ví překladač o všech registrech a jejich bitech. Jen si musíš dát pozor na správný zápis (pojmenování) registrů a jejich bitů - musí být ve zdrojovém textu uvedeny přesně tak, jako jsou uvedeny v .inc souboru. Velmi často se např. chybuje u registru OPTION. V datasheetu PIC16F84 je na str. 9 označen jako OPTION REGISTER. Svádí to napsat např. MOVWF OPTION. Překladač však oznámí, že takový registr nezná a má pravdu, protože jeho správné označení je OPTION_REG, jak je už správně uvedeno na str. 6 a 7.

Ale pozor! Vůbec nic Ti nebrání v tom, aby jsi na začátku svého programu napsal např. tuto definici: OPTION EQU 81h a pak bude mít tento registr opravdu označení OPTION, protože jsi mu je zkrátka přidělil (mezi námi děvčaty - můžeš jej nazvat jakkoliv - třeba MOJE_KOCKA_LIZA EQU 81h a bude to pořád tentýž registr)! Fungovat to bude, problém bude jediný - že tomu budeš rozumět asi jen Ty :slight_smile:.

Snad jsem to příliš nezamotal …:slight_smile:.

Vlasťa

až do teď sem si vždy všechny registry definoval na začátku programu. zkusím to includovat.

tedkom už snad vím vše co mě zajímalo :smiley: Takže Vám velice děkuji za rozsáhlé informace :slight_smile: ostatním děkuji také :slight_smile: