Forum: Mikrocontroller und Digitale Elektronik C-Compiler Probleme Winbond W78E516B (8051)


von Flo W. (flo23)


Lesenswert?

Hallo

Ich habe ein Problem mit der Firmware einer Steuerplatine.

Ich würde gerne eine kleine Änderung an der Firmware vornehmen.
Es sind nur 3 Codezeilen zu ändern.
Als Enticklungsumgebung benutze ich Keil µVision 2.

Wenn ich den Originalcode (ohne Änderung) mit meinem Compiler compiliere 
und dann auf die Platine überspiele funktioniert diese nicht mehr ganz 
so wie sie soll.
Also ich lass mir beim compilieren ein Hex File erzeugen. Dieses wandel 
ich dann in ein BIN File um und spiele es auf den µC.

Aus dem Orignalcode konnte ich erfahren, dass die original Firmware mit 
einem älteren KEIL Compiler erstellt wurde.
* C51-Compiler V3.2,
* Linker L51 V2.8

Meine Compilerversion:
* C51 V7.01
* Linker BL51 V5.01

Kann es am Compiler liegen, dass der Code nicht richtig funktioniert ?

Das Original BIN-File ist exakt gleich groß wie der Flashspeicher im µC 
(64kB).
Mein Bin File vom compilierten Originalcode hat nur 50 kB.
Kann es sein, dass ich noch irgendwas bei den Compilereinstellungen 
verändern muss, sodass das binfile auch 64kB groß wird ?

Vielleicht hat ja jemand eine Idee woran es liegen könnte ?


liebe Grüße und ein schönes WE

Flo

von Matthias (Gast)


Lesenswert?

Natürlich kann der Code nun anderes aussehen. Zwischen Keil V3 und V7 
dürften 15 Jahre liegen. Da wird mit Sicherheit vieles anderes (besser) 
in Asm umgesetzt/compiliert.

Die Abarbeitung der gleichen Quelle dürfte jetzt schneller laufen und 
der Gesamt-Code dürfte einige Byte kürzer sein. Programme die die eigene 
Laufzeit mit einbeziehen haben damit möglicherweise ein Problem.

Versuch mal die Optimierungseinstellungen zu ändern:

#pragma optimize(5,size) // nur als Bsp. -> Doku lesen
(nur wenig optimieren lassen)

Wenn Du V3 noch hast, nimm diese für so geringe Änderungen.

Gruß
Matthias

von Peter D. (peda)


Lesenswert?

Laufzeitunterschiede können eine Ursachen sein.

Eine andere das falsche Speichermodell oder falsche Angaben über den zur 
Verfügung stehenden Speicher (data, idata, pdata, xdata).

Hast Du denn auch das zu den Sourcen gehörende Linkerfile ?


Peter

von Flo W. (flo23)


Angehängte Dateien:

Lesenswert?

Hallo

Danke für die Antworten.
Das original Linkerfile ist im Anhang.

Welche Möglichkeiten habe ich denn noch ohne Originalcompiler das Ding 
zum Laufen zu bringen ?

lg Flo

von Matthias (Gast)


Lesenswert?

Vermutlich meint Peter das File mit den Einstellungen zum Linker. Könnte 
auch eine .bat sein.

Müsste so etwa aussehen:

test.obj,
ssi.obj,
startup.obj
MAP
RAMSIZE(256)
pdata(8000H)
xdata(8100H)

oder alles was in der BAT hinter L51 Aufruf steht
Hast Du V3 noch (rotes Dongel)?

Gruß Matthias

von Flo W. (flo23)


Angehängte Dateien:

Lesenswert?

Hallo

Hier ist das resultierende File nach dem Linken.
Ein File mit den Linkereinstellungen ist nicht dabei.
Leider hab ich die Version V3 nicht.

lg Flo

von Matthias (Gast)


Lesenswert?

