Да, правильно понимаете. Если вам так важно не пропустить инкремент, то либо запрещайте прерывание перед операцией, либо используйте другой механизм, не требующий обнуления CntB. Например, плюсуйте к CntL не абсолютное значение CntB, а приращение его между двумя вызовами SlowInterrupt. Правда для этого нужна еще одна статическая переменная, которая может быть локальной для SlowInterrupt.
Код
__interrupt void SlowInterrupt(void)
{ static unsigned char tmpCntB=0;
enable_interrupt();
// добавление байтового счётчика CntB к CntL
// без обнуления CntB
unsigned char tmp=CntB;
CntL+=tmp-tmpCntB;
if (tmp==CntB) tmpCntB=tmp;
else tmpCntB=CntB;
}
Естественно период вызова SlowInterrupt должен быть заведомо меньше, чем время за которое возможно переполнение переменной CntB.
P.S. кстати, поскольку у вас и CntL и CntB определены как volatile, то IAR должен был бы выдать предупреждение насчет такой вот конструкции
Код
CntL+=CntB;
чтобы избежать этого я в своем примере ввел промежуточную локальную переменную tmp, которую компилятор наверняка соптимизирует, поместив ее в регистр.