Цитата(i.dmitry @ Jul 27 2007, 00:56)

я еще не знаю отличий между extern, static and volatile.
стоит ли верить выше изложенному (нашел в гугле, сайте [banned])
-------------
Если это не соывсем точно, разъясните плиз вкратце.
Вот что нашел:
а если вместо static char я использую просто char - у меня не работет. это значит что при выходе из функции обр прерывания - она (переменная) обнуляется что-ли?
Не нужно читать "запрещенные" курсы, читайте авторов СИ
Кернигана и Ричи 
Вкратце: переменные в Си бывают автоматические (локальные), регистровые, глобальные и статические.
Автоматические переменные располагаются на стеке, но по выбору компилятора могут и в регистрах.
Регистровые переменные теоретически должны располагаться в регистрах, но реально компиляторы чаще всего игнорируют тип register и используют их как локальные переменные т.к. для локальных те же регистры используются.
Глобальные и статические переменные размещаются в ОЗУ. Различие у них в области "видимости". Статические переменные "видны" только в той функции в которой они объявлены. К тому же глобальные переменные объявляются вне функций, а статические внутри функций. И глобальные и статические переменные в соответствии со стандартом ANSI C компилятор обязан обнулить еще до вызова main(). Для локальных и регистровых такой привилегии не предусмотрено, поэтому они требуют явной инициализации до их использования в операциях. Ибо без инициализации (присвоения им определенного значения) значение такой переменной не определено.
Например, вы можете в каждой функции иметь переменную типа static с одинаковым именем cntr, которая будет сохранять свое значение при выходе из функции, но в то же время значения cntr будет свое собственное в каждой функции.
Код
void funcNum1(void)
{ static unsigned cntr=10;
if (cntr!=0)
{ ....
cntr--;
}
}
void funcNum2(void)
{ static unsigned cntr=1;
if (cntr<1000)
{ ....
cntr++;
}
}
volatile это не тип переменной, а квалификатор, который указывает компилятору, что значение переменной может изменяться в любой момент и/или вне данной функции/модуля. Поэтому компилятор при операциях с volatile-переменной обязан каждый раз считывать ее значение, а не копировать его в локальную или регистровую переменную и не работать с ее копией.