O.K. dann jetzt hier meine Anmerkungen zum Code.
ACHTUNG dies ist kein gemecker sondern konstruktive Kritik!
- Bei Makros die Operanden immer in Klammern setzen um Konfilkte durch Operandenprioritäten zu vermeiden
weil 1<<5&3 = 0 wohingegen 1<<(5&3) = 2 ist
- Die Makros auch benutzen
- Wenn schon globale Variablen, diese ganz oben deklarieren
- Einige der globalen Variablen werden nur in main benutzt, diese besser dort deklarieren.
- Feste Tabellen, wie die für die Digits sollten besser "const" deklariert werden, um im ROM zu liegen
- Möglichst auf so einem kleinen Rechner alle Variablen "static" deklarieren, dadurch werden diese schon beim compilieren angelegt und nicht erst zur Laufzeit erzeugt (auf dem immer zu kleinen HEAP)
- Typkonflikte vermeiden
Code: Alles auswählen
unsigned char EEPROM_read(unsigned int uiAddress)
int read_ee()
{
return(EEPROM_read(1));
}
- Funktionen die öfter benötigt werden (z.B. EEPROM), in extra Modul legen, kann man dann auch in anderen Projekten verewnden
- Etwas mehr auf die Formatierungen achten (min. drei verschiedene Arten der Einrückung
Code: Alles auswählen
if((!running) && (PINC & 8)){ //Start
if(running && ((PINC & 8) || (seconds<=0)))
//if((seconds<=0) || ((PINC & 8) && running))
{
if(t<=0)
{
Gut gefallen hat mir:
- Alle Variablen wurden initialisiert
- schon Code viel in Funktionen verlagert (nach meinem Geschmack aber noch viel zu wenig)
Hier mal die Hauptschleife eines größeren Projekt (meine Diplomarbeit)
Code: Alles auswählen
void far main (void)
{
while (1)
{
InitHardware(); // Grundinitialisierung der Hardware
InitTimer(); // Initialisierung der Timer-Routinen
InitLpt(); // Initialisierung der LPT Schnittstelle
InitPrinter (); // Initialisierung des Druckwerks
InitSerial(38400,8,NONE,1); // Initialisierung der seriellen Schnittstelle
InitDispatcher (); // Initialisierung des Schnittstellendispatchers
RegisterDevice (KbHitLpt,GetCharLpt); // LPT Schnittstelle beim Dispatcher anmelden
RegisterDevice (KbHitSerial,GetCharSerial); // Serielle Schnittstelle beim Dispatcher anmelden
InitCommand (); // Initialisierung des Kommandointerpreters
Command (); // Aufruf des Kommandointerpreters
// eine Rückkehr aus dieser Funktion löst einen Warmstart aus
} // while(1)
} // main
Da ist eigentlich keine Alghotithmik in main()
Gruß
Simon