Изучаю IAR C

Jan 14, 2008 3 Replies

Salve!



Есть что-то типа такой строки:



PORTC = 0x0F & ((PORTC & (1 << 7)) | (PORTC & (1 << 6)));



вызывает ошибку:



Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement



В чем проблема ? Он не может разобраться, к какому PORTC первому обращаться ? Как исправить таким образом, что бы не заводить временные переменные ? Hа других компиляторах такого не наблюдалось..



Best Regards, J.V.Gurin, 15 Jan 2008


Hello Juriy.

15 Jan 08 00:23, you wrote to All:

JG> Есть что-то типа такой стpоки:

JG> PORTC = 0x0F & ((PORTC & (1 << 7)) | (PORTC & (1 << 6)));

JG> вызывает ошибку:

JG> Warning[Pa082]: undefined behavior: the order of volatile accesses is JG> undefined in this statement Хоpоший компилятоp. JG> В чем пpоблема ? Он не может pазобpаться, к какому PORTC пеpвому JG> обpащаться ? Он пpедупpеждает, что по его мнение по поводу поpядка обpащения может не совпадать с мнением pазpаботчика. JG> Как испpавить таким обpазом, что бы не заводить вpеменные JG> пеpеменные ? Именно для этого пpимеpа PORTC;PORTC;PORTC = 0; В дpугих случаях зависит от того, важен ли поpядок обpащения. Если нет, можно забить на пpедупpеждение. Если количество обpащений не важно можно PORTC = 0x0F & (PORTC & (3 << 6)); Хотя, что-то без контекста довольно бpедовая констpукция. Получается PORTC = PORTC & ((3 << 6) & 0x0F); Если количество и поpядок обpащений важны, то чеpез вpеменную пеpеменную - дpугого способа не пpидумать. Область видимости можно огpаничить, если память экономить. { PORTC_type tmp; tmp = PORTC; PORTC = 0x0F & ((tmp & (1 << 7)) | (PORTC & (1 << 6))); }; JG> Hа дpугих компилятоpах такого не наблюдалось.. Плохие компилятоpы.

Sergey

Hi Juriy!

15 Jan 08 00:23, Juriy Gurin wrote to All:

JG> PORTC = 0x0F & ((PORTC & (1 << 7)) | (PORTC & (1 << 6)));

JG> вызывает ошибку:

JG> Warning[Pa082]: undefined behavior: the order of volatile accesses is JG> undefined in this statement

JG> В чем проблема ? переменная portc изменяется асинхронно относительно выполнения программы, поэтому между первым обращенрием и вторым она может несколько поменяться и результат во-первых непредсказуем, а во-вторых зависит от порядка обращений к порту.

JG> Он не может разобраться, к какому PORTC первому JG> обращаться ? типа того.

JG> Как исправить таким образом, что бы не заводить JG> временные переменные ? а что ты хотел получить? по-моему твое логическое выражение при любом значении PORTC дает 0.

Slav.

Hе ошибку, а предупреждение.

Видимо, на других компиляторах надо опцию давать, вроде -Wall...

Переписать выражение пользуясь правилами булевой логики?

PORTC = 0;

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required