STM32 cube ide

Als je nu de "int" voor "back" weglaat, dan krijg je je waarschuwing weer terug.

De waarschuwing zegt: Je declareert een nieuwe variabele, maar geeft het type niet op. Wegens compatibiliteit met 50 jaar geleden moet ik er van uitgaan dat je een "int" bedoelt, maar tegenwoordig is het aan te raden om dat gewoon uit te schrijven als je dat inderdaad bedoelt.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
trix

Golden Member

klopt, ik ga back wel weer terug veranderen naar LX_to_back
lijkt mij toch wat duidelijker.
maar de grootste les is toch wel dat die 2e local variabele een andere is dan die 1e global variabele, ook al noem je die hetzelfde.

eigenwijs = ook wijs

Als je de compiler warning optie: -Wshadow aanzet krijg je er een warning op. Dat noemt men "variable shadowing".

Verder is het zowiezo al handig om minimaal -Wall bij de compiler mee te geven dan krijg je de nodige warnings bij verdachte constructies (wat ook meestal echte errors zijn).

Zie ook: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html wat er allemaal met -Wall aangezet wordt.
Meestal zet ik er zelf nog een aantal meer bij, zoals -Wshadow en nog een aantal meer (weet ik zo niet uit mijn hoofd precies welke).

Henri's Law 1: De wet van behoud van ellende. Law 2: Ellende komt nooit alleen.
trix

Golden Member

dat klinkt in mijn oren als redelijk complex, ik ga er wel naar kijken uiteraard. tnx.

ik ben even wat verder aan het proberen, nu wil ik het volgende in stepper_manual.c zetten:

c code:


if (!StepCount) 					// if done stepping
{
	enable_stepper_driver_LX_high; 	// LXU/LXT stop

	TCCR4A = 0x23; 					// OC1B set on compare match, clear at BOTTOM, fast PWM mode, reset on CMPA match
	TCCR4B = 0x18; 					// other half of fast PWM mode setting, clock stopped
	TIMSK4 = 0x02; 					// interrupt on CMPA match

//		delay_ms(100); 				// wait for a bit (usefull for logic analyser)
	StartCycle( 26000 ); 			// length of the movement

}

alleen geeft dat bij het compilen een error:
../Core/Src/stepper_manual.c:27:1: error: expected identifier or '(' before 'if'

vraag is eigenlijk, kan je dit zo los in een apparte source file zetten, of moet die in een functie verpakt worden ?

eigenwijs = ook wijs
PE9SMS

Golden Member

Je code begint op de eerste regel van main() en gaat dan de regels één voor één langs en voert uit wat daar staat, ga je dan deze if tegenkomen? En zo niet, hoe zorg je er voor dat dat wel gebeurt? (Je geeft zelf het antwoord al)

This signature is intentionally left blank.
trix

Golden Member

kom je dan inderdaad niet tegen, dan moet dat stuk dus in een functie.
kan/moet dat dan een "alles" omvattende functie zijn zoals main in main.c ?

eigenwijs = ook wijs
PE9SMS

Golden Member

Er is maar één main() in je complete project. Daar begint je code op de 1e regel (power-up van je microcontroller) en eindigt je code op de laatste regel. Nou ja, in theorie, want op microcontrollers zonder OS heeft je code geen einde omdat er altijd een of andere vorm van een oneindige lus in de main() staat. Daarnaast maak je functies van stukjes code die of logischerwijs samenpast (bijv. initialisatie van een peripheral) ofwel die je vaker nodig hebt zodat je voorkomt dat dezelfde code op meerdere plaatsen voorkomt (bijv. tekst naar een display schrijven).
Een functie (anders dan main()) is dus juist niet alles omvattend maar specifiek voor een bepaalt doel.

This signature is intentionally left blank.
trix

Golden Member

ja...dat is duidelijk, ik bedoel eigenlijk dat het geen wat in stepper_manual.c staat in een alles omvattende funtie moet staan:

c code:


include blabla

int bla

