ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
10 июля
318374 Топик полностью
Ксения (28.03.2012 10:17 - 10:53, просмотров: 227) ответил Toчкa oпopы на КодВижн, просветите ибо его у меня нету.
КодВижн тут ни при чем - во всех версиях языка C правая часть операции сравнения интерпретируется, как число 1.25. Иного и быть не может. Даже тестовый редактор покрасил это число в красный цвет (цвет числовой константы). Согласно правилам языка С, он не должен округлять 1.25 до целых, а, напротив, должен преобразовать TCNT1 в число с плавающей точкой, и только затем выполнить сравнение с константой 1.25. Например, если TCNT1=1, то будет выполнено сравнение (1.0 < 1.25), результатом которого будет true. Этот результат не мог быть получен, если бы компилятор округлил или усёк 1.25 до целого. Само же значение TCNT1 во всех случаях подразумевается таким, каким оно определено в хидере конкретного МК. В вашем случае TCNT1, по-видимому, состоит из двух байт. Разумный человек не станет сравнивать значение целочисленной переменной с float-константой, понимая, насколько времязатратны для МК float-операции, тем более в том случае, когда програмируется временная задержка. Т.е. в данном случае следовало написать: while(TCNT1 < 2); или while(TCNT1 <= 1); чтобы не мучить МК работой с плавающей точкой, особенно когда ее приходится эмулировать. Работать сравнение будет так же, как и с 1.25, только в кодах получится много эффектнее. P.S. В некоторых случаях встроенный оптимизатор оказывается умнее программиста и способен заменить несуразные выражения с плавающей точкой на эквивалентные им целочисленные выражения, но я не в курсе, способен ли на это КодВижн. Так что лучше не рисковать. P.P.S. Пустой блок {} после while можно опустить - так писать короче, хотя на продуцируемом коде это никак не отражается.