В основном я преподаю в C. Программирую встроенные микроконтроллеры. (например, dsPIC33fj128gp804) Обычно я использую глобальную переменную и все, что я когда-либо читал, денонсирует с использованием глобальных переменных, таких как чума. Я работал над использованием меньше, но есть сценарий, который я не знаю, как не использовать глобальные переменные.глобальные переменные с прерываниями?
Микроконтроллер оснащен прерываниями. Прерывание - это событие, вызванное извне в аппаратном обеспечении. Когда прерывания запускаются, выполнение основного кода прекращается, текущие рабочие переменные сохраняются, выполняется предварительно назначенная функция, а затем основной код выбирает резервную копию там, где она была остановлена. Поскольку прерывание является автономной функцией, которая может запускаться в любой момент, ничто не может быть передано в или из функции.
Например, когда оборудование UART получает байт данных, эти данные необходимо переместить из аппаратного буфера до того, как они перейдут на запись.
void __attribute__((interrupt, no_auto_psv)) _U2RXInterrupt(void)
{
GlobalVariable = U2RXREG; // Move data to global variable
IFS4bits.U2RXIF = 0; // Clear the UART2 Receive Interrupt Flag
}
Есть ли способ сделать это без глобальных переменных или это исключение?
Для разных потоков и ISR (процедуры обслуживания прерываний) вам действительно нужно использовать глобальные данные. Но иногда вам необходимо обеспечить взаимное исключение при доступе к этим данным. –
Глобалы не являются чумой, многие люди говорят, что на самом деле не знают, почему или почему не кто-то сказал им об этом. Пойдите с тем, что вы знаете и медленно меняетесь, основываясь на опыте не на спекуляции ... –
Если вы берете совет @ dwelch «медленно меняться», вы можете обнаружить, что вы «медленно» уменьшаете количество ошибок! Хотя мы, вероятно, очень много согласны, я не уверен, что соглашусь с этим. Правда, многие слепо следуют мантре «без глобалов», не потрудившись понять, почему или, что еще более важно, подходящие альтернативы. Понимание того, почему и каким образом является ключом к тому, чтобы не было соблазн предположить, что у вас есть специальный случай, когда он является либо ОК, либо необходим. Однако о язвах: [Оспа на глобалах] (http://www.embedded.com/electronics-blogs/break-points/4025723/A-pox-on-globals). – Clifford