alles omvattende functie ()
{
   functie 1()
   {
   }

   functie 2()
   {
   }

   if (knop = gedrukt)
   {
      led aan
   }
}
eigenwijs = ook wijs
PE9SMS

Golden Member

Nee, dat hoeft niet. Je kunt vanuit main() ook functie1() of functie2() aanroepen.
Er is geen concept van "alles omvattende functie" op een computer/microcontroller. Nou ja, je zou main() zo kunnen zien omdat je programma daar begint en eindigt. Het concept van functies is hiërarchisch van aard. Daar waar een functie aangeroepen wordt gaat de code verder op de eerste regel van die functie. Na de laatste regel van die functie gaat de code verder op de regel volgend op de aanroep van de functie.
Dat een functie in een andere file kan staan doet daar niks aan af. Dat is alleen om het overzichtelijk te houden. Je mag best je hele programma in main.c zetten, bij Arduino doen ze dat ook. Maar bij omvangrijke programma's is het veel overzichtelijker om zaken te groeperen in aparte files.

[Bericht gewijzigd door PE9SMS op 8 april 2022 21:21:03 (23%)

This signature is intentionally left blank.
trix

Golden Member

dus dan moet ik alleen dit stuk in een eigen functie zetten ?

c code:


if (!StepCount) 					// if done stepping
{
	enable_stepper_driver_LX_high; 	// LXU/LXT stop

	TCCR4A = 0x23; 					// OC1B set on compare match, clear at BOTTOM, fast PWM mode, reset on CMPA match
	TCCR4B = 0x18; 					// other half of fast PWM mode setting, clock stopped
	TIMSK4 = 0x02; 					// interrupt on CMPA match

//		delay_ms(100); 				// wait for a bit (usefull for logic analyser)
	StartCycle( 26000 ); 			// length of the movement

}
eigenwijs = ook wijs
PE9SMS

Golden Member

Niks moet, alles kan, het is maar net wat je wilt bereiken. :) Ja, je kan hier een functie van maken.

Je bent wel een doorzetter hè? Respect hoor.

Op 3 april 2022 19:42:46 schreef rew:
Als je nu de "int" voor "back" weglaat, dan krijg je je waarschuwing weer terug.

De waarschuwing zegt: Je declareert een nieuwe variabele, maar geeft het type niet op. Wegens compatibiliteit met 50 jaar geleden moet ik er van uitgaan dat je een "int" bedoelt, maar tegenwoordig is het aan te raden om dat gewoon uit te schrijven als je dat inderdaad bedoelt.

En zelf leer ik ook weer bij. :)

This signature is intentionally left blank.
trix

Golden Member

tnx, ik werk hier ook niet continu aan, er lopen ook nog andere projecten.
maar als het technische zaken betreft geef ik niet zo snel op :)

Op 8 april 2022 21:49:02 schreef PE9SMS:
Niks moet, alles kan

maar als ik het werkend wil krijgen moet het dus wel.

eigenwijs = ook wijs
PE9SMS

Golden Member

Met losse code kan de cpu niks, want we waren al tot de conclusie gekomen dat die niet uitgevoerd kan worden. Ieder stukje code is dus onderdeel van een functie, per definitie. Dus ook deze code moet in een functie staan, eventueel als onderdeel van meer code.

This signature is intentionally left blank.

@trix ik vind het best je doorzetting vermogen best verbazend goed.

Toen je jaren gelden met dit project begon kon ik zelf ook amper C++ en heb toen een cursus gevolg en dat heeft me erg veel geholpen. Ik zie nu aan de vragen dat je worstelt met de grondbeginselen en basis van C++.

Ik zou je dan ook deze cursus willen aanbevelen.

https://www.udemy.com/courses/search/?src=ukw&q=Beginning+C%2B%2B+…

En dan vooral "Beginning C++ Programming - From Beginner to Beyond" als die niet al gelijk bovenaan staat van.

