Moin! Ich eier immer noch mit der Version 1.1 herum, habe inzwischen das gute EBLINK manuell eingebunden statt STLINK, was nicht so ganz einfach war und kann nun alle Bluepills brennen mit vollen 128 KB. Der GCC ist von 2016, wir schreiben das Jahr 2021. Es basiert immer noch auf den StdPeripheral Libs, die werden automatisch erzeugt, seit ca 4-5 Jahren wird aber HAL benutzt, was man manuell einbinden muss. Neuere Chips wie den STM32F410xx (Blackpill) einbinden ist teilweise ein Drama, never touch the Config Files. Spielt man sich den aktuellen GCC für ARM ein merkt man schnell, dass einiges nicht mehr funktioniert. Das bekannte while(1); nimmt er nicht mehr, es muss jetzt heissen while (1){}; Auch die LTO (Link Time Optimization) klappt nicht mehr, der erzeugte Code ist zu kurz und funktioniert nicht mehr. Die Systick Int Routine hat LTO gleich ganz verschluckt, beim Debugg crasht er gleich da mit einer Hardfault Exception. Schaltet man LTO ab wird der Code deutlich größer als bei der 2016er Version vom GCC. Der Entwickler aus Holland, der das Ding geschrieben hat fleuchte doch mal hier herum? Was wird denn nun aus 2.0 was seit gut 3 Jahren abgekündigt war? EmBitz ist die wohl beste IDE, die man im Bastelbetrieb umsonst kriegen kann. Christian
Christian J. schrieb: > seit ca 4-5 Jahren wird aber HAL benutzt Von wem? Ich habe eher den Eindruck dass die HAL ein Werbegag ist.
Stefan ⛄ F. schrieb: > Von wem? Ich habe eher den Eindruck dass die HAL ein Werbegag ist. Darum geht es nicht. In tausenden Code Samples findest du die HAL und die ist nunmal Standard. Ich nutze sie auch nicht, weil mit SPL gut vertraut aber so ist es nunmal. SPL nutzt keiner mehr.
Die Middleware für das STM32CubeU5 Firmware Package V1.0.0 sieht übrigens so aus: 20.10.2021 21:14 <DIR> cmsis_rtos_threadx 20.10.2021 21:14 <DIR> filex 20.10.2021 21:14 <DIR> levelx 20.10.2021 21:14 <DIR> netxduo 20.10.2021 21:14 <DIR> OpenBootloader 20.10.2021 21:14 <DIR> STM32_Network_Library 20.10.2021 21:14 <DIR> STM32_TouchSensing_Library 20.10.2021 21:14 <DIR> STM32_USBPD_Library 20.10.2021 21:14 <DIR> threadx 20.10.2021 21:14 <DIR> usbx Da mach mal was ohne HAL. Ich bin auf die Mischung CodeBlocks und Cmake umgestiegen weil mit cmake -GCodeBlocks direkt ein Projekt auf ninja Basis erzeugt wird. Auch debuggen funktioniert. Es fehlt aber die Portregister Anzeige. Dafür läuft es aber gut und schnell auf einem Raspberry Pi 400 unter Ubuntu.
Auf dem RaspPi kann man auch ccache installieren, dann sollte es richtig fix werden. Auf dem PC fegt der g++ damit durch 100 Quellcodedateien / Sekunde. https://snapcraft.io/install/ccache/raspbian https://ccache.dev/ SPL scheint bei den Chinesen noch beliebt zu sein, zumindest für deren eigene STM32 Derivate. Was aber auch nichts daran ändert das es einfach veraltet ist. Zu emBitz würde ich ja mal versuchen den Autor direkt anzumailen. Aber so ist das bei One Man Shows, emBitz selber hat er doch afaik nicht public gemacht, nur den EBLink Teil. Damit kann auch die Community nicht weitermachen. Und auch auf so Erweiterungen wie ccache möchte man nicht mehr verzichten wenn man es kennengelernt hat.
Christian J. schrieb: > Darum geht es nicht. In tausenden Code Samples findest du die HAL und > die ist nunmal Standard. Ich nutze sie auch nicht, weil mit SPL gut > vertraut aber so ist es nunmal. SPL nutzt keiner mehr. Die Profis die mit Softwareentwicklung Geld verdienen haben besseres zu tun als ein paar simpel Libs bei github zu veröffentlichen. Der andere Rest denkt HAL/SPL sind überall Standard. Und wenn dann noch Arduino ins Spiel kommt, bestehen 90% des Codes auf einem STM aus HAL/SPL und Arduino. Klar für die Deppen ist das gut, aber im normalen Leben und bei größeren Stückzahlen werden nicht mal die 3 Cent verschenkt die für den Flash nötig ist um die HAL/STL Grüze zu speichern.
Johannes S. schrieb: > Auf dem RaspPi kann man auch ccache installieren Danke für den Hinweis. Es funktioniert.
Es lässt sich übrigens von https://www.embitz.org/ eine neue Version herunter laden. Leider nicht für Raspberry pi unter aarch64 Linux. m. f. G. Dieter
Christian J. schrieb: > Sie ist DAAAAAAAA!ZwoNulllll! Booooaaaaahhhhh eyyyy bist du ein Schnellmerker! Kaum drei Wochen später hat es schon gecheckt! https://www.embitz.org/forum/thread-51.html
Sccchhhhhhtttt! Bei mir stand jemand auf der Leitung. Erstmal diese ganzen Flash Debug Geschichten hinfrickeln, damit der Stick auch wieder spielt...
Moin! Inzwischen habe ich das Ding zum Spielen gebracht, auch endlich gibt es eine Flash Option. Problem für den ARM M3 von ST ist allerdings, dass die LTO LInk-Time Optimization nicht mehr benutzbar ist. Die scheint etliche Interrupt Routinen einfach zu eliminieren. Der Systick Einsprung führt direkt in einen Hardfault Error. Oder irgend ein anderer, mein Logger benutzt alles was die CPU so hat an Interfaces. Kaum rein gesteppt schmiert er schon ab. LTO aus, alles gut. Da die LTO aber auf 80kb locker mal noch 5KB rausholte ist schade drum. printf ("-------------------------"); zb taucht oft im Code auf, das wurde zu einem Ausdruck zusammen gefasst. Jetzt aber nicht mehr. Und ne Funktion draus machen.... naja, das macht das ganze nicht grad lesbarer, sind ein paar tausend Zeilen Code. Gibt es da einen Work Around?
temp schrieb: > aber im normalen Leben und bei größeren Stückzahlen werden nicht mal die > 3 Cent verschenkt die für den Flash nötig ist um die HAL/STL Grüze zu > speichern. Bei uns in der Firma nutzen wir die HAL, und den größten STM32H7 Controller um uns möglichst einfach zu machen, obwohl wir den vielleicht zu 1% nutzen. Bei einer angepeilten Stückzahl von 10 verkauften Anlagen im Jahr (jede davon Millionen teuer), spielen die paar Euros keine Rolle.
Christian J. schrieb: > Spielt man sich den aktuellen GCC für ARM ein merkt man schnell, dass > einiges nicht mehr funktioniert. Das bekannte while(1); nimmt er nicht > mehr, es muss jetzt heissen while (1){}; Auch die LTO (Link Time > Optimization) klappt nicht mehr, der erzeugte Code ist zu kurz und > funktioniert nicht mehr. Die Systick Int Routine hat LTO gleich ganz > verschluckt, beim Debugg crasht er gleich da mit einer Hardfault > Exception. Schaltet man LTO ab wird der Code deutlich größer als bei der > 2016er Version vom GCC. Mit Assembler wär das nicht passiert 😉
LTO war eigentlich immer in den älteren gcc Versionen schlechter.
Johannes S. schrieb: > LTO war eigentlich immer in den älteren gcc Versionen schlechter. Vorher ging es, jetzt aber nicht mehr. Und ein while(1) geht auch nicht mehr, das muss jetzt while(1){}; heissen.
Christian J. schrieb: > das muss jetzt while(1){}; heissen. der Compiler ist mit jeder Version besser geworden was potentielle Fehler angeht, und das ist auch gut so. Man sollte sich sowieso angewöhnen jeden Block mit {} zu umklammern, auch nach if ... then wenn nur eine Zeile folgt. Wenn man da ein Makro hinschreibt kann der Programmfluß je nach Makroinhalt geändert werden, ein Fehler an dem man auch lange suchen kann. Und LTO ist wie gesagt besser geworden, aber vielleicht sind jetzt Module/Libs beim Linker in anderer Reihenfolge angegeben als vorher, das hat auch einen Einfluss.
MS schrieb: > Das ändert nix daran 😉 Na dann fang mal an in Assembler... hoffe ich werde noch alt genug das dann zu erleben :-)
1 | ////////////////////////////////////////////////////////////////////////////////////
|
2 | /*
|
3 | Funktion: CalcSonnenAufgang()
|
4 | Modul : rtc_user.c
|
5 | --------------------------------------------------------------------------------
|
6 | Beschreibung : Berechnet den Sonnenaufgang und Untergang (auf 5 Minuten genau)
|
7 | |
8 | Zeitgleichung: WOZ - MOZ = -0.171*sin(0.0337 * T + 0.465) - 0.1299*sin(0.01787 * T - 0.168)
|
9 | Deklination = 0.4095*sin(0.016906*(T-80.086))
|
10 | Zeitdifferenz = 12*arccos((sin(h) - sin(B)*sin(Deklination)) / (cos(B)*cos(Deklination)))/pi;
|
11 | Sonnenaufgang h=-50 Bogenminuten = -0.0145
|
12 | |
13 | Aufgang Ortszeit = 12 - Zeitdifferenz - Zeitgleichung
|
14 | Untergang Ortszeit = 12 + Zeitdifferenz - Zeitgleichung
|
15 | |
16 | Aufgang = Aufgang Ortszeit - geographische Länge /15 + Zeitzone
|
17 | Untergang = Untergang Ortszeit - geographische Länge /15 + Zeitzone
|
18 | |
19 | */
|
20 | ////////////////////////////////////////////////////////////////////////////////////
|
21 | |
22 | void CalcSonnenAufgang() |
23 | {
|
24 | #define hoehe -0.0145 // Sonnenhöhe in RAD
|
25 | #define PI 3.14159265359
|
26 | |
27 | double B, |
28 | Deklination, // Deklination der Sonne |
29 | Zeitdiff, // Zeitdifferenz |
30 | DIFF_WOZ_MOZ, |
31 | Aufgang_MOZ, // Aufgang mittlere Ortzeit |
32 | Untergang_MOZ, // Aufgang mittlere Ortszeit |
33 | Aufgang_WOZ, // Aufgang wahre Ortszeit |
34 | Untergang_WOZ; // Untergang wahre Ortszeit |
35 | |
36 | B = PI * roGPS->latitude / 180; // Umrechnung in rad; |
37 | int T = RTC_Now.tm_yday; |
38 | |
39 | Deklination = 0.4095 * sin(0.016906 * (T-80.086)); |
40 | Zeitdiff = 12 * acos((sin(hoehe) - sin(B) * sin(Deklination)) / (cos(B) * cos(Deklination))) / PI; |
41 | DIFF_WOZ_MOZ = -0.171 * sin(0.0337 * T + 0.465) - 0.1299 * sin(0.01787 * T - 0.168); // WOZ-MOZ |
42 | |
43 | double diff = Zeitdiff - DIFF_WOZ_MOZ; |
44 | Aufgang_MOZ = 12 - diff; |
45 | Untergang_MOZ = 12 + diff; |
46 | |
47 | // Sommerzeit berücksichtigen
|
48 | int korr = IsSummertime(&RTC_Now) ? (MEZ + SOZ) : MEZ; |
49 | |
50 | Aufgang_WOZ = Aufgang_MOZ - roGPS->longtitude/15 + korr; |
51 | Untergang_WOZ = Untergang_MOZ - roGPS->longtitude/15 + korr; |
52 | |
53 | // Umrechnung in Stunden/Minuten
|
54 | DailyData.Sunrise.tm_hour = floor(Aufgang_WOZ); |
55 | DailyData.Sunrise.tm_min = (Aufgang_WOZ - floor(Aufgang_WOZ)) * 60; |
56 | DailyData.Sunset.tm_hour = floor(Untergang_WOZ); |
57 | DailyData.Sunset.tm_min = (Untergang_WOZ - floor(Untergang_WOZ)) * 60; |
58 | }
|
Christian J. schrieb: > Problem für den ARM M3 von ST ist allerdings, dass die LTO LInk-Time > Optimization nicht mehr benutzbar ist. Die scheint etliche Interrupt > Routinen einfach zu eliminieren.
1 | void __attribute__ ((used,aligned (16))) |
2 | systick_isr (void) |
hilft auch nicht?
Bauform B. schrieb: >> Problem für den ARM M3 von ST ist allerdings, dass die LTO LInk-Time >> Optimization nicht mehr benutzbar ist. Die scheint etliche Interrupt >> Routinen einfach zu eliminieren. Naja, mal testen... wobei ich so rund 10 Ints habe, alle Timer benutzt, alle Interfaces, DMA.... und die werden halt von der Vector Table aus angesprungen, die im Startup initialisiert wird nicht aus dem Code heraus. Mal schauen, ausprobieren bringt manche Lösung... -15kb bringt die auf 80kb ohne LTO jedenfalls. edit: keine Wirkung! Auch von der Codesize nicht. Das System startet nicht mal auf. Ab hier verabschiedet er sich beim Debuggen mit LTO, beim ersten Delay, was auf dem Systick basiert.
Gibt es aber was drüber: https://stackoverflow.com/questions/53997196/gcc-8-for-arm-in-lto-mode-is-removing-interrupt-handlers-and-weak-functions-ho Darum geht es .weak \handler_name Nur wie man das behebt erschließt sich mir noch nicht. Das Thema wurde hier auch mal diskutiert, entfernte sich dann aber leider recht schnell weg in Fachsimpelei von sich anzickenden Insidern, ohne dass eine Lösung entstand. Nur dass es ein Bug ist, das der Linker weak Funktionen, die im ASM oder Linker Script stehen ignoriert und weil sie keinen Caller haben löscht. Ab GCC 7 trat das auf, Embitz 1.0 hatte GCC 6 Beitrag "arm gcc 7.2.1 -flto broken?" Da die F103er aber 128kb nutzbaren Flash haben lasse ich jetzt LTO aus, pfeif drauf, ist ja Platz genug da.
Christian J. schrieb: > Na dann fang mal an in Assembler Um den Sonnenaufgang zu berechnen ? Lächerlich. Sowas löst man in Hardware mit einem simplen Lichtsensor. Genauer und aktueller.
MS schrieb: > Mit Assembler wär das nicht passiert 😉 MS schrieb: > Christian J. schrieb: >> Na dann fang mal an in Assembler > > Um den Sonnenaufgang zu berechnen ? > Lächerlich. Sowas löst man in Hardware mit einem simplen Lichtsensor. > Genauer und aktueller. Maulheld.
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.