Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: не понимаю причины варнинга - объясните
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
acorn
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 переменную, и данный код её испортит. Почему компилятор со мной не согласен? Спасибо.
subver
Цитата(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;
acorn
Цитата
Код
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))
Rst7
Вы что???
Код
char st=__save_interrupt();
__disable_interrupt();
....
__restore_interrupt(st);
acorn
Цитата(Rst7 @ Dec 2 2006, 10:10) *
Вы что???
Код
char st=__save_interrupt();
__disable_interrupt();
....
__restore_interrupt(st);


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

выдавая варнинг, а не ошибку?
Rst7
Имя функции без скобок суть указатель на эту функцию. Соответственно, вы просто написали выражение без присваивания, компилятор вам сказал - ну и что? Взял указатель и все? Ну и не будет тебе никакого кода из этого...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.