Das Elektor-Forum schließt seine Pforten (siehe auch http://www.elektormagazine.de/forum). Ab Freitag, den 01. März, ist es nicht mehr möglich, sich im Forum einzuloggen. Alle Inhalte des Forums bleiben jedoch bis Ende März noch sichtbar. Am 01. April wird das Forum schließlich komplett geschlossen.

Weihnachtsstern: Zuviel Code?

Postby ew-andy » Wed May 30, 2007 12:00 am

Hallo!
Wir haben einen Weihnachtsstern aus 10 LEDs gebastelt, der mit Leuchtmustern gefüttert werden soll. Durch unsere 39 Leuchtmuster wird der Code nun so lang, daß der Compiler meckert... OK, es sind auch einige Hundert Zeilen!
Mit weniger Mustern klappts dann ganz gut.

Meine Frage nun:
Kann ich die Aufteilung des verfügbaren Speichers so umstellen, daß ich auch die lange Version compiliert bekomme?
Bisher habe ich das Programm port_toggle als Code-Basis verwendet und sonst nix verstellt in allen dazugehörigen Dateien.

Wer weiß Rat?
CU, EW-Andy

Hier der kurze Code:


// Weihnachtsstern:
// 5 rote LEDs aussen auf 1.0 ... 1.4
// 5 gelbe LEDs innen auf 3.0 ... 3.3 und 1.5

pd1 = 0xFF; /* Port 1.0 - 1.7 wird Ausgang */
pd3 = 0x0F; /* Port 3.0 - 3.3 wird Ausgang */

while (1) /* Loop */
{

//abwechselnd leuchtend
p1 = 0b00011111;
p3 = 0b00000000;
for (t=0; t<100;t++);
p1 = 0b00100000;
p3 = 0b00001111;
for (t=0; t<100;t++);

//nächstes leuchtmuster...
}

ew-andy
 
Posts: 9
Joined: Fri Jan 03, 2014 1:50 pm

Postby omega2 » Wed May 30, 2007 12:00 am

du kannst statt sowas: p1 = 0b00011111; probieren einfach p1 = 31; schreiben. Evtl wird es dadurch kürzer.
omega2
 
Posts: 127
Joined: Fri Jan 03, 2014 1:49 pm

Postby apokorny » Wed May 30, 2007 12:00 am

Die Antwort zu Deinem Problem - Optimieren!!!!

Es gibt zwei Möglichkeiten zum einen kannst Du den Code von der HEW kürzen lassen. Unter der HEW BUILD -> Renesas M16C Standard Toolchain... -> im reiter "C" -> Category "Optimize". Es kann saein, dass an dieser Stelle die länge von Schleifen zeitlich verkürzt wird, da diese halt auch optimiert werden.

Die andere Möglichkeit wäre es eine Reihe von Subprogrammen zuschreiben, die Standard Funktionen enthalten die dann aufgerufen werden.

Gruß Alex
apokorny
 
Posts: 122
Joined: Fri Jan 03, 2014 1:49 pm

Postby ew-andy » Wed May 30, 2007 12:00 am

Danke schon mal für Eure spontanen Antworten!
* Die Muster ins Dezimalformat bringen - ist mir zu aufwendig und wenig erfolgversprechend.
* Den Code mit Subroutinen optimieren - werde' ich wohl müssen!

Wer weiß denn, wie (wo) ich ablesen kann, wie groß/lang mein Code geworden ist?
Und wie schreibe ich einen Datenbereich mit den Mustern, den ich dann mit Byte für Byte auslese?
CU, EW-Andy
P.S.: Hat jemand empfehlenswerte Literatur zum Thema?
ew-andy
 
Posts: 9
Joined: Fri Jan 03, 2014 1:50 pm

Postby ew-andy » Wed May 30, 2007 12:00 am

Jetzt habe ich optimiert und der ganze Code ist so klein geworden, daß er reinpaßt!

Aber es funktioniert nicht mehr:
Alle Pausen habe ich durch den Aufruf einer pause-Prozedur ersetzt, in der der gleiche Code steht wie sonst immer zwischen den Mustern.
Nur werden diese Pausen jetzt nicht mehr ausgeführt! - Aber Warum?
CU, EW-Andy.

Hier der Code:


//Includes
#include "sfr_r813.h"; //Spezialregister einbinden

//Globale Variablen
long t;

void pause(void)
{
for (t=0; t<1000;t++);
}

void main(void)
{
pd1 = 0xFF; /* Port 1.0 - 1.4 und Port 1.5 wird Ausgang */
pd3 = 0x0F; /* Port 3.0 - 3.3 wird Ausgang */

while (1) /* Loop */
{

//1 gegenläufig rotierend;
p1 = 0b00000001;
p3 = 0b00001000;
pause;
p1 = 0b00000010;
p3 = 0b00000100;
pause;
p1 = 0b00000100;
p3 = 0b00000010;
pause;
p1 = 0b00001000;
p3 = 0b00000001;
pause;
p1 = 0b00110000;
p3 = 0b00000000;
pause;

//Nächstes Leuchtmuster ...
}

ew-andy
 
Posts: 9
Joined: Fri Jan 03, 2014 1:50 pm

Postby js222 » Wed May 30, 2007 12:00 am

Die Grösse des Codes siesht Du in den Letzten Zeilen der Linkerausgabe:

DATA 0000506(001FAH) Byte(s)
ROMDATA 0000260(00104H) Byte(s)
CODE 0000485(001E5H) Byte(s)
The value of option function select register is FFH
Phase M16C Linker finished

Romdata und Code kann man addieren um an die Grösse des genutzten Flashs zu kommen.

Im der *.map Datei kann man sich das auch ansehen.

In der sect30.inc (ziemlich weit unten) steht bei den Beispielprojekten:

;---------------------------------------------------------------
; Near ROM data area
;---------------------------------------------------------------
.section rom_NE,ROMDATA
.org 0e000H
rom_NE_top:

Wenn das Flash nicht ausreicht kann man beim R5F21134
bis runter auf
.org 0c000H
gehen, aber vorsicht, dort liegen auch Bereiche die der Debugger verwendet, kann also passieren das der dann nicht
mehr funktioniert.

js222
 
Posts: 183
Joined: Fri Jan 03, 2014 1:48 pm

Postby deadlock » Wed May 30, 2007 12:00 am

Hallo EW-Andy,

bei dem Aufruf der Funktion fehlen die Klammern:

pause();

Denn ohne Klammern wird nur die Adresse der Funktion geliefert, aber die Funktion nicht aufgerufen.
Ist mal wieder so eine Falle von "C".

Gruß,
Deadlock
deadlock
 
Posts: 72
Joined: Fri Jan 03, 2014 1:50 pm

Postby ew-andy » Wed May 30, 2007 12:00 am

Es funktioniert!
Danke an Deadlock und JS222 für die Antworten.

Für alle Mithelfer und Interessierten hier der fertige Code.
Viel Spaß damit und frohe Festtage!
CU, EW-Andy
Attachments
de_Weihnachtsstern.zip
(65.84 KiB) Downloaded 37 times
ew-andy
 
Posts: 9
Joined: Fri Jan 03, 2014 1:50 pm


Return to Das R8C-Projekt

Who is online

Users browsing this forum: No registered users and 1 guest