Anleitung: wie man 1K-Grenze bei CC5X umgeht

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:

CC5X kann 1k Code in einem Modul erzeugen.
Lösung ist ein Programm, die aus mehreren Modulen besteht.
Einzelne Module können in C geschrieben werden und mit CC5X in ASM-Dateien kompiliert.
Diese mehrere ASM-Dateien werden dann mit MPLAB IDE zusammengefügt und es wird eine HEX-Datei generiert.

Ich habe ein Beispielprojekt vorbereitet. Und ich möchte schrittweise erklären, wie Sie dieses Programm kompilieren.


Werkzeuge:
Quelltexteditor, CC5X-Compiler, MPLAB IDE.

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