Hi,
ich habe eine datei angehänge (Am Anfang habe ich die*.h reinkopiert)
die Funktionen benötigen 178bytes. Aber das muss kleiner werden(arbeite
mit einem atmega8). Und ich bin auch überzeugt das es geht. Hat da
jemand ein paar Tipps für mich?
Naja, du musst bloß "main.h" durch <stdint.h> austauschen, dann lässt
sich das einwandfrei compilieren.
Allerdings: es gibt keinen `memory hog' unter den Funktionen, sie sind
alle gleichermaßen groß, und ich sehe auf Anhieb auch nichts, was da
großartig überflüssig wäre.
Vermutlich könnte man mit reinem Assemblergehacke mit dem 10fachen
Aufwand an Zeit da ein Viertel davon sparen, aber eine Größenordnung
spart man daran nicht mehr.
p.s.: "address" schreibt sich im Englischen mit Doppel-d. Ist ein von
Deutschen gern gemachter Fehler.
Dein Original, mit einer main() dazu, hat 280 Bytes belegt.
Diese Variante ist runter auf 240.
Der Hauptvorteil dürfte darin bestehen, dass in add, remove
und get mit dem retourniertem Pointer nichts mehr gerechnet
werden muss.
Wenn ich mir das Assemblerlisting so ansehe:
Ich glaube nicht, dass da noch viel drinnen ist.
Wenn du noch Platzprobleme hast, musst du woanders mit
der Optimierung weitermachen.
bin mir aber nicht 100%ig sicher, ob's das richtige macht :(
falls was als verkehrt erkannt wurde, bin ich nicht böse, kann nur dabei
lernen :)
bin etwas irritiert, weils mit pointer kleiner geht. nicht, das der
optimierer da irgednwas wegkickt, was ich übersehen habe.
mit -Os für atmega8
text data bss dec hex filename
144 0 0 144 90 optim_test.o
Size after:
optim_test.elf :
section size addr
.text 238 0
.bss 61 8388704
.stab 2148 0
.stabstr 1931 0
Total 4378
bye kosmo
Vielen Dank für die Tipps. Das mit dem Pointer teste ich mal.
Sorry habe auch nicht drangedacht dass da noch #include "main.h"
drinnenstand.
Melde mich wieder
Mfg
Ulrich
@kosmonaut
Du willst, dass find() das zweite Argument beim
Aufrufer ändern kann. Also musst du einen Pointer
nehmen, so wie hier:
void foo( int* i )
{
*i = 5;
}
Wenn du das verallgemeinerst, dann kriegst du für einen
beliebigen Datentyp t
void foo( t * i )
{
*i = ...
}
Nun ist t bei dir selbst ein Pointerdatentyp. Also setzen
wir mal für t den Datentyp adresstable_t * ein und erhalten:
void foo( adresstable i )
{
*i = ...
}
Ergo muss es heissen:
1
uint8_tfind_ID(uint16_tsearchID,adresstable_t**a)
2
{
3
uint8_ti;
4
adresstable_t*at=adresstable;
5
6
for(i=0;i<ADRESS_TABLE_MAX_SIZE;i++,at++)
7
{
8
if(at->id==searchID){
9
*a=at;
10
return0;
11
}
12
}
13
return1;
14
}
und beim Aufruf dann:
1
voidadd_table(adresstable_t*addr_tab)
2
{
3
adresstable_t*a;
4
5
if(!find_ID(0,&a)){
6
return;
7
}
8
a->id=addr_tab->id;
9
a->adress=addr_tab->adress;
10
adresstable_size++;
11
return;
12
}
Willkommen bei der 2-Stern Programmierung.
Rein aus Interesse:
Wenn du das korrigierst, bei welcher Größe landest du
dann?
> 2-pointer-programmierung muss nicht unbedingt sein :)
Wenn du das Ergebnis über die Argumentliste zurückgeben
willst, dann führt kein Weg dran vorbei.
nabend,
unschön, das hier beiträge so mir nichts dir nichts verschwinden :( der
vorige ist jdf. nicht von mir.
mit 2-pointern verdoppelt sich der speicheraufwand nahezu.
dementsprechend nicht zu gebrauchen.
Size after:
optim_test.elf :
section size addr
.text 382 0
.bss 61 8388704
.stab 2184 0
.stabstr 1938 0
Total 4565
text data bss dec hex filename
288 0 0 288 120 optim_test.o
selbst wenn man noch etwas unschön rumtrickst ("globaler"
zwischenpointer, kein temporärer pointer im find_ID) kommt man bzw. ich
nicht an die 240 bytes von karl heinz heran, limit ist so 270 den dreh.
bye kosmo
kosmonaut_pirx wrote:
> mit 2-pointern verdoppelt sich der speicheraufwand nahezu.> dementsprechend nicht zu gebrauchen.
Das ist schlecht. Ich dachte mir aber schon, dass durch
die zusätzlichen Dereferenzierungen ein nicht unerheblicher
Auswand auftauchen würde. Dazu kommen dann wahrscheinlich
noch ein paar zusätzlich benutzte Register in den Funktionen
die gepusht/gepopt werden müssen.
Das es aber gleich soviel sein würde, hab ich nicht gedacht.