Linkersettings für Bootloader bei HiTech PICC18 mit MPlab
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Entwicklungswerkzeuge  |  Compiler  |  Linkersettings für Bootloader bei HiTech PICC18 mit MPlab « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Linkersettings für Bootloader bei HiTech PICC18 mit MPlab  (Gelesen 2057 mal)
 
wberger
Full Member
***
Offline Offline

Beiträge: 204


Profil anzeigen
« am: Januar 30, 2010, 10:49:11 »

Ich möchte mich an einem Bootloader für den PIC18F4585 versuchen. Entwicklungssystem ist: PICC18 V9.5 in MPlab + ICD2.

Warum ich nicht einfach einen der vorhandenen Bootloader nehme? Der Download soll per I2C erfolgen und dafür habe ich nichts Sinnvolles gefunden.

Die größten Schwierigkeiten bereitet mir der Linker. Während für andere Compiler immer das Linkerfile propagiert wird, scheint Hitech darauf verzichten zu wollen (zumindest legt mir das die Doku nahe). Ich wollte nun mal für den Start die Applikation und einen einfachst Bootloader per ICD2 herunterladen. Aber leider läuft die Applikation nicht los. Was mache ich falsch?

Hier der einfachst Bootloader. Er lässt ein paar mal eine LED blinken und soll dann zur Applikation springen. Brenne ich nur diesen Bootloader auf den PIC blinkt auch die LED. Soweit kein Thema.

Code:

#define _PIC18xxx
#include <htc.h> // Contains Config Macro and includes pic18.h

#define PROG_START 0x800

// Fuses ##################################################################

__CONFIG(1,RCIO & FCMEN);     // Internal Clock & Clock Failsafe Monitor Enabled
__CONFIG(2,BOREN & BORV43 & WDTPS32 & WDTDIS & PWRTDIS);  // Brown out 4.3V, Powert Timer does not work with ICD Debugger, Watchdog disabled (Software control)   
__CONFIG(3,MCLREN & PBDIGITAL );  // MCL activated, PortB digital on startup
__CONFIG(4, XINSTDIS & LVPDIS & DEBUGEN & BBSIZ1K);  // extended instruction off, low voltage programming disabled   


#include "bootloader.h"

unsigned char i,j;

#asm

psect intcode,class=CODE // redirect interrupts to new routine addresses
goto PROG_START+8

psect intcodelo,class=CODE // redirect low priority interrupts to new routine addresses
goto PROG_START+0x18

#endasm

void main() {

// Init
// Start with all digital inputs
ADCON1 |= 0x0F;

// Switch Comperators Off
CMCON = 0x07;

// Oscillator Config
    OSCCON=0b01110000; /*
     ||||||||--- SCS0: System Clock Select 10 = Internal Oscillator; 00 = Primary Osc
             |||||||---- SCS1
  ||||||----- IOFS: Flag
             |||||------ OSTS: Flag
             ||||------- IRCF0 Internal Oscillator Frequeny Select. 111 = 8 MHz
             |||-------- IRCF1
             ||--------- IRCF2
             |---------- IDLEN: Idle Mode / Sleep Mode           */

PLLEN = 1; // Enable PLL for Int Osc. (Attention: Sequence DOES matter. First set osccon, then enable PLL)

// Show state with LED
TRISE1 = 0;

for (i=0;i<255;i++) { for (j=0;j<255;j++) {  NOP();  }   }
LATE1 ^= 1;
for (i=0;i<255;i++) { for (j=0;j<255;j++) {  NOP();  }   }
LATE1 ^= 1;
for (i=0;i<255;i++) { for (j=0;j<255;j++) {  NOP();  }   }
LATE1 ^= 1;
for (i=0;i<255;i++) { for (j=0;j<255;j++) {  NOP();  }   }
LATE1 ^= 1;


// Now start Aplication

#asm
goto PROG_START
#endasm


}


Nun habe ich noch die Applikation, welche allein kompiliert und ohne Bootloader geflasht wunderbar funktioniert. Um diese nun im Speicher zu verschieben habe ich in Mplab unter Build Options eingestellt:
"Specify Offset for ROM (in hex): 800"
Außerdem habe ich in den ICD2 Optionen eingestellt:
Preserve Program Memory Range 0x0 .. 0x7FF

Ich flashe nun zuerst den Bootloader und danach die Applikation mit der Preserve ROM Einstellung. Leider funktioniert danach gar nichts mehr. Nicht mal die LED blinkt. Wie bringe ich dem Linker bei, die Programmblöcke an die richtige Stelle zu rücken? Die beiden Programme einzeln laufen wunderbar. Es ist nur die Linker Thematik.

Das .map file der Applikation sieht eigentlich für mich völlig ok aus. Alle Codebereiche haben eine Linkadresse die um 0x800 verschoben ist:
Code:
TOTAL Name          Link     Load   Length
CLASS CODE     
intcode        808      808        8
intcodelo      818      818        C
reset_vec      800      800        4
ibigdata       812      812        5
end_init       872      872       16
init           824      824       4E
const          D00      D00       26
idata          CD0      CD0       30
one_wire      B022     B022      242
ad778x         9FC      9FC      2BA
buzzer_pw     AB52     AB52       40
fw_delay      AB92     AB92       46
i2c_maste     AF5A     AF5A       C8
i2c_slave     ABD8     ABD8       46
fw_init       AC1E     AC1E       62
int_ad         8CC      8CC      130
sca_main      B264     B264      B1C
spi_bsd       ACE6     ACE6       8E
dsc_board     AAC8     AAC8       14
int_eepro      88A      88A       42
text          AD74     AD74       98
text          AAB8     AAB8       10
text          AE0C     AE0C       98
text          AADC     AADC       14
text          AEA4     AEA4       B6
text          AAF0     AAF0       16
text          AB26     AB26       2C
ftext0         CB6      CB6       1A
text          AB06     AB06       20
text          AC80     AC80       66