Hij begint echt bij het eerste begin en vooral daar mis je een flink deel van.
Wat is het verschil tussen een globale en lokale variabele, wat is een functie en hoe werkt dat op de achtergrond.

Ik heb tot nu toe ook maar 2/3 van de cursusgedaan op een gegeven moment word het echt moeilijk en ben ik een beetje de interesse verloren. Er4gens halverwege krijg je een deel certificaat en op dat punt begrijp je C++ ook wel echt veel beter.

IK heb er dacht ik 3 jaar geleden nog ruim 100,- voor betaald nu geven ze het bijna gratis weg. Maar dat geeft niet, ik vind en vond 100,- voor een dergelijke cursus al een niet duur zeker niet in verhouding met vergelijke bare cursus maar dan dat je er life bij bent.

IK weet dat je heel druk bent met je project, maar ik denk serieus als je dat even voor aantal weken opzij zet en die cursus eerst doet,dat je die weken heel snel in zal halen.

Als je de cursus gaat doen, begin dan ook bij het begin wat soms saai is. Want als je stukken gaat overslaan mis je toch wel erg veel.

kan/moet dat dan een "alles" omvattende functie zijn zoals main in main.c ?

Er is niet echt iets als een alles omvattende functie. Ik kan ook zoiet maken

c code:

void execute_this_forever(){
  while(1){
  Voer deze code eindeloos uit;
  }
}


Void main() {
execute_this_forever();
}

Het gaat erom dat je code ergens begint, dat kan in main() zijn zoals vaak bij C++ maar in de arduinoIDE begint de code bij setup() om vervolgens na de laatse regel van setup() door te gaan naar loop().

loop() zegt het al duidelijk na de laatste regel van loop() begint het weer bij de eerste regel van loop().
In C++ word het programma regel voor regel afgehandeld. Als er een sprong naar een functie word gedaan zoals hierboven execute_this_forever() dan gaat het daarheen. Het bijzondere is dat als je eenmaal in execute_this_forever() aangekomen dat alles wat er in main() gebeurde zoals variabelen daar niet meer bestaan die zijn er gewoon niet, behalve een variabele die je expres globaal hebt aangemaakt. Vandaar ook dat een lokale en globale variabele verschillend is want lokale variabelen bestaan alleen lokaal in de functie waar je nu bent maar eenmaal weg uit die functie bestaat die variabele niet meer, die word vernietigd.

Als execute_this_forever() een functie was zonder die while(1) dan zou die 1x keer uitgevoerd worden en vervolgens zou je dan weer terug gaan naar main() onder de regel met execute_this_forever().

Er is dus geen alles omvattende functie maar gewoon een regel voor regel uitgevoerde code dat is alles wat er is na het compilen.
Dit omdat een CPU ook maar regel voor regel kan uitvoeren. De main() of loop() is dan ook niet veel anders dan een gewone functie voor C++ behalve dat de loop() functie aan het einde van de code een extra sprong instructie erachter plakt. Die sprong instructie aan het einde van de code zegt dan ook heel simpel spring naar het beging (eerste regel).

