Oha, der Speicherverbrauch des Framworks scheint exorbitant:
1
/*
2
* trigonometrie speed test
3
*/
4
5
voidsetup()
6
{
7
Serial.begin(115200);
8
}
9
10
voidloop()
11
{
12
floatsum=0;
13
14
floatx,y,z;
15
16
Serial.println("start");
17
for(uint32_tn=0;n<100000;n++)
18
{
19
x=sin(2*PI*n/1000);
20
x=cos(2*PI*n/1000);
21
sum+=sqrt(x*x+y*y);
22
}
23
Serial.print("sum: ");
24
Serial.print(sum);
25
}
/tmp/arduino_build_733415/CH32V003_trigonometrieSpeed.ino.elf section .text' will not fit in region FLASH'
.arduino15/packages/WCH/tools/riscv-none-embed-gcc/8.2.0/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/bin/ld: region `FLASH' overflowed by 8680 bytes
was aber nicht mit der Namenskonvention der RISC-V Organisation übereinstimmt.
Im Datenblatt wird dann auf die Bezeichnung des Cores als RV32EC verwiesen .
Da die RISC-V Architekur ja ein mittlerweile recht verbreiteter Standard ist, sollte man erwarten, dass es eine schnelle Assembler-Float-Lib dazu gibt.
Und ohne die while Schleife?
Ist für die Geschwindigkeit.
Da es dir anscheinend auf Geschwindigkeit ankommt, ist die relativ langsame Funktion digitalWrite() doch eher ungeeignet. Wäre an deren Stelle das deutlich schlankere digitalWriteFast() nicht naheliegender?
Hier mal der Geschwindigkeitstest mit direktem Beschreiben von PC1.
Die Frequenz liegt bei knapp 6MHz.
Bei 48Mhz wäre das also 48/6/2=4 Zyklen pro Schreiben. Die Frage ist: Wieviel davon braucht der Sprung?
p.s.
Programmcode als PNG ist schon stark :-(
Im Screenshot geht es darum, den Speicherverbrauch anzuzeigen. Ich vertraue darauf, dass du die 2 Zeilen bei Bedarf auch selber eintippen kannst.
... ich habe zwar einen ganz anderen Ansatz für die Verwendungsmöglichkeiten von CH32V003, habe aber in meinen Anleitungen zum Schluß auch die Möglichkeit der Programmierung unter Arduino behandelt und verwende in dieser Anleitung denselben (offiziellen) Core wie du, den ich um meine eigenen Programmiermöglichkeiten (unter Linux) erweitert hab.
Was ich beim Schreiben einer Anleitung vermisst habe, war ein typisches Pinoutmapping des Chips zur Arduino Programmierung und deshalb habe ich dann dieses hier im Anhang erstellt.
:-) vllt. kannst du das für deine Seite zur Programmierung von CH32V003 unter Arduino gebrauchen.
Was ich beim Schreiben einer Anleitung vermisst habe, war ein typisches
Pinoutmapping des Chips zur Arduino Programmierung und deshalb habe ich
dann dieses hier im Anhang erstellt.
Gleich in die README.md mit reinpacken und einen Pull request schicken.
was aber nicht mit der Namenskonvention der RISC-V Organisation
übereinstimmt.
Im Datenblatt wird dann auf die Bezeichnung des Cores als RV32EC
verwiesen .
RV32EC ist der Name einer von der Berkeley-Universität bzw. RISC-V
International entwickelten Befehlssatzarchitektur.
QingKe V2A ist der Name eines von Nanjing Qinheng Microelectronics
entwickelten Prozessorkerns, der die RV32EC-Architektur implementiert.
CH32V003 ist der Name eines ebenfalls von Nanjing Qinheng
Microelectronics unter der Marke WinChipHead (WCH) entwickelten
Mikrocontrollers, der auf dem QingKe-V2A-Kern basiert.
Gerade ist mir eingefallen, dass der PiPico2 ja auch zwei otpionale RISC-V Cöre besitzt. Die beiden RV32IMACZ sollten abwärtskompatibel zum RV32EC des QingKe V2A sein.
Man kann den Kern in der IDE auswählen und mein hüpergeniales Programm (Screenshot) braucht nur 56256 Bytes.
wird garantiert irgendwo die Math-Library eingebunden (des Sinus und Cosinus wegen) und wie ich weiß, ist diese Bibliothek schon außerhalb von Arduino so groß, dass Sinus und Cosinus auch außerhalb von Arduino nicht in ein reines C-Programm eingebunden werden kann, weil auch hier schon zu groß!
Also man sollte sich schon genau überlegen, wie man einen Benchmark schreibt. GCC v15 optimiert das einfach zu sum = 0.
Auch wenn man den Code umschreibt zu
1
x=sin(2*PI*n/1000);
2
y=cos(2*PI*n/1000);
ist es nicht wirklich geschickt, weil man auf einen Blick sieht, dass die Berechnung gleichbedeutend mit "sum = 100000" ist. (Zumindest mit entspannter IEEE Interpretation, also rein arithmetisch).
y wird nicht initialisiert aber im Ausdruck für sum verwendet. sum hat
folglich keinen definierten Wert, also kann man auch sum=0 nehmen.
Du hast Recht. Es ist mir leider zu spät aufgefallen.
Die neue Version mit Verhinderung des Wegoptimierens mittels Zufallsfunktion geht. Beitrag "Re: Arduino CH32V003"