Я использую эту функцию:
__delay_cycles(var);
и я получаю следующую ошибку:
Аргумент
_delay_cycles
должен быть постоянным выражением
Справедливо! Но как я могу обойти это? Я должен каждый раз откладывать свою программу с разным значением. Я получаю данные от RS232, и я заражен им в переменной int
. Я должен использовать эту функцию, и я не могу изменить ее структуру. Я использую AtMega16.
Одно из предположений, которое сразу приходит в голову, – вызвать __delay_cycles()
с постоянным аргументом, но сделать это в цикле и изменить количество итераций цикла.
Цикл добавит некоторые накладные расходы, поэтому, если вам нужна точность, вам придется вычесть (постоянную) стоимость одной итерации цикла из (константного) аргумента в __delay_cycles()
.
Не используйте эту функцию. По-видимому, это нестандартный техасский хлам, который не ведет себя в соответствии с правилами языка C. Вместо этого напишите свою собственную функцию задержки, используя таймеры на кристалле, или найдите ее в сети. Занимает менее 1 часа работы, что, без сомнения, меньше времени, чем вы будете размышлять о значении различных нестандартных барахлов.
Настоящая причина, почему встраиваемая индустрия имеет так много дерьмовых компиляторов, заключается в том, что встроенные программисты соглашаются на постоянную подачу нестандартного мусора, даже если нет причин, чтобы когда-либо отклоняться от стандарта C.
if(var==1) __delay_cycles(1); else if(var==2) __delay_cycles(2); else if(var==3) __delay_cycles(3);
…и так далее.