Я начал писать прошивку для своего продукта, и я новичок здесь. Я просмотрел много статей о том, как не использовать глобальные переменные или функции. Есть ли ограничение на использование глобальных переменных в 8-битной системе или это полное «Нет-Нет». Как я должен использовать глобальные переменные в моей системе или я должен полностью избегать их?
Ребята, я бы хотел получить ценные советы по этой теме, чтобы сделать мою прошивку более компактной.
static
действия файла @endolith - это не то же самое, что «глобальный», см. мой ответ ниже.Ответы:
Вы можете успешно использовать глобальные переменные, если будете помнить руководящие принципы @ Phil. Однако вот несколько хороших способов избежать их проблем, не делая скомпилированный код менее компактным.
Используйте локальные статические переменные для постоянного состояния, к которому вы хотите обращаться только внутри одной функции.
Используйте структуру, чтобы объединить связанные переменные, чтобы было понятнее, где их следует использовать, а где нет.
Используйте глобальные статические переменные, чтобы сделать переменные видимыми только в текущем C-файле. Это предотвращает случайный доступ кода в других файлах из-за конфликтов имен.
И последнее замечание: если вы изменяете глобальную переменную в подпрограмме прерывания и читаете ее в другом месте:
volatile
.ИЛИ
источник
volatile
переменных - позволить коду, выполняющемуся в одном контексте выполнения, дать возможность коду в другом контексте выполнения знать, что что-то произошло. В 8-битной системе буфер, который будет содержать число байтов с степенью двойки не более 128, может управляться одним энергозависимым байтом, указывающим общее количество времени жизни байтов, помещенных в буфер (мод 256), и другой, указывающий количество извлеченных байтов за время жизни, при условии, что только один контекст выполнения помещает данные в буфер, и только один выводит данные из него.Причины, по которым вы не хотели бы использовать глобальные переменные в 8-битной системе, те же, что вы не хотели бы использовать их в любой другой системе: они затрудняют рассуждения о поведении программы.
Только плохие программисты зацикливаются на правилах типа «не используйте глобальные переменные». Хорошие программисты понимают причину, лежащую в основе правил, а затем относятся к правилам как к руководящим принципам.
Легко ли понять вашу программу? Его поведение предсказуемо? Легко ли изменить его части, не ломая другие? Если ответ на каждый из этих вопросов « да» , значит, вы находитесь на пути к хорошей программе.
источник
Вы не должны полностью избегать использования глобальных переменных (для краткости «глобальные»). Но вы должны использовать их разумно. Практические проблемы с чрезмерным использованием глобалов:
Хорошей практикой является добавление префикса
g_
к имени глобальных переменных. Например,g_iFlags
. Когда вы видите переменную с префиксом в коде, вы сразу же узнаете, что она глобальная.источник
static
флаг стал видимым дляmain()
? Вы подразумеваете, что та же самая функция, которая имеет,static
может возвратить этоmain()
позже?Преимущество глобальных структур данных во встроенной работе заключается в том, что они статичны. Если каждая нужная вам переменная является глобальной, то вы никогда не будете случайно исчерпывать память при вводе функций и выделении для них места в стеке. Но тогда, в этот момент, почему есть функции? Почему бы не одна большая функция, которая обрабатывает всю логику и процессы - как BASIC-программа без GOSUB? Если вы достаточно углубитесь в эту идею, у вас будет типичная программа на ассемблере 1970-х годов. Эффективно и невозможно поддерживать и устранять неисправности.
Поэтому используйте разумно глобальные переменные, такие как переменные состояния (например, если каждая функция должна знать, находится ли система в состоянии интерпретации или выполнения) и другие структуры данных, которые должны просматриваться многими функциями и, как говорит @PhilFrost, - это поведение ваши функции предсказуемы? Есть ли возможность заполнить стек входной строкой, которая никогда не заканчивается? Это вопросы для разработки алгоритма.
Обратите внимание, что static имеет различное значение внутри и снаружи функции. /programming/5868947/difference-between-static-variable-inside-and-outside-of-a-function
/programming/5033627/static-variable-inside-of-a-function-in-c
источник
Глобальные переменные должны использоваться только для действительно глобального состояния. Использование глобальной переменной для представления чего-то вроде, например, широты северной границы карты, будет работать только в том случае, если когда-либо будет только одна «северная граница карты». Если в будущем код, возможно, придется работать с несколькими картами, которые имеют разные северные границы, код, который использует глобальную переменную для северной границы, вероятно, придется переработать.
В типичных компьютерных приложениях часто нет особых оснований полагать, что никогда не будет более одного объекта. Однако во встроенных системах такие допущения часто бывают более разумными. Хотя вполне возможно, что для поддержки нескольких пользователей одновременно может потребоваться типичная компьютерная программа, пользовательский интерфейс типичной встроенной системы будет предназначен для работы одним пользователем, взаимодействующим со своими кнопками и дисплеем. Как таковой, он в любой момент времени будет иметь одно состояние пользовательского интерфейса. Разработка системы таким образом, чтобы несколько пользователей могли взаимодействовать с несколькими клавиатурами и дисплеями, потребовала бы гораздо большей сложности и заняла бы гораздо больше времени, чем ее разработка для одного пользователя. Если система никогда не вызывается для поддержки нескольких пользователей, любые дополнительные усилия, приложенные для облегчения такого использования, будут потрачены впустую. Если, скорее всего, потребуется многопользовательская поддержка, было бы разумнее рискнуть отказаться от кода, используемого для однопользовательского интерфейса в случае необходимости многопользовательской поддержки, чем тратить дополнительное время на добавление многопользовательской поддержки. поддержка пользователей, которая, вероятно, никогда не понадобится.
Связанный фактор со встроенными системами заключается в том, что во многих случаях (особенно с пользовательскими интерфейсами) единственным практическим способом поддержки наличия более чем одного объекта является использование нескольких потоков. При отсутствии какой-либо другой потребности в многопоточности, вероятно, лучше использовать простую однопоточную конструкцию, чем увеличивать сложность системы с помощью многопоточности, которая, скорее всего, никогда не понадобится. Если добавление более чем одного объекта в любом случае потребует огромной перестройки системы, не будет иметь значения, потребует ли он переделки использования некоторых глобальных переменных.
источник
Многие люди смущены этой темой. Определение глобальной переменной:
Это не то же самое, что переменные области файла , которые объявлены ключевым словом
static
. Это не глобальные переменные, это локальные частные переменные.Вы должны использовать глобальные переменные? Есть несколько случаев, когда это хорошо:
В любом другом случае вы никогда не должны использовать глобальные переменные. Нет никаких причин для этого. Вместо этого используйте переменные области видимости файла , что совершенно нормально.
Вы должны стремиться писать независимые, автономные модули кода, предназначенные для выполнения конкретной задачи. Внутри этих модулей внутренние переменные области файла должны находиться как частные члены данных. Этот метод проектирования известен как объектная ориентация и широко признан как хороший дизайн.
источник
.data
сегментом.