Moin, gerade bastel ich an einem Cornerdetector auf dem Blackfin und bin dabei zwei Problemen begegnet, denen ich bisher noch nicht beikommen konnte. Fuer die Detektion verwende ich die von AD optimierte 2D-Faltung, kompiliert mit den GNU-Compiler. Diese verlangt nach 4 Byte aligned Daten und bislang ist es mir noch nicht gelungen, Arrays von short-Typen 4 Byte zu alignen. Im Moment mache ich es ueber den Umweg von int-Arrays, es muss aber doch auch eine schoenere Moeglichkeit beim GNU-Compiler in C geben oder? Das weitere Problem ist ein signifikanter Unterschied zwischen rechnerischer und tatsaechlier Performance. Rechnerisch muessten um die 1000 Faltungen eines kompletten Bildes pro Sekunde moeglich sein. Praktisch komme ich aber auf etwas was mindestens um den Faktor 50 darunter liegt. Ist das allein mit unguenstig im Speicher verteilten Arrays zu erklaeren oder deutet es auf etwas grundlegend falsch gemachtes, wie falsch initalisiertem PLL und SDRAM oder Cache hin? Und wenn es nur der Speicher ist, wie gelingt es mir in C mit dem GNU, die Felder elegant in unterschiedlichen Mikrobanks unterzubringen? Es ist doch hoffentlich nicht so, dass ich das aufwendig im Linkskript loesen muss, oder? Danke und Gruss, Joern
Schon mal __attribute__((aligned(4))) probiert?
Machst du das auf uCLinux oder Bare Metal? Wenn Bare Metal: Da wird wohl ein "kleiner" Eingriff ins Linkerscript nötig sein. Beitrag "Re: Blackfin GCC - Standalone!"
ja, dies _attribute_ ging garnicht, da hat der Compiler immer einen Fehler ausgegeben. Was habe denn da falsch gemacht, denn das untere Beispiel scheint den selben Compiler zu verwenden? Ist eine stand-alone-application. Gruss, Joern
Joern schrieb: > ja, dies _attribute_ ging garnicht, da hat der Compiler immer einen > Fehler ausgegeben. Was habe denn da falsch gemacht, denn das untere > Beispiel scheint den selben Compiler zu verwenden? Ist eine > stand-alone-application. > > Gruss, Joern Welches "untere Beispiel" meinst du? Was für einen Fehler schmeißt die GCC? Am besten du zeigst uns mal Code.
> rechnerischer und tatsaechlier Performance
Was hast du den gerechnet ? Die tatsächliche Performance ist oft um
einiges geringer als die Angaben im Datenblatt, die sich auf praktisch
mögliche, aber oft nur theoretische Fälle beziehen. Da reicht ein
zyklischer Interrupt der dir die Perfomance drückt usw.
Ok, ich habe es nochmal probiert und es scheint weitestgehend zu laufen (zumindest das alignen). Wie bekomme ich aber die Verteilung auf unterschiedliche Banks im SDRAM hin? Ich hoffte, man koennte beliebige Attribute verwenden und diese dann im Linkerskript definieren. Der Compiler sieht das anders:
1 | harris.c:20: warning: 'BANK3' attribute directive ignored |
2 | harris.c:22: warning: 'BANK4' attribute directive ignored |
3 | harris.c:24: warning: 'BANK2' attribute directive ignored |
4 | harris.c:25: warning: 'BANK3' attribute directive ignored |
5 | harris.c:26: warning: 'BANK1' attribute directive ignored |
Wie kann ich das Problem also loesen? Vielen Dank schonmal, Joern
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.