Das nutzt leider nur wenig. Sieht so aus, als wäre es ein Programm für 
SAB80C517A o.ä., was die Einbindung der printf517 und MUL-Funktionen 
betrifft? Da musst Du schon wissen, wohin was gelinkt werden soll, 
vorallem welche Speicherbereiche genutzt werden sollen. Dies musst Du 
bei Keil vorgeben. Vermutlich würde es ohne diese Vorgaben auch mit V3 
nicht richtig laufen.

Was funktioniert genau eigentlich nicht?

Vielleicht kannst Du mal Teile des C-Programms posten, zumindest den 
Declarationsteil und ggf. spezielle includes?

Gruß Matthias

von Flo W. (flo23)


Angehängte Dateien:

Lesenswert?

Hallo

Erstmal vielen Dank für eure Bemühungen.
Der µC ist ein Winbond W78E516.
Mein Problem ist dass ich eigentlich keine große Erfahrung mit 
Mikrokontrollern habe.
Ich hab verschiedene Codeoptimierungseinstellungen ausprobiert.
Die Ergebnisse waren sehr unterschiedlich.
Bei einigen Einstellungen funktioniert garnichts.

Bei anderen Einstellungen sieht das Ergebnis gut aus.
Nur leider...
Beim µC wid ein Eingang gesetzt. Danach arbeitet er eine Routine ab.
Nach der Routine resetet sich das Ding. Das selbe passiert wenn ich das 
Eingagssignal wieder wegnehme.
Es scheint alles zu funktionieren bis auf diese Routine.

In der Define.h sind die Deklarationen drin.

und hier ein Ausschnitt aus de Main File:
1
#pragma small
2
#pragma debug
3
#pragma code 
4
5
6
#include <stdio.h>
7
8
//#include <Reg52.h>
9
10
// Winbond W78E516  internes XRAM
11
#include "Reg78516.h"
12
13
//  internes oder externes RAM
14
//#define XDATA   idata
15
#define     XDATA   xdata
16
17
// declarationen fuer die beiden Module mds1a1qa.c und mds1a2qa.c
18
#include "define.h"
19
20
21
//#include <math.h>
22
#include <string.h>

Und Linkereinstellungen hab ich nirgends gefunden.

Im Projektordner ist ein Batchfile zum compilieren:

c:\technik\hitex\bin\c51 mds1a1qa.c |more
c:\technik\hitex\bin\c51 mds1a2qa.c |more


c:\technik\hitex\bin\l51 mds1a1qa.obj,mds1a2qa.obj to mds1a1qa.abs 
RAMSIZE (256)
c:\technik\hitex\bin\ohs51 mds1a1qa.abs

lg Flo

von Matthias (Gast)


Lesenswert?

> :\technik\hitex\bin\l51 mds1a1qa.obj,mds1a2qa.obj to mds1a1qa.abs
RAMSIZE (256)

Das sind die Linkereinstellungen. Demnach wird der Code ab 0000H 
abgelegt, 256 Byte des internen RAM verwendet, erstmal für den 
Codebereich so ok. Eine XDATA Zuweisung fehlt. Deine Codeauschnitt 
scheint aber auf XDATA Verwendung hinzudeuten. (Hatt Deine Schaltung 
externen SRAM, wenn ja bei welcher Adresse? Gibs im C-Programm XDATA 
Verwendung bei der Variablendeklaration?)

Weiterhin fehlt das obligatorische "startup.obj" mit den 
Initialisierungs-Angaben für die Speicherbereiche.

Falls Du es nicht hinkriegst, kann ich Dir anbieten, dass ich es auf 
meiner V3 mal durchlaufen lasse. Dazu müsstest Du mir alle Quellen und 
spezifische Include-Files u.s.w. zukommen lassen (per e-mail).

Gruß
Matthias

von Flo W. (flo23)


Lesenswert?

Hi

Danke für eure Hilfe.
Ich habs jetzt geschaft die ganze Sache zum Laufen zu bringen.

lg Flo

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.