Kann es sein, dass ich im Speicher überlappende Variablen bekomme? Wie muss ich hier Abhilfe schaffen.

Gruß
  Wolfgang
« Letzte Änderung: Januar 30, 2010, 10:52:29 von wberger » Gespeichert
wberger
Full Member
***
Offline Offline

Beiträge: 204


Profil anzeigen
« Antworten #1 am: Februar 04, 2010, 18:51:34 »

Kann mir denn niemand weiterhelfen? Wie teile ich dem Hi-Tech Linker die passenden Speicherstellen mit und wie kann ich Bootloader UND Applikation per ICD2 runterladen?

Gruß
  Wolfgang
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #2 am: Februar 04, 2010, 22:19:25 »

Zitat
Das .map file der Applikation sieht eigentlich für mich völlig ok aus.

Für mich auch. Daher auch keine Antwort von mir, da soweit alles ok aussieht.

Zitat
wie kann ich Bootloader UND Applikation per ICD2 runterladen?

Für das Zusammenfügen von Bootloader und Applikation  in einem Hex-File (welches dann mit einem x-beliebigen Programmiergerät gebrannt werden kann), würde ich hexmate empfehlen (erster Post von garth auf Seite drei des Threads). Dieses Programm ist mittlerweile Bestandsteil aller Hi-Tech Compiler.

Zitat
Kann es sein, dass ich im Speicher überlappende Variablen bekomme?

Selbst wenn (und davon ist auszugehen), sollte das überhaupt kein Problem darstellen.  Zur Laufzeit  des Bootloaders sind die von der Applikation verwendeten Variablen vollkommen egal und umgekehrt.


Viele Grüße

Bernd
Gespeichert

wberger
Full Member
***
Offline Offline

Beiträge: 204


Profil anzeigen
« Antworten #3 am: Februar 05, 2010, 09:51:54 »

Bernd, vielen Dank für den Hinweis auf hexmate. Dadurch habe ich auch endlich das Problem erkannt --> Überlappende Flash Bereiche.
Wie du richtig schreibst ist das .map File der Apllikation völlig in Ordnung. Ich hätte aber mal das des Bootloaders anschauen sollen.

Komischerweise legt bei mir der Linker mit obigem Bootloadercode das Bootloader main nicht ganz vorne in den Flash, sondern auf Adresse 0xBF4C. Das passiert übrigens auch mit dem Hi-Tech Bootloader aus dem Sample Verzeichnis. Dieser würde bei mir somit ebenfalls nicht funktionieren.

Ich habe nun vor der main() folgende Zeile eingefügt:
Code:
#pragma psect text=bootldr

Bei den Linkeroptionen noch:
Code:
-L-Pbootldr=20h

...und siehe da. Alles funktioniert.

Gibt es eine Möglichkeit, die Adresse irgenwie direkt im Code anzugeben? Ich bin mit der Linkeroption nicht so glücklich. Die steht eben nicht im Code. Wenn ich nun den Code irgendwann mal ohne das MPLAB Projekt verwenden will passt nichts mehr.

Für die Interrupt Einsprungstellen habe ich über die #asm Direkte die Adresse direkt im Code angegeben. Geht das Selbe auch für die Main? Wo muss dann die #asm Direktive hin? Ich habe es nicht hinbekommen.

Gruß
  Wolfgang
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #4 am: Februar 06, 2010, 18:50:21 »

Zitat
Gibt es eine Möglichkeit, die Adresse irgenwie direkt im Code anzugeben?

Meines Wissens nein.

Zitat
Für die Interrupt Einsprungstellen habe ich über die #asm Direkte die Adresse direkt im Code angegeben. Geht das Selbe auch für die Main?

Nein. Der Compiler sorgt automatisch anhand des psect-Namens dafür, daß intcode und intcodelo  an die Adressen 0x08 und 0x18 gelinkt werden.

Zitat
Ich habe nun vor der main() folgende Zeile eingefügt:
Code:
#pragma psect text=bootldr

Bei den Linkeroptionen noch:
Code:
-L-Pbootldr=20h

Um wirklich sicherzustellen, daß der Compiler nur den für den Bootloader vorgesehenen ROM-Bereich verwendet, würde ich eher die Linkeroption

Code:
--rom=0-7FF

verwenden.


Viele Grüße

Bernd
Gespeichert

wberger
Full Member
***
Offline Offline

Beiträge: 204


Profil anzeigen
« Antworten #5 am: Februar 07, 2010, 22:35:16 »

Code:
--rom=0-7FF
verwenden.

Dankeschön, der Tip ist Gold wert. Ich habe die manuelle Zuordnung der psect wieder entfernt und den ROM Bereich wie von dir vorgeschlagen begrenzt. Jetzt funktioniert alles wunderbar.

Warum der Linker den Code immer an den oberen Rand des verfügbaren Speichers packt ist mir zwar unverständlich, aber durch die Bereichsbegrenzung kann mir das egal sein, wo der Code in diesem Block liegt.

Gruß
  Wolfgang
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.05 Sekunden mit 19 Zugriffen.
 
Top! Top!