Изучаю IAR C

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

Reply to
Juriy Gurin
Loading thread data ...

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

Reply to
Sergey Davydov

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.

Reply to
Slav Matveev

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

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

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

PORTC = 0;

Reply to
Kirill Frolov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.