Я работаю над проектом на 8051, где подсчитывается каждый байт. Таким образом, я использую некоторые глобальные переменные, где я обычно этого не делал. Обычный способ передачи указателей в функцию добавляет сюда слишком много лишних накладных расходов.Как пометить код побочными эффектами?
У меня есть ряд функций, которые используют одиночные битовые переменные (дополнительное расширение для компилятора до C), чтобы сигнализировать результат функции в дополнение к нормальному возвращаемому значению.
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;
}
Учитывая, что техника зла, есть ли способ сделать код более понятным?
Как лучше всего указать, какие вызовы функций будут иметь побочный эффект установки этих флагов? Есть комментарии достаточно? Должен ли я назвать функции, указывающие их API (квази-венгерский стиль)? Следует ли использовать макрос для отметки таких звонков:
#define FUNCTION_SETS_FLAGS(code) (code)
FUNCTION_SETS_FLAGS(c = A_Function());
Другие идеи?
Если вы используете 8-битный микроконтроллер с 256 байтами оперативной памяти (скажем). Тогда указатели на область данных также будут иметь ширину 8 бит. Я не понимаю причину использования глобальных переменных. Я могу понять, если он разделяется между ISR (Interrupt Service Routine) и основным циклом. Но ... – Alphaneo
Большая проблема заключается в том, что параметры, выходящие за пределы первого, могут быть переданы в стек или путем присвоения им памяти (с моим конкретным компилятором). Если я скажу, что у меня есть 3 флага для 7 функций, то это потребляет от 21 байта дополнительной памяти. Большинство из которых мне нужно для буферизации ввода-вывода. Поэтому, если я могу уменьшить 12 байт до 7 бит, это чистая прибыль в 20 байт памяти. Что огромно в этом контексте. Параметр функции упаковки/распаковки также занимает больше места для кода. – daotoad