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

 
 
> не понимаю причины варнинга - объясните, 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
Ответов
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



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

 


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


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