вы можете использовать локальные или глобальные переменные, использование локальных во встроенных системах может привести к конфликту стека с вашими данными.с глобалами у вас нет этой проблемы.но это верно, независимо от того, где вы находитесь, встроенный микроконтроллер, рабочий стол и т. д.
Я бы сделал копию глобальной задачи на переднем плане, которая ее использует.
unsigned int myglobal;
void fun ( void )
{
unsigned int myg;
myg=myglobal;
, а затемиспользуйте только myg для остальной части функции.В основном вы делаете снимок и используете снимок.Вы захотите сделать то же самое, если вы читаете регистр, если вы хотите сделать несколько вещей на основе образца чего-либо, взять один образец этого и принять решение относительно этого одного образца, в противном случае элемент может меняться между выборками.Если вы используете один глобал для связи между обработчиком прерываний и обратно, то я бы использовал две переменные: одна на переднем плане для прерывания, а другая - на переднем плане.да, бывают моменты, когда вам нужно осторожно управлять таким общим ресурсом, как правило, это связано со временем, когда вам нужно сделать больше, чем одну вещь, например, если у вас есть несколько элементов, которые все должны быть изменены как группа ранееобработчик может видеть их изменение, тогда вам нужно отключить обработчик прерываний, пока все элементы не будут изменены.здесь опять нет ничего особенного во встроенных микроконтроллерах, это все основные вещи, которые вы бы видели в настольной системе с полнофункциональной операционной системой.
Кейл знает, что они делают, если они поддерживают C ++, то с системного уровня ониэто сработало.Я не использую Keil. Я использую gcc и llvm для таких микроконтроллеров.
Редактировать:
Вот пример того, о чем я говорю
https://github.com/dwelch67/stm32vld/tree/master/stm32f4d/blinker05
stm32, используя прерывания на основе таймера, обработчик прерываний изменяет переменную, используемую совместно с задачей переднего плана.Задача переднего плана делает один снимок общей переменной (на цикл) и при необходимости использует снимок в цикле более одного раза, а не общую переменную, которая может измениться.Это C не C ++, я понимаю это, и я использую gcc и llvm, а не Keil.(заметьте, у llvm есть известные проблемы с оптимизацией циклов while, очень старая ошибка, не знаю, почему они не заинтересованы в ее исправлении, llvm работает в этом примере).