Если ваши глобальные переменные действительно используются только в одной функции, вы ничего не теряете, превращая их в статические локальные переменные, поскольку тот факт, что они глобальны, в любом случае делает функцию, которая их использует, не входящей. Вы немного выигрываете, ограничивая область действия переменной.
Вы должны внести это изменение во все глобальные переменные, которые используются только в одной функции, , а затем проверить каждую статическую локальную переменную, чтобы выяснить, можно ли ее сделать нестатической (автоматической).
Правило таково: если переменная используется в функции перед ее установкой, оставьте ее статической.
Пример переменной, которая может быть автоматически сделана локальной (вы должны поместить "int nplus4;
" внутри функции (вам не нужно устанавливать ее на ноль, так как она установлена перед использованием, и это должно выдать предупреждение, если вы на самом деле используйте его перед установкой, полезная проверка):
int nplus4 = 0; // used only in add5
int add5 (int n) {
nplus4 = n + 4; // set
return nplus4 + 1; // use
}
nplus4
var устанавливается перед использованием. Ниже приведен пример, который следует оставить статическим, поместив «static int nextn = 0;
» внутри функции:
int nextn = 0; // used only in getn
int getn (void) {
int n = nextn++; // use, then use, then set
return n;
}
Обратите внимание, что это может быть сложно, "nextn++
" не устанавливается, он использует и настраивает, поскольку он эквивалентен "nextn = nextn + 1
".
Еще одна вещь, на которую следует обратить внимание: в среде RTOS пространство стека может быть более ограниченным, чем глобальная память, поэтому будьте осторожны, перемещая большие глобальные переменные, такие как char buffer[10000]
, в функции.