Realtime OS / LCD på $12 Discovery ombord (4 / 6 steg)
Steg 4: Annan hårdvara / programvara Tricks
Det finns vissa andra saker som händer i källkoden jag har förutsatt i detta instructible som är värt att notera.
Datum / tid kod:
Att beräkna datum / tid jag använt clib bibliotekets funktioner. Denna lite knepigt eftersom clib använder malloc för att greppa ia chucks minne. Detta orsakar problem för ett RTOS som behöver uppgift switch. Lösningen är att få clib att använda funktionerna malloc i OS i stället för malloc funktioner i biblioteket. Lyckligtvis några trevlig kille på Internet sorterade ut det och gav en lösning. Se Michal Demin webbplats för mer information.
Maskinvaran använder alltså yttre 32.768 kHz kristallen för att hålla en 32-bitars räknare uppräkning en gång per sekund. Räknaren är batteriet backas (coin cell) och inte få återställa någonsin. Hårdvara återställs, felsökning, eller skriva om inte återställa räknaren! Räknaren kan ställas in via programvara, emellertid. Ange värdet till antalet sekunder sedan 1 januari 1970 gör clib glad. En gång set, det finns en massa clib funktioner för att beräkna tid. Obs, få ett datum / tid / tidszon, clib kan vända beräkna antalet sekunder för dig.
När clib vet tidszon, datum / tidsfunktioner är redo att gå. Datum / tid på LCD-skärmen är bra oavsett sommartid, skottår eller annat skräp som jag inte förstår. I praktiken när set, datum / tid bör vara bra året runt för år (andra än driva).
Ange datum / tid, jag kommentera bort en del av koden (titta i ctime.c nära toppen) som gör den omvända tidberäkningen. 32 bitars räknare uppdateras och programmet fortsätter. Sedan jag kommentera ut datum / tid-kod som anger tid och reflash mikro. Det är en otäck hacka - men, jag bara sprang ut hacking juice för att skriva några knappkod om du vill ställa in tid / datum. Känn dig fri.
Felsöka konsolen:
Jag har precis börjat skriva någon kod för att lägga till en Felsökningskonsolen. Idén är, ta en av de oanvända UART kanalerna och använda den för programmeddelanden debug. Konsolen kan också vara interaktiv så att upprepade meddelanden kan växlas på och av. Jag har använt detta så jag kan titta på analoga värden rulla. Det är trevligt att kunna vända detta på och av.
Dragen av Felsökningskonsolen omfatta:
- Felsöka konsolen körs som en separat aktivitet - den lägsta prioriterad uppgiften. För att vara låg inverkan på systemet.
- Andra uppgifter kan kalla "vDebugPrintf()" att skicka ett formaterat meddelande ut debug seriell port.
- De formaterade meddelandena läses in i en OS FIFO kö.
- Debug uppgiften överför ständigt karaktär av FIFO kön och till den seriella porten.
- Lätta källkoden för vDebugPrintf är ger så kan du lägga till din egen speciella grejer.
Automatisk RC PWM-utgång:
Två stift har varit setup med en 50Hz PWM-signalen. Tanken är att dessa stift kommer att användas att köra RC servomotorer i framtiden. Med en enkel skriva till en micro registrera intermittensen av PWM utgången kan ändras, skulle en anslutna RC servomotor då svara min flytta till den nya positionen.
Igen, detta visar bara hur lätt det är att installationsprogrammet och kontroll hårdvara. Generera en PWM-utgång med micro andra resolution utan några hårdvara assist skulle vara en större krångel. ARM hårdvaran är detta allt för lätt.
Automatisk Analog till Digital konvertering:
Del av maskinvaran inträffade omfattar inrättande av ett fåtal AtoD kanaler. Rätt nu, jag har fyra kanaler setup som använder en annan DMA-kanal. Efter en omvandling är komplett, kopieras DMA-kanalen värdet till en RAM-buffert automatiskt. Analog till digital omvandlare än flyttar till nästa stift automatiskt. Hela processen upprepas om och om igen allt utan något processorkraft.
RAM-buffert har därför alltid den senaste (de flesta upp till datum) analogt till digitala värden. Enkel användning värdena från RAM buffra och vet att de är de mest färska. Värdena som RAM att hålla uppdaterad sker utan avbrott i mikro!
CPU Idle Counter:
När OS har inget arbete att göra (alla aktiviteter är inaktiv) OS anropar en annan användare callback funktion kallas "vApplicationIdleHook()". Jag programmerade denna funktion för att helt enkelt öka en räknare för 32-bitars.
Efter en sekund har passerat (100 OS fästingar) kan värdet på räknaren tryckas på Felsökningskonsolen. Räknaren är då nollställs och processen upprepas.
Genom att titta på debug konsolen utskriften från den tomgång krok kan vi se hur mycket ledig tid det är OS. Kinda som tittar på CPU Lastande diagrammet på en PC.
Även med allt som pågår i OS, RC PWM utgångar, LCD dataöverföringar, analog till digital konvertering, LED tråkigt, overksam hook rack upp mer än 350.000 räknas per sekund! Helt enkelt fantastisk finns det några mycket hästkrafter kvar med tanke på hur mycket CPU redan gör. Denna baby fick några ben!