Forum: Mikrocontroller und Digitale Elektronik Atmelstudio library selber schreiben


von sony (Gast)


Lesenswert?

Hallo,

seit mehreren Stunden versuche ich jetzt nachzuvollziehen, wie ich meine 
eigene library schreiben kann. Was ich bis jetzt verstanden habe:

-ich brauche eine Headerdatei mit den Deklarationen aller Funktionen
-in eine separate C-Datei schreibe ich dann das eigentliche Programm
-ich binde die Headerdatei in die C-Datei ein

Nur leider scheitert es bei der Umsetzung. Wie gehe ich vor? Ich habe 
schon so viel ausprobiert, es wäre nett, wenn jemand das einmal in 
einfachen Schritten aufzählen könnte. Muss ich etwa unter "new project" 
ein "static library project" erstellen? Oder einfach eine Datei mit 
Endung ".h" und eine
mit ".c"?
Außerdem: Der Sinn des Linkers ist es ja, kompilierten Code... nun ja... 
zu linken. Dazu müsste der Code ja Gerätespezifisch sein; irgendwo 
müsste ich also den Mikrocontroller auswählen?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Der µC wird ja nicht in Deinem Code ausgewählt - der Compiler wird 
meckern, wenn Dein Code nicht zu dem µC passt ;)

Wie sieht eine Einfachst-Library unter C aus?

'Kenne' bis jetzt nur ein/zwei vom Arduino - und Deren Inhalt 
unterscheidet sich doch schon von dem normalem Programm.

Allerdings durchaus sinnig aufgebaut, also zum Teil ;)

Woher hast Du Deine Informationen, was konntest Du daraus entwickeln und 
wo scheiterst Du?

MfG

von sony (Gast)


Lesenswert?

Ich habe die Informationen u.a. von hier:

https://www.mikrocontroller.net/articles/Funktionen_auslagern_(C)

Außerdem habe ich immer auf Youtube die Serie "Arduino for production" 
von Patrick-Hood-Daniel verfolgt, die sich trotz des irreführenden 
Namens mit der C-Programmierung von AVRs beschäftigt. Er hat in einem 
Video eine Header datei erstellt, aber sämtlichen Code einfach in diese 
hieingeschrieben, was ja nicht Sinn der Sache ist.
Ich habe jetzt mal einfach eine .h Datei und eine .c Datei erstellt und 
beide über den Solution Explorer manuell eingebunden. Das hat sogar 
geklappt!
Dann verstehe ich nur nicht, wieso ich bei "new project" die Option 
"build static library" habe, denn wenn ich das mache, darin eine 
header-Datei erstelle und die library als solche über den Solution 
Explorer einbinde, bekomme ich eine Fehlermeldung.

von sony (Gast)


Lesenswert?

Wo muss z.B. die C-Datei, also die eigentliche library, gespeichert 
werden? Als ich die Header-Datei und besagte C-Datei in dem gleichen 
Ordner wie main.c speicherte und den header über #include "[name des 
headers" einband, wurde der header nicht gefunden.
Und dann lese ich hier

https://www.mikrocontroller.net/articles/Libraries#Fertige_Library

etwas von einer .a Endung, die (laut Artikel) kompilierte Form der 
library.
Wie passt das dazu, dass ich doch eigtl. eine Header-Datei und eine 
Datei mit C-Sourcecode brauche?

von Daniel A. (daniel-a)


Lesenswert?

Angenommen man will eine statische Library (.a) erstellen, dann muss man 
sich bewusst sein, dass das einfach nur ein Archiv von .o dateien ist. 
Das Interface zur Library stellen dann die .h dateien der Library dar, 
die Implementation die .c Dateien.

Angenommen meine Library stellt die funktion getRandomNumber bereit, 
dann könnte diese so aufgebaut werden:

mylibrary/src/header/mylibrary.h
1
int getRandomNumber(void);

mylibrary/src/mylibrary.c
1
int getRandomNumber(void){
2
  return 4; // chosen by fair dice roll.
3
            // guaranteed to be random.
4
}

Compilieren und library erstellen:
1
gcc src/mylibrary.c -c -o tmp/mylibrary.o
2
ar cr bin/libmylibrary.a tmp/mylibrary.o

Jetzt haben wir eine statische Library mylibrary/bin/libmylibrary.a und 
das interface dazu in mylibrary/src/header/mylibrary.h. Nun könnte man 
das in einem Projekt wiefolgt verwenden:

myproject/src/main.c:
1
#include <mylibrary.h>
2
3
int main(){
4
  return getRandomNumber();
5
}

Und compilieren:
1
gcc -L../mylibrary/bin/ -I../mylibrary/include/ -lmylibrary src/main.c -o bin/myproject

Das -L ist das Verzeichnis wo die library gesucht werden soll, -l zum 
dazulinken der Library, und mit -I wird dem Kompiler mitgeteilt, wo die 
Headerfiles der Library zu suchen sind.

Die Commandos fürs Kompilieren kann man dann in ein Makefile packen, man 
kann aber auch cmake, automake, etc. verwenden. Danach muss man am 
schluss jeweils nurnoch "make" eintippen.

Deine IDE wird vermutlich auch Optionen haben, um anzugeben welche 
Dateien zu kompilieren sind, wo die Header liegen, etc. Das ist dann 
aber IDE spezifisch und in anderen Umgebungen ohne diese nutzlos. In 
IDEs kann man jedoch meistens auch ein Makefile auswählen. Weil 
makefiles (ich meine hier auch Dinge wie cmake oder automake) unabhängig 
von Entwicklungsplatform und IDE nutzbar sind, findet man bei OpenSource 
Projekten, wie man sie auf z.B. GitHub sieht, normalerweise nur die 
Makefiles, aber keine Projektdateien irgendwelcher IDEs. Ich empfehle 
deshalb sehr, Makefiles zu verwenden.

PS: Der code ist ungetestet und wurde auf einem Ipad 2 um 4 uhr morgens 
eingetippt...

von berndl (Gast)


Lesenswert?

Daniel A. schrieb:
>
1
> int getRandomNumber(void){
2
>   return 4; // chosen by fair dice roll.
3
>             // guaranteed to be random.
4
> }
5
>
da fehlt aber auch noch der Quellennachweis :o)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.