Andrey_KireewНа 90% проблема что переменная st не однобайтовая, а значит операции с ней точно не атомарные. Объявите её байтовой и возможно всё заработает, хотя код и останется неправильным.
Правильный код - с атомарными обращениями к переменной вне процедуры прерывания. Вариантов реализации много, самый простой - на время обращения к переменной запрещать вообще все прерывания (и не забывать разрешать после операций с переменной, в том числе и при возникновении ошибок и исключений). Например весь код
Код:
if (st>10000) st=0;
надо забирать в атомарность, а не только отдельно чтение и отдельно запись. Я частенько не парюсь и добавляю две процедуры
Код:
int atomReadInt(int * ptr) {
int temp;
asm("cli"); temp = * ptr; asm("sei"); return temp;
}
void atomWriteInt(int * ptr, int value) {
asm("cli"); * ptr = value; asm("sei");
}
//Пример использования: не if(st>5000), а if(atomReadInt(st)>5000).
Но в том
if выше даже это не спасёт.
И кстати операция
st=0 (как и чтение переменной) тоже не атомарная, это минимум две (или четыре, смотря сколько байтов переменная) команды записи в память - и между ними тоже может придти прерывание и получится бред. Операции чтения и записи атомарные только для байтовых переменных, но для битовых - снова не обязательно, зависит от компилятора, для надёжности лучше считать не атомарными.
В общем изучайте инфу об атомарных операциях и думайте.
Дальше разбираться честно говоря неохота.
-- 23.05.2018, 21:44 --PS. Так что название топика левое, проблема вовсе не в видимости переменной.
PPS. И почему снова не пользуетесь подсветкой синтаксиса? С ней текст программы понятнее.