Hat jemand diesen Code heruntergeladen?

Gast
sicher wird der das schaffen, frage ist nur wie schnell das läuft... Der 
LPC17/4088 hat einen LCD Controller und dadurch ist die Grafik sehr fix, 
zeichnen geht direkt durch Schreiben in den Bildschirmspeicher.
OP
Ich habe den Code kurz überflogen...
Wenn ich diesen richtig interpretiere, dann geschieht wohl das Befüllen 
des Buffers hier:
1
void SphereDemo::draw(int16_t xyz[3][N], uint8_t rgb[3][N]) {
2
// static uint16_t oldProjX[N] = {0};
3
// static uint16_t oldProjY[N] = {0};
4
// static uint8_t oldDotSize[N] = {0};
5
 uint16_t i;
6
 uint16_t projX;
7
 uint16_t projY;
8
 uint16_t projZ;
9
 uint16_t dotSize;
10
 static uint8_t cnt=0;
11
 
12
  if (cnt == 0)
13
  {
14
    cnt = 1;
15
    pFrmBuf = pFrmBuf1;
16
  }
17
  else if (cnt == 1)
18
  {
19
    cnt = 2;
20
    pFrmBuf = pFrmBuf2;
21
  }
22
  else
23
  {
24
    cnt = 0;
25
    pFrmBuf = pFrmBuf3;
26
  }
27
  
28
  graphics.setFrameBuffer(pFrmBuf);
29
 
30
  memset((void*)(pFrmBuf), 0x00, windowX * windowY * 2);
31
 
32
 for(i = 0; i < N; i++) {
33
  projZ   = SCALE - (xyz[2][i] + SCALE) / 4; //4;
34
  projX   = windowX / 2 + (xyz[0][i] * projZ / SCALE) / 40; //EA 25;
35
  projY   = windowY / 2 + (xyz[1][i] * projZ / SCALE) / 40; //EA 25;
36
  dotSize = 3 - (xyz[2][i] + SCALE) * 2 / SCALE;
37
//EA  put_circle(oldProjX[i], oldProjY[i], 0, dotSize, 1);
38
 
39
  if((projX > dotSize) &&
40
     (projY > dotSize) &&
41
     (projX < (windowX - dotSize)) &&
42
     (projY < (windowY - dotSize))) {
43
 
44
// HIER wird m.M.n der Buffer befüllt mit der Funktion circle----->>>>>>
45
   graphics.put_circle(projX, projY, (rgb[0][i] << REDSHIFT) + (rgb[1][i] << GREENSHIFT) + (rgb[2][i] << BLUESHIFT), dotSize, 1);
46
 
47
//   oldProjX[i] = projX;
48
//   oldProjY[i] = projY;
49
//   oldDotSize[i] = dotSize;
50
  }
51
 }
52
}


Seht ihr dies auch so?

Wenn ich das richtig gesehen habe, gibt es 3 DisplayBuffer.
Es wird nach und nach einer befüllt und beim nächsten Durchlauf wieder 
als haupt DisplayBuffer gesetzt.

Da ich nicht genügend Speicher für solche spielereien habe, müsste ich 
ja lediglich die
1
graphics.put_circle(...)
 durch eine ebengleiche von mir ersetzen.

Meine Funktion schreibt halt dann direkt aufs Display.
Dies wird wohl sehr sehr träge sein, aber für den Anfang genügts.

Dannach kann dann mit optimierungen gespielt werden :)



Die Hauptroutine sieht so aus:
1
    
2
    loops = 2*820;
