Цитата
Чтобы не было зависимости от уровня оптимизации напишите асмовую вставку.
Взялся было... Но мне нужно загрузить переменную цикла в регистр. Где гарантия, это это регистр ничем не занят?

Цитата(Сергей Борщ @ Apr 10 2014, 06:24)

Угу. Вместо последнего цикла. А потом вспомнить про прерывания и забить на эту погрешность.
Да, прерывания меня уже смутили, при проверке на больших длительностях. Но эта функция написана для коротких интервалов. Конкретно, для работы с двухстрочным ЖКИ. А для "серьезных" задержек у меня есть макро с таймером. И др.
Что-то "не лезет" asm, не принимает его компилятор! В чем дело?
Код
#define DELAY_CY(CY) \
if (CY >= 10) \
{ __asm {"MOVS R1,#CY; LOOP: SUBS R1,R1,#1; BEQ LOOP;"} }
(407): error: #2901: Expected an inline assembly instruction
(407): error: #3081: expected end of line or a ";"
Никак.
Из ARM документа:
The inline assembler supports ARM assembly language only.
The embedded assembler can be used for Thumb and Thumb-2 support.
Отдельно писать?
Код
void DelAsm(uint32_t CY)
{
uint32_t Reg;
__asm {
MOVS Reg, #CY
LOOP:
SUBS Reg, Reg, #1
BEQ LOOP
}
}