Ich arbeite an einem Projekt auf einem 8051, wo jedes Byte zählt. Als solche verwende ich einige globale Variablen, wo ich normalerweise nicht würde. Die normale Methode, Zeiger in eine Funktion zu übergeben, fügt hier zu viel Overhead hinzu.Wie markiere ich Code mit Nebenwirkungen?
Ich habe eine Reihe von Funktionen, die einzelne Bitvariablen verwenden (eine Compiler-spezifische Erweiterung zu C), um das Ergebnis einer Funktion zusätzlich zu dem normalen Rückgabewert zu signalisieren.
bit global_error_flag = 0;
bit global_data_ready_flag = 0;
unsigned char A_Function (void) {
// Do some stuff
if (badness) {
global_error_flag = 0;
global_data_ready_flag = 1;
return 0;
}
if (data_is_ready_use) {
global_data_ready_flag = 1;
}
return a_value;
}
void Other_Function (void) {
unsigned char c;
c = A_Function();
if(global_error_flag) {
// Do error stuff here.
}
else
if(global_data_ready_flag) {
// Do data processing here.
}
global_error_flag = 0;
global_data_ready_flag = 0;
}
Da die Technik böse ist, ist es eine Möglichkeit, ich den Code klarer machen kann?
Wie soll ich am besten angeben, welche Funktionsaufrufe den Nebeneffekt haben, diese Flags zu setzen? Sind Kommentare genug? Soll ich die Funktionen benennen, um ihre API (quasi-ungarisch-style) anzugeben? Sollte ich ein Makro verwenden, um solche Anrufe zu markieren:
#define FUNCTION_SETS_FLAGS(code) (code)
FUNCTION_SETS_FLAGS(c = A_Function());
Irgendwelche anderen Ideen?
Wenn Sie einen 8-Bit-Mikrocontroller mit 256 Byte RAM (sagen wir) verwenden. Dann sind die Zeiger auf den Datenbereich ebenfalls 8 Bits breit. Ich verstehe den Grund für die Verwendung der globalen Variablen nicht. Ich kann verstehen, wenn es zwischen ISR (Interrupt Service Routine) und der Hauptschleife geteilt wird. Aber ... – Alphaneo
Das große Problem ist, dass Parameter jenseits des ersten entweder auf dem Stack übergeben werden können, oder indem ihnen Speicher zugewiesen wird (mit meinem speziellen Compiler). Wenn ich sage, ich habe 3 Flags für 7 Funktionen, dann verbraucht das zwischen 21 Bytes zusätzlichen Speicher. Die meisten davon benötige ich für die Pufferung von IO. Wenn ich also 12 Bytes auf 7 Bits reduzieren kann, ist das ein Nettogewinn von 20 Bytes Speicher. Das ist in diesem Zusammenhang riesig. Das Entpacken/Entpacken von Funktionsparametern benötigt auch mehr Code. – daotoad