Forum: Mikrocontroller und Digitale Elektronik Library: Wie Pin Belegungen auslagern?


von Coder (Gast)


Lesenswert?

Hallo,

ich schreibe mir gerade eine Library für AVR in C. Diese soll nicht 
unbedingt als Source in ein Projekt eingebunden werden müssen, sondern 
eher als lib Datei (.lib, .dll, .so, ihr wisst was ich meine) mit den 
Headern zur Verfügung stehen.

Jetzt ist für mich die große Frage:
Wie kann ich so ein Library haben im AtmelStudio und trotzdem die 
Pin-Belegungen etc. in dem Projekt festlegen, das die Lib benutzt?

Also:
* Ich möchte ganz explizit nicht Implementierungen in das 
"Anwenderprojekt" schleppen.
* Ich möchte aber die Definitionen im "Anwenderprojekt" ändern können.

Ist so etwas mit dem Atmelstudio einfach möglich? Makefiles kann ich 
nicht besonders leiden. Ich möchte aber auch nicht alle Library Sourcen 
in ein kleines Projekt importieren müssen.

von user (Gast)


Lesenswert?

Ich weiss nicht ob ich das Problem richtig verstanden habe aber ich 
würde das so machen:

In der Lib sind generische GPIO Funktionen wie diese:
GPIO_INIT(Port, Pin, Mode)
(Port: GPIO-Port, Pin 0..7, Mode: Input, Output, OpenDrain,...)

GPIO_PIN_SET(Port,Pin)
GPIO_PIN_CLR(Port,Pin)
...

In einem Header File zur Lib hast du dann Defines für jeden Pin des 
Controllers, die du an die Funktion übergeben kannst.

In der Anwendung definierst du dnan z.B:

#define LED_Pin   GPIO_Pin_3
#define LED_Port  GPIO_Port_A

und rufst GPIO_PIN_SET(LED_Port, LED_Pin) auf.

von Peter D. (peda)


Lesenswert?

Man kann beim AVR die Ports auch memory-mapped ansprechen.
Dann braucht man aber für jeden Pin die Adresse und die Pinmaske, macht 
also 3 Byte an Parametern je Pin.
Und der Zugriff ist auch nicht mehr atomar, muß also mit Interruptsperre 
gekapselt werden.
Der SRAM-, Flash- und Zeitverbrauch ist also deutlich höher.

von Bastler (Gast)


Lesenswert?

Muß der Code geheim bleiben, oder warum Lib?
Ich verwende bei den heutigen Rechnern/Compilern lieber SourceCode mit 
Konfigurations-Includes.

von Coder (Gast)


Lesenswert?

Nein, es geht hier einfach um Best Practices. Ich möchte den gleichen 
Quelltext und die gleichen Ansteuerungsroutinen nicht immer in jedes 
Projekt kopieren müssen.

von Christian (Gast)


Lesenswert?

Coder schrieb:
> Ich möchte den gleichen
> Quelltext und die gleichen Ansteuerungsroutinen nicht immer in jedes
> Projekt kopieren müssen.

Da hast du doch schneller ne Headerdatei mit eingefügt als eine Lib zu 
erstellen und diese jedes mal einzufügen.
Ich würde das sauber in eine Headerdatei schreiben und fertig. Die 
ganzen Schnittstellen wie ADC, DAC, USART,.... könnte ich mir eher in 
einer Lib vorstellen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Coder schrieb:
> nicht immer in jedes Projekt kopieren müssen

Es gibt auch noch eine Welt außerhalb des kopierens ;-)
SCM bietet da faszinierende Möglichkeiten, die meisten IDEs könnne auch 
aus "fremden" Projekten Code nutzen (wie würde eigentlich deine dll ins 
Projekt kommen... kopieren?).

Das Problem sind vor allem ggf. die Prozessorspezifischen Eigenheiten, 
du müsstest also im blödstem Fall die Lib für jeden Prozessortyp einmal 
übersetzen.

von Coder (Gast)


Lesenswert?

Ja das stimmt, das ist eigentlich eine gute Idee. Problem ist dann aber, 
dass man wohl die Header abändern muss und die dürfen dann nicht wieder 
eingecheckt werden bzw. werden auch leicht bei Updates überschrieben.

Außerdem landen die Sources ja im Endeffekt wieder in der gleichen 
Working Copy, was mir ehrlich gesagt nicht gefällt. Ich hätte gerne ein 
Konfigurationsmanagement mit den Vorteilen, dass ich PIN-Belegungen 
einfach spezifieren kann, aber den implementierenden Code nicht in ein 
AtmelStudio Projekt einbinden muss. Der kann ja im Hintergrund da sein 
oder von einem Build-System automatisch geholt werden, aber das würde 
ich zumindest gerne verstecken, es interessiert ja im Projekt nicht und 
ist nur Noise.

Das einzige was ich im Projekt wirklich sehen möchte, ist die 
Pinbelegungs-Konfiguration.

von Karl H. (kbuchegg)


Lesenswert?

Coder schrieb:
> Ja das stimmt, das ist eigentlich eine gute Idee. Problem ist dann aber,
> dass man wohl die Header abändern muss und die dürfen dann nicht wieder
> eingecheckt werden bzw. werden auch leicht bei Updates überschrieben.

Du musst in deiner Projektumgebung eine 2-teilung erreichen.

Der eigentliche Source Code bleibt ein für alle mal auf seinem 
Verzeichnis. Den gibt es nur einmal.
In die Projektsteuerung kommt lediglich ein Verweis auf diesen immer 
gleichen Code rein.

Die Konfigurationsdaten, also das Header-File hingegen, das hast du auf 
deinem Projektverzeichnis.


Die Schwierigkeit besteht jetzt darin, den 'Lib'-Source Code dazu zu 
bringen, dass er sich das Konfigurationsheaderfile von deinem 
Projektverzeichnis holt. Normalerweise bedeutet das, dass man bei den 
Compiler-Einstellungen mit den Include-Verzeichnissen etwas rumspielen 
muss.

> Außerdem landen die Sources ja im Endeffekt wieder in der gleichen
> Working Copy, was mir ehrlich gesagt nicht gefällt.

Das kommt drauf an.
Denn auf der anderen Seite kann es auch ganz sinnvoll sein, dass man 
dokumentiert hat, mit welcher Version der 'Library' das Programm 
gelaufen ist. Denn auch Libaries entwickeln sich ja weiter. Auch 
Source-Code Libraries.

> Konfigurationsmanagement mit den Vorteilen, dass ich PIN-Belegungen
> einfach spezifieren kann, aber den implementierenden Code nicht in ein
> AtmelStudio Projekt einbinden muss.

Einbinden musst du es.
Aber einbinden bedeutet nicht, dass du den Source Code auf das 
Projekt-Verzeichnis kopieren musst. Dem Atmel Studio ist es prinzipiell 
egal, auf welchen Verzeichnissen die Source Code Files liegen, die du in 
einem Projekt hast.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Denn auf der anderen Seite kann es auch ganz sinnvoll sein, dass man
> dokumentiert hat, mit welcher Version der 'Library' das Programm
> gelaufen ist.

Mit SVN externals kann man sich sogar einen definierten Stand in "sein" 
Projekt holen, sodass selbst ein Weiterentwickeln und Upgrade kein 
Problem sein muss.

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.