Alexander schrieb:> steht da nicht drin ;)
Da müßte aber main drinstehen, was dann loop und noch anderen Schrunz
aufruft.
Ohne ein main beschwert sich jeder C-Compiler heftig.
Peter D. schrieb:> Da müßte aber main drinstehen, was dann loop und noch anderen Schrunz> aufruft.
Tut es. Die Aktionen in der Hauptschleife von main() sind überschaubar
(loop(), Interrupts) solange auf der seriellen Schnittstelle Ruhe
herrscht:
>Christoph M. schrieb:>> Geschwindigkeit Pin-Toggle mit digitalWrite:>> 255kHz
Alexander (alecxs)
18.06.2025 15:46
>Ich wollte hier nur wissen: 233kHz oder so
1
*Results:
2
*
3
*withinwhileloop255kHz
4
*withoutwhileloop213kHz
Es wäre interessant zu sehen, wie schnell es maximal wird, wenn man
direkt auf den Port schreibt.
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
In der Mounriver-Toolchain für die CH32-Controller wird die generische
5
soft-fp der glibc verwendet. Diese ist in C implementiert und in
6
keinster Weise an spezifische CPU-Typen angepasst. Die AVR-FP-Routinen
7
hingegen sind in Assembler speziell für diesen CPU-Typ geschrieben.
Was mich dabei wundert: Die RISC-V Architektur ist ja ziemlich genau
über die Abkürzungen der Erweiterung der Namensbezeichnung.
Die Bezeichnung von WCH ist RISCV-V2A
https://akizukidenshi.com/goodsaffix/CH32V003.pdf
was aber nicht mit der Namenskonvention der RISC-V Organisation
übereinstimmt.
Im Datenblatt wird dann auf die Bezeichnung des Cores als RV32EC
verwiesen .
* E => Embedded, nur 16 Register
* C => 16-bit compressed instructions
https://five-embeddev.com/riscv-user-isa-manual/Priv-v1.12/rv32e.html
Da die RISC-V Architekur ja ein mittlerweile recht verbreiteter Standard
ist, sollte man erwarten, dass es eine schnelle Assembler-Float-Lib dazu
gibt.
Christoph M. schrieb:> CH32V003_Arduino_toggleSpeedTest.pngChristoph M. schrieb:>>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?
p.s.
Programmcode als PNG ist schon stark :-(
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?
Rainer W. (rawi)
19.06.2025 06:40
>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.
Christoph M. schrieb:> Wieviel davon braucht der Sprung?
Sieht man doch ganz gut auf dem Oszi. 1 Takt High, 1 Takt Low, 2 Takte
für den Sprung.
Due könntest auch in der Schleife mehrere High/Low wechsel einbauen und
dann siehst du auf dem Oszi die einzelnen zeiten etwas besser.
... 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.
Gruß,
Ralph
Benjamin K. (bentschie)
19.06.2025 07:42
>Du könntest auch in der Schleife mehrere High/Low wechsel einbauen und>dann siehst du auf dem Oszi die einzelnen zeiten etwas besser.
Eine sehr gute Idee :-)
Ich meine 2 Cyclen pro Portschreiben zu sehen.
1
/*
2
CH32V003
3
4
Pin Toogle Speed Test
5
Results:
6
7
Toggle Speed: 82ns or 12.2MHz for ON/OFF
8
9
2025-06-19 mchris
10
11
*/
12
13
14
15
#define GPIOC_BSHR (*(volatile uint32_t*)0x40011010) // GPIOC Bit Set/Reset Register
Ralph S. schrieb:> 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.
Christoph M. schrieb:> Was mich dabei wundert: Die RISC-V Architektur ist ja ziemlich genau> über die Abkürzungen der Erweiterung der Namensbezeichnung.>> Die Bezeichnung von WCH ist RISCV-V2A>> https://akizukidenshi.com/goodsaffix/CH32V003.pdf>> 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.
Christoph M. schrieb:> Oha, der Speicherverbrauch des Framworks scheint exorbitant:
Guckst du hier:
Beitrag "Re: CH32V003: Selbstbauprogrammer und "Getting started""
da hab ich einen Vergleich des Speicherbedarfs gemacht. Für dein
Arduinoprogramm oben
Christoph M. schrieb:> for(uint32_t n=0;n<100000;n++)> {> x=sin(2*PI*n/1000);> x=cos(2*PI*n/1000);> sum+=sqrt(x*x+y*y);> }
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
> x=sin(2*PI*n/1000);> 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).
Johann L. (gjlayde) Benutzerseite
>Also man sollte sich schon genau überlegen, wie man einen Benchmark>schreibt. GCC v15 optimiert das einfach zu sum = 0.
Erstaunlich. Ich hätte nicht erwartet, dass der Compiler so gut
optimieren kann.
> ist es nicht wirklich geschickt, weil man auf einen Blick sieht, dass> die Berechnung gleichbedeutend mit "sum = 100000" ist.
Inclusive der Rundungsfehler der FP32 Rechnung?
Christoph M. schrieb:> Im Screenshot geht es darum, den Speicherverbrauch anzuzeigen. Ich> vertraue darauf, dass du die 2 Zeilen bei Bedarf auch selber eintippen> kannst.
Nein, es ging darum, den Code zu zeigen, mit dem die 255kHz erreicht
werden. Sonst wäre das Bild absolut unpassend zum Kommentar ;-)
Christoph M. schrieb:> Johann L. (gjlayde) Benutzerseite>>Also man sollte sich schon genau überlegen, wie man einen Benchmark>>schreibt. GCC v15 optimiert das einfach zu sum = 0.>> Erstaunlich. Ich hätte nicht erwartet, dass der Compiler so gut> optimieren kann.
y wird nicht initialisiert aber im Ausdruck für sum verwendet. sum hat
folglich keinen definierten Wert, also kann man auch sum=0 nehmen.
Johann L. (gjlayde)
>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"