[Bericht gewijzigd door benleentje op 8 april 2022 22:26:50 (38%)

trix

Golden Member

he....ik heb daar al 2 dingen aan gekocht, beginner cursusen voor een stm32.
best leerzaam, maar niet veel beter dan wat je op youtube kan vinden.
maar ik denk dat die jij aanhaalt wel beter zijn. ga ik eens bekijken tnx.

eigenwijs = ook wijs
PE9SMS

Golden Member

C en C++ zijn twee verschillende dingen. Het gaat hier over C.

Dus deze cursus zal beter passen:
https://www.udemy.com/course/c-programming-for-beginners-/

[Bericht gewijzigd door PE9SMS op 8 april 2022 22:23:43 (44%)

This signature is intentionally left blank.

@trix ik heb mijn vorige post nog flink uitgebreid.

STM32CubeIDE is an all-in-one multi-OS development tool, which is part of the STM32Cube software ecosystem.
STM32CubeIDE is an advanced C/C++ development platform

@PE9SMS ArduinoIDE en STM32 zijn weldegelijk C++.
Dat er C/C++ bestaat betekent eigenlijk gewoon dat het C++ is maar dat er veel functie van C ook bruikbaar zijn, wat volgens mij altijd zo is.
In het begin is C en C++ wel hetzelfde en met basisfunctie zit daar geen verschil in. In de cursus C++ die ik aangeeft word er ook vaak dat specifieke verschil aangegeven wat gewoon plain C is en wat dan C++ is.

Dus je kan zeggen dat alles wat je in C kan doen ook in C++ kan maar niet andersom dus het zijn zeker geen 2 totaal verschillende dingen.
C/C++ en C# zijn wel 2 verschillende dingen en voor zover ik weet incompatible

maar ik denk dat die jij aanhaalt wel beter zijn. ga ik eens bekijken tnx.

Hoewel er ook echt wel goede youtube's zijn denk ik wel dat dit beter is. Deze persoon die de cursus geeft is ook echt een professor en ook gewend om les te geven. Veel youtube's zijn best ok maar die mensen zien meestal niet gewend om les te geven en vergeten triviale dingen heel vaak uit te leggen. Dit omdat wat triviaal is voor jouw, er door je brein er vaak vanuit gaat dat iedereen dat wel zal weten. En als je dan vaker voor de klas staat leer je ook wel wat dus belangrijk is om over te brengen.

[Bericht gewijzigd door benleentje op 8 april 2022 22:41:37 (36%)

PE9SMS

Golden Member

Alles wat ik van trix voorbij heb zien komen is C. Ook in dat vorige (Atmel AVR) topic.

This signature is intentionally left blank.

Op 8 april 2022 22:38:48 schreef PE9SMS:
Alles wat ik van trix voorbij heb zien komen is C. Ook in dat vorige (Atmel AVR) topic.

Ja dat zou wel kunnen. Daar heb ik verder niet zoveel opgelet. Daarom word het voor Trix ook tijd om C++ te gaan leren dan gaat er een nieuwe wereld voor hem open. Ik denk wel dat Trix al best wat C++ functie heeft gebruikt zonder dat hij dat wist.

Even een losse vraag tussendoor, zou plain old C nog wel in zijn aparte vorm bestaan als software nu op de markt? Volgens mij is het altijd C/C++ maar nooit meer C.

[Bericht gewijzigd door benleentje op 8 april 2022 22:51:53 (16%)

PE9SMS

Golden Member

Daar verschil ik van mening. C++ voegt nu niks toe voor trix z'n project.

https://en.m.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

[Bericht gewijzigd door PE9SMS op 8 april 2022 22:56:54 (31%)

This signature is intentionally left blank.

C++ is eigenlijk de toevoeging met object programming, en dat voegt veel toe of dat ook wat toevoegt voor trix heb je terecht gelijk in. IK zei enkel dat er een nieuwe wereld voor hem open gaat, of die dan ook gebruikt gaat worden is aan hemzelf.

Maar ik vind het niet logisch als je met een C/C++ software werkt om dan maar enkel C te gaan leren. Zeker ook omdat vrijwel alle bibliotheken gewoon objecten zijn, dan is het ook wel handig waarom dat objecten zijn en wat je ermee kan doen. Dus omdat het basis programma C/C++ is moet je eigenlijk ook gewoon weten wat C++ is. En nogmaals in de cursus die ik voorstel word het verschil tussen C/C++ ook vaak aangehaald en ui8tgelegd.

En zolang je niets wilt gaan doen met objecten dan ben je eigenlijk ook wel gewoon met C bezig, maar ik vind die objecten zo erg handig dat ik blij bent dat ik dat geleerd hebt. Ik zou niet meer zonder willen werken.

Als je bv een stappenmotor als object hebt dan zijn alle variabelen en waardes die bij dat object horen bij dat object bekend en die hoef je dan niet zelf apart in je hoofdprogramma te gaan onthouden.

[Bericht gewijzigd door benleentje op 8 april 2022 23:36:14 (23%)

Stijnos

Golden Member

Ik heb al bij vele bedrijven gezeten in de embedded software microcontrollers. Zelden wordt er c++ gebruikt. Vanuit het verleden denk vaak een resource probleem. Vandaag de dag zou dat wat minder een issue moeten zijn denk ik en voor sommige projecten die veel modulairiteit vereisen zouden wat mogelijkheden van c++ zoals overerving en functie overriding het soms best wat netter en mooier maken, maar in C kun je vaak toch redelijk hetzelfde bereiken.
Ik denk dat ook vandaag C nog steeds de standaard is voor microcontrollers.

In dit hele stm32 project van trix komt weet ik vrijwel zeker 0% c++ voor, die zijn volledig ansi C

Ik denk dat mocht iemand zich in c++ wil verdiepen het toch echt wel goed en belangrijk is om de C basis te weten.

Maar Trix, idd een goede basis cursus c zou je goed doen.
In je code voorbeeld met die if constructie heb je nog je timer registers van je AVR staan. Dat gaat niet werken op je stm he

@benleentje
Jij doelt op arduino denk ik, daar zijn alle libraries idd in c++, bij stm32 zijn alle libraries toch echt in C.
Ik heb zelf weinig gedaan met c++, maar als ik die link van PE9SMS bekijk kun je in c++ toch een hoop dingen niet die je in C wel gewend bent qua gebruikt van void pointers bijvoorbeeld.

[Bericht gewijzigd door Stijnos op 8 april 2022 23:47:42 (14%)

Heel veel software is nog 'gewoon C', ik programmeer zelf dagelijks in C en gebruik het veel liever dan C++. Dit is eigenlijk puur persoonlijke voorkeur in vele gevallen. C is echter, wegens de eenvoudigheid, ook makkelijk valideerbaar waardoor het bv in de vliegtuigwereld de enige optie is.

Verder zijn zeer veel grote projecten in puur C geschreven:

  • De linux kernel
  • Ongeveer elke MCU toolchain of RTOS. Zelf werk ik heel graag met Zephyr wegens portability en hele mooie API.
  • Apache/Nginx webservers
  • Noem maar op

Er zijn uiteraard ook grote projecten in C++, denk maar aan MS Windows of de Arduino toolchain.

@benleentje
Jij doelt op arduino denk ik, daar zijn alle libraries idd in c++, bij stm32 zijn alle libraries toch echt in C.

Mijn excuses dan, ik ging inderdaad van arduino uit.

qua gebruikt van void pointers bijvoorbeeld.

IK zou even niet weten wat je daarmee bedoelt. Ik heb enkel die cursus C++ gevolgd en daar werd sterk de indruk gewekt dat veel dingen hetzelfde waren. Er was inderdaad een heel stuk over pointer en het kan best dat hij beide methode behandelt heeft maar pointers moet ik denk nog een paar keer overdoen ik vind het een heel moeilijk onderwerp.

Toch denk ik wel moet je vandaag beginnen waarom zou je nu plain C gebruiken?

ik programmeer zelf dagelijks in C en gebruik het veel liever dan C++.

Wat ik begrepen heb is het verschil hoofdzakelijk wel of geen objecten gebruiken. Ik zou niet weten waarom je niet gewoon wel die objecten gebruikt ik vind dat voor mezelf zoveel logischer en eenvoudiger.

Het probleem met C++ is in mijn ogen dat je uitgenodigd wordt om bepaalde constructies te gebruiken die de compiler met wat moeite idd in machinetaal kan vertalen, maar... lastig.

Het gevulg is dat je een "lijst van dingen" constructor gebruikt waarbij de "dingen" dan b.v. ints zijn (maar ook float hadden kunnen zijn) en dat je dan een "tel een lijst op" functie maakt die geschreven is zonder te weten dat het om ints gaat. Tegen die tijd krijg je dus code die veel minder efficint is dan nodig.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/