|
Freie
Version des CC5X-Compilers ist auf 1024 Instruktionen (Maschinen-Befehle)
beschränkt.
Es gibt auch kein Crack für CC5X, wäre auch illegal. Aber CC5X Entwicklern haben eine Möglichkeit gegeben 1K-Grenze überschreiten und sogar beschrieben, wie das geht. Ich biete hier meine eigene Beschreibung der Umgang mit mehreren C- Modulen. |
|
Grundprinzip:
|
![]() |
Laden Sie bitte herunter
Module1.c , Module2.c
, Module.h
Legen Sie bitte die Dateien in gleichem Verzeichnis ab.
Mit CC5X kompilieren:
Eine BAT-Datei mit folgendem Text ausführen. Bitte zuerst richtige Pfade zum
CC5X-Compiler einstellen.
C:\cc5\CC5X.EXE Module1.c -IC:\cc5\ -u -r -a -r2
Oder
Nutzen Sie Jens'
File Editor mit meinem jfe.ini, da gibt
es Schaltfläche "ModuleComp"
Wenn "ModuleComp" mit rechter Maustaste betätigt wird, öffnet sich
Fenster zum Einstellen des Tools. Bitte richtige Pfade zum CC5X-Compiler einstellen.
Zum Kompilieren, Schaltfläche "ModuleComp" mit linker Maustaste betätigen.
CC5X-Compiler generiert dann die Dateien mit Namen Module1.asm und Module2.asm
MPLAB IDE anwenden:
Starten Sie MPLAB DIE.
Im Menü Projekt/New... Geben Sie Namen des Projektes z.B. "Module"
und Geben Sie Verzeichnis in dem sich ihre Dateien befinden.
Im Projektfenster wird Pfad zum angegebenem Verzeichnis erscheinen und Unterpunkte:
Sourse Files, Header Files, Object Files, Library Files, Linker Scripts. Bitte
klicken Sie mit rechter Maustaste auf "Sourse Files" und fügen Sie
die Dateien Module1.asm und Module2.asm zum Projekt.
Bitte klicken Sie
mit rechter Maustaste auf "Linker Scripts" und fügen Sie die Datei
16f871.lkr zum Projekt. Datei 16f871.lkr befindet sich im Verzeichnis ..\MPLAB
IDE\MCHIP_Tools\LKR .
Wählen Sie richtige
Mikrocontrollertype im Menü Configure/Select Device... In unserem Fall das ist
PIC16F871.
Jetzt ist alles vorbereitet zur Herstellung eines ausführbaren Code . Wählen Sie Menü Project/Build All. Es erscheint ein Output Fenster mit vielen Meldungen. Wichtig ist, dass am Ende steht "BUILD SUCCEEDED". Dies bedeutet das keine kritischen Fehler gab und eine HEX- Datei generiert wurde. Sie finden in Ihrem Projektverzeichnis dann "Module.hex" -Datei die in Mikrocontroller gebrannt werden kann.
Besonderheiten bei Arbeit
mit mehreren Modulen.
| In vorherigen Projekten haben wir immer Absolute Code geschrieben und CC5X-Compiler hat von Anfang an Code erstellt, die an einer bestimmten Stelle im Programmspeicher abgelegt werden sollte. | ![]() |
| Relocatable Code ist eine Code, die an beliebiger Stelle im Speicher abgelegt werden kann. Alle Sprunge werden relativ zum Codeanfang angegeben. Erst beim Zusammenfügen aller Objektdateien werden feste Adressen für Sprunge verteilt. | ![]() |
Erklärung der Beispielkode
Module1 hat ein Hauptprogramm, aus welchem Unterprogramm Erhoechen() und U1()
aufgerufen wird.
Im Module1 sind zwei Variablen "a" und "z" deklariert. Diese
Variablen sind nur in Module1 sichtbar.
Module2 beinhaltet Unterprogramme Erhoechen() , U1() und U2() .
U2() ist nur im Module2 bekannt. Erhoechen() , U1() sind in allen Modulen bekannt.
Im Module2 ist Variable "r" deklariert. Variable "r" ist
auch in Module1 bekannt und wird verwendet.
Allgemeine Regel: Jede
Variable und jede Funktion müssen definiert sein (char r;). Variablen und Funktionen
sind in dem Modul bekannt, wo die definiert sind. Um eine Variable oder Funktion
für allen Modulen bekannt zu machen, muss diese Variable oder Funktion im Header-Datei
zusätzlich als "extern" definiert werden (extern bank0 char r;).
Header-Datei wird verwendet, wenn gleiche Text in mehreren Modulen stehen muss.
Es wird nur ein mal Text in Header-Datei geschrieben und dann beim Kompilieren
wird automatisch Text aus Header-Datei an stelle der #include "Module.h"
in jede Modul angefügt. Früher habe ich immer mit einem Modul gearbeitet und
Header-Datei war überflüssig. Inhalt der Header-Datei stand direkt im C-Datei.
Relocatable Code allgemein
Unterprogramme, die in einem Modul verwendet werden, bekommen nur ein Übergabewert
beliebigen Type.
| Richtig | Falsch |
| uns16 test(uns16 b) { b=b+1000; return b; } |
void test(char b,
char c) { b=b+10; } |
Unterprogramme, die in mehreren Modulen verwendet werden, können nur eine Byte-Variable empfange und weitergeben.
| Richtig | Falsch |
| char test(char b) { b=b+10; return b; } |
uns16 test(uns16 b) { b=b+1000; return b; } |
Wenn eine 16-Bit-Variable soll im anderem Modul bearbeitet, dann definiert man eine Variable, die in allen Modulen und Unterprogrammen bekannt wird.
Im Header-Datei:
extern uns16 b;
In einem Modul:
uns16 b;
void test(void)
{
b=b+1000;
}
Es ist eigentlich nichts besonderes, nur einwenig gewöhnungsbedürftig.
Absolute Adresse darf nur ein mal in ganzem Projekt vorkommen. Und es wird für
Interruptvektor benutzt:
#pragma origin 4
Ich werde ein Beispiel zeigen mit Interrupt. Beim Verwenden von Interrupt muss
lkr-Datei angepasst werden.
Dies ist für mich auch
Neuland. Die Websaite wird noch erweitert, sobald ich mehr Erfahrungen gesammelt
habe.
Folgende Themen sind geplant: "Interrupt im Relocatable Code","Fehler
und Fehlermeldungen interpretieren"
|
|
![]() |
Letzte Änderung 26.11.04
|