Hallo mede-tweakers!
De situatie is als volgt:
Er is een potentieel langlopende functie die aangeroepen moet worden. (Ga ervan uit dat die functie niet aangepast kan worden en dat deze veilig op elk moment gestopt zou kunnen worden.)
Deze functie mag maximaal een X aantal seconden duren. Als die tijd overschreden wordt, dan zal de executie van de functie moeten stoppen en zal de caller moeten kunnen zien dat de functie timed out is.
De huidige concept setup:
- Start de Watchdog Timer met een timeout op X seconden.
- Call de functie.
- Disable de Watchdog Timer.
De watchdog timer zal na een interrupt gegeven te hebben de MCU resetten als hij niet gedisabled is voordat de X seconden voorbij zijn gegaan.
Dit voldoet dus niet aan de beoogde situatie omdat de hele MCU wordt gereset als de execution te lang duurt terwijl ik wil dat ik gewoon verder kan gaan.
Mijn ideeën:
1. Voer de functie uit als een soort thread. Laadt de instructies beetje bij beetje in, in plaats van als heel blok. Dan wanneer de WDT zijn interrupt geeft, stop met het uitvoeren van de thread.
2. Bij het returnen uit de interrupt, pas de stack en registers zo aan dat de execution niet terug gaat naar de functie, maar naar de caller.
Limitaties:
1. Te weinig kennis over de exacte interne werking van de MCU om mijn ideeën uit te voeren.
2. De code netjes houden is belangrijker dan deze feature.
3. Heel weinig ROM en RAM waardoor exceptions en grote libraries niet mogelijk zijn.
Gebruikte omgeving:
De MCU betreft de ATSAM4ls2b, dit is een Cortex M4 ARM chip zonder FPU.
De programmeeromgeving is Atmel Studio en de daarbij inbegrepen GCC compiler.
Dit betekent dus dat er geen OS is en dat alle memory management zelf beheerd kan en moet worden.
Slot:
Het doel is dus om een extra stukje veiligheid in te bouwen voor als de function niet optijd returnt.
Bedankt voor het lezen en meedenken. Hopelijk heeft iemand een goed idee hoe dit aangepakt kan worden.
Dion Dokter
De situatie is als volgt:
Er is een potentieel langlopende functie die aangeroepen moet worden. (Ga ervan uit dat die functie niet aangepast kan worden en dat deze veilig op elk moment gestopt zou kunnen worden.)
Deze functie mag maximaal een X aantal seconden duren. Als die tijd overschreden wordt, dan zal de executie van de functie moeten stoppen en zal de caller moeten kunnen zien dat de functie timed out is.
De huidige concept setup:
- Start de Watchdog Timer met een timeout op X seconden.
- Call de functie.
- Disable de Watchdog Timer.
De watchdog timer zal na een interrupt gegeven te hebben de MCU resetten als hij niet gedisabled is voordat de X seconden voorbij zijn gegaan.
Dit voldoet dus niet aan de beoogde situatie omdat de hele MCU wordt gereset als de execution te lang duurt terwijl ik wil dat ik gewoon verder kan gaan.
Mijn ideeën:
1. Voer de functie uit als een soort thread. Laadt de instructies beetje bij beetje in, in plaats van als heel blok. Dan wanneer de WDT zijn interrupt geeft, stop met het uitvoeren van de thread.
2. Bij het returnen uit de interrupt, pas de stack en registers zo aan dat de execution niet terug gaat naar de functie, maar naar de caller.
Limitaties:
1. Te weinig kennis over de exacte interne werking van de MCU om mijn ideeën uit te voeren.
2. De code netjes houden is belangrijker dan deze feature.
3. Heel weinig ROM en RAM waardoor exceptions en grote libraries niet mogelijk zijn.
Gebruikte omgeving:
De MCU betreft de ATSAM4ls2b, dit is een Cortex M4 ARM chip zonder FPU.
De programmeeromgeving is Atmel Studio en de daarbij inbegrepen GCC compiler.
Dit betekent dus dat er geen OS is en dat alle memory management zelf beheerd kan en moet worden.
Slot:
Het doel is dus om een extra stukje veiligheid in te bouwen voor als de function niet optijd returnt.
Bedankt voor het lezen en meedenken. Hopelijk heeft iemand een goed idee hoe dit aangepakt kan worden.
Dion Dokter
[ Voor 0% gewijzigd door diondokter op 29-08-2018 19:30 . Reden: Tikfout correctie ]