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
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
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
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
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
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
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
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
> :\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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.