3
  for(int32_t n=0;n<loops;n++) {
4
 
5
   matrix(xyz, rgb);
6
 
7
   rotate(xyz, rgb, angleX, angleY, angleZ);
8
 
9
   draw(xyz, rgb);
10

11
  //----> Dieser Teil entfällt dann bei mir, da ich ja keinen LCD Controller im STM habe... 
12

13
  //update framebuffer
14
  lcdBoard.setFrameBuffer((uint32_t)this->pFrmBuf);
15
....
16
}
Gast
ja, müsste so gehen. Allerdings werden in der Funktion matrix() noch 
zwei große Arrays mit den Kreispositionen und Farben vorberechnet. Das 
kostet bei N=1024 6k+3k RAM.
Gast
die Array Argumente stören vielleicht:
void SphereDemo::matrix(int16_t xyz[3][N], uint8_t rgb[3][N]) {
Ich weiss nicht ob das in C++ anders ist als in C (byRef als Default?) 
oder eine Compilereinstellung, aber wenn hier wirklich die grossen 
Arrays über den Stack sollen kann es natürlich knallen. Eine Übergabe 
per Zeiger auf Element 0.0 sollte reichen.
OP
Jojo S. schrieb:
> die Array Argumente stören vielleicht:
> void SphereDemo::matrix(int16_t xyz[3][N], uint8_t rgb[3][N]) {
> Ich weiss nicht ob das in C++ anders ist als in C (byRef als Default?)
> oder eine Compilereinstellung, aber wenn hier wirklich die grossen
> Arrays über den Stack sollen kann es natürlich knallen. Eine Übergabe
> per Zeiger auf Element 0.0 sollte reichen.

Danke! Das wird es wohl gewesen sein...
Werde ich noch Anpassen und nochmals testen...

Habe inzwischen den bestehenden Code (mit seinen Unschönheiten wie jene 
oben) portiert.

Das Ergebnis siehts du hier:

https://www.youtube.com/watch?v=nfX0YvVSM7w
Gast
so ganz sieht dein Video ja nicht wie das Original aus, wird da zu oft 
gelöscht zwischen den Zeichenbefehlen?
Mit den Pointern war so wie ich meinte. Ich habe aber nochmal gesucht 
und eigentlich sollte in C die Array Übergabe auch automatisch in Zeiger 
umgewandelt werden. Ich habe das Projekt in mbed und LPCXpresso 
kompiliert, beide ohne Fehler (in der C++ Version). Die BSS Größe ist 
1876 Byte, da sind also die 9k nicht drin.

ok, Nachtrag:
.bss ist nicht das Stack Segment sondern die Null-Initialisierten 
Variablen. Also waren die statischen Arrays in Summe zu groß, hatte nix 
mit dem Stack zu tun.
Wenn dein Controller genug RAM hat sind die Linker Einstellungen/Linker 
Script eventuell falsch.

noch ein Nachtrag:
ich verwirre mich gerade glaube ich selber. Du hattest ja ein 'region 
ram overflowed with stack'. Ich habe versucht das nachzubauen, bekomme 
aber ein '.bss' will not fit in region', also doch etwas anderes 
(testarray als statische Variable zu groß).
Daher ist das große Array als Argument immer noch ein Rätsel, das 
schluckt mein gcc auch in C Quellen.
OP
Jojo S. schrieb:
> so ganz sieht dein Video ja nicht wie das Original aus, wird da zu oft
> gelöscht zwischen den Zeichenbefehlen?

Ja dass ist richtig, ich lösche nach jedem zeichnen bzw. vor jedem 
zeichnen der Punkte den Bereich, bzw überschreibe diesen mit schwarz.

Dies deshalb, da ich ja nicht wie jener Controller im Beispiel mehrere 
Buffer habe sondern nur den Speicher des Displayscontrollers im TFT 
selbst nutzen kann. Somit muss ich zuerst die alten Punkte löschen.

Jojo S. schrieb:
> Ich habe versucht das nachzubauen, bekomme
> aber ein '.bss' will not fit in region',

Den hatte ich zusätzlich auch noch!

Jojo S. schrieb:
> Daher ist das große Array als Argument immer noch ein Rätsel, das
> schluckt mein gcc auch in C Quellen.

Das ist es wirklich.

Bei mir gibts noch das Problem, dass wenn ich "N" also die Anzahl Punkte 
zu gross wähle, dann geht mir der Controller in den DefaultFaultHandler 
(oder so ähnlich)

Vermutlich gibt es dann zur Laufzeit irgend einen overflow...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.