реклама на сайте
подробности

 
 
> не понимаю причины варнинга - объясните, IAR считает, что code has no effect
acorn
сообщение Dec 1 2006, 14:21
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 28-11-05
Пользователь №: 11 495



IAR 4.12A, mega16. Выкинул всё из большого проекта, оставил минимум. Строки, помеченные "//warning", вызывают "Warning[Pe174]: expression has no effect" - почему? В реальном проекте прерывания есть и они используют поле "STATUS.sec":
Код
#include <inavr.h>

typedef struct {
    unsigned char sec:1;
} statusDef;

extern volatile statusDef STATUS;

unsigned char essTime (unsigned char keys) {
    __save_interrupt;        //warning
    __disable_interrupt;     //warning
    STATUS.sec = 0;
    __restore_interrupt;     //warning
    return 0;
}

__task void main (void) {
    __enable_interrupt();
    essTime (0);
    while (1) {
    }
}


Генерированный код функции essTime:
Код
    LDI     R30,0x60
    LDI     R31,0x00
    LD      R16,Z
    ANDI    R16,0xFE
    ST      Z,R16
    LDI     R16,0x00
    RET


Я считаю, что между LD и ST может возникнуть прерывание, изменяющее volatile переменную, и данный код её испортит. Почему компилятор со мной не согласен? Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
subver
сообщение Dec 1 2006, 15:41
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 4-06-05
Из: Омск
Пользователь №: 5 726



Цитата(acorn @ Dec 1 2006, 17:21) *
IAR 4.12A, mega16. Выкинул всё из большого проекта, оставил минимум. Строки, помеченные "//warning", вызывают "Warning[Pe174]: expression has no effect" - почему? В реальном проекте прерывания есть и они используют поле "STATUS.sec":
Код
unsigned char essTime (unsigned char keys) {
    __save_interrupt;        //warning
    __disable_interrupt;     //warning
    STATUS.sec = 0;
    __restore_interrupt;     //warning
    return 0;
}


Я считаю, что между LD и ST может возникнуть прерывание, изменяющее volatile переменную, и данный код её испортит. Почему компилятор со мной не согласен? Спасибо.


Найдите 3 отличия smile.gif

Код
unsigned char essTime (unsigned char keys) {
    __save_interrupt();        //warning
    __disable_interrupt();     //warning
    STATUS.sec = 0;
    __restore_interrupt();     //warning
    return 0;
Go to the top of the page
 
+Quote Post
acorn
сообщение Dec 1 2006, 16:58
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 28-11-05
Пользователь №: 11 495



Цитата
Код
unsigned char essTime (unsigned char keys) {
    __save_interrupt;        //warning
    __disable_interrupt;     //warning
    STATUS.sec = 0;
    __restore_interrupt;     //warning
    return 0;
}


Найдите 3 отличия smile.gif

Код
unsigned char essTime (unsigned char keys) {
    __save_interrupt();        //warning
    __disable_interrupt();     //warning
    STATUS.sec = 0;
    __restore_interrupt();     //warning
    return 0;


Спасибо wink.gif))
Go to the top of the page
 
+Quote Post
Rst7
сообщение Dec 2 2006, 11:10
Сообщение #4


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Вы что???
Код
char st=__save_interrupt();
__disable_interrupt();
....
__restore_interrupt(st);


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
acorn
сообщение Dec 2 2006, 12:04
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 28-11-05
Пользователь №: 11 495



Цитата(Rst7 @ Dec 2 2006, 10:10) *
Вы что???
Код
char st=__save_interrupt();
__disable_interrupt();
....
__restore_interrupt(st);


да, все верно. Первоначальный код был результатом игр с компилятором и действительно неверным. Однако, компилился (без скобок) - вот интересно, что компилятор имел ввиду под:
Код
__disable_interrupt;

выдавая варнинг, а не ошибку?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Dec 2 2006, 12:16
Сообщение #6


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Имя функции без скобок суть указатель на эту функцию. Соответственно, вы просто написали выражение без присваивания, компилятор вам сказал - ну и что? Взял указатель и все? Ну и не будет тебе никакого кода из этого...


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 14:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01392 секунд с 7
ELECTRONIX ©2004-2016