Применяя паузы в IAR использую файл:
#define Fosc_Hz Fosc
#define Fosc_kHz Fosc/1000
#define Fosc_MHz Fosc_kHz/1000
#define Fosc_GHz Fosc_MHz/1000
#define delay_ns(x) __delay_cycles(x*Fosc_GHz)
#define delay_us(x) __delay_cycles(x*Fosc_MHz)
#define delay_ms(x) __delay_cycles(x*Fosc_kHz)
#define delay_s(x) __delay_cycles(x*Fosc_Hz)
Выставил паузу 500мс - delay_ms(500) при Fosc = 16000000
Пауза отрабатывается неверно, т.к. компилятор выдаёт следующее:
Warning[Pe061]: integer operation result is out of range
Warning[Pe068]: integer conversion resulted in a change of sign
Если сделать __delay_cycles(8000000) то пауза чётко выдерживается.
Почему он не может нормально обработать delay_ms(x) при больших значения? Ведь __delay_cycles unsigned long, и число вроде должно нормально обработаться. Или я чего-то туплю...