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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Обычная переменная для ISR и volatile для всех остальных, как лучше реализовать?
kimstik
сообщение Jan 25 2009, 17:31
Сообщение #16


Участник
*

Группа: Свой
Сообщений: 46
Регистрация: 4-02-05
Из: Москва
Пользователь №: 2 430



точно не помню sad.gif но нарывался уже на непонимание анонимного union, и вроде как даже не в одном месте. И это был С без плюсов.
zltigo: вам виднее,и спорить не хочется. мне лично две длинные переменные вместо одной короткой - лишняя сущность (по оккаму).
Тем не менее хочется отметить что вы везунчик - у вас есть выбор как минимум из 3х подходов реализации задачи smile.gif
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 25 2009, 18:48
Сообщение #17


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(kimstik @ Jan 25 2009, 21:31) *
точно не помню sad.gif но нарывался уже на непонимание анонимного union, и вроде как даже не в одном месте. И это был С без плюсов.

Но разве безымянные объединения не являются фичей исключительно C++?
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 25 2009, 19:50
Сообщение #18


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(sonycman @ Jan 25 2009, 21:48) *
Но разве безымянные объединения не являются фичей исключительно C++?
Не только.
Насколько я ничего не помню, в С безымянные структуры могут быть,
но они должны обязательно включаться в конечном итоге в именованные структуры или объединения.
типа:
Код
struct
{
  union
  {
    int a;
    char c[2];
  };
  int b;
} w;

только с безымянными объединениями нужно в любом случае быть очень аккуратными...
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 25 2009, 21:08
Сообщение #19


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



И раз уж зашла речь о безымянных обединениях и структурах, вот такой пример:
Код
volatile union
{
  struct
  {
    int a;
    union
    {
      int a;
      int b;
    };
  };
  int b;
  int c;
} t;

volatile int A, B, C;

int main()
{
  t.a = 1;
  t.b = 2;
  t.c = 3;

  A = t.a;
  B = t.b;
  C = t.c;

  return 0;
}
Чему будут равны A,B,C в конце main ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 25 2009, 21:19
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Jan 26 2009, 00:08) *
Чему будут ...

Для начала эта мусорная структура не должна откомпилироваться.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 25 2009, 21:40
Сообщение #21


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Jan 26 2009, 00:19) *
Для начала эта мусорная структура не должна откомпилироваться.

во-первых многие компиляторы сожрут и не подавятся... я пробовал.
хотя согласен что я слегка перестарался...

а что скажут компиляторы на вот такую структуру:
Код
volatile union
{
  struct
  {
    int b;
    union
    {
      int a;
      int b;
    };
  };
  int c;
} t;
?
только попробуйте сначала реально скомпилить прежде чем говорить что не скомпилит.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 25 2009, 21:51
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Jan 26 2009, 00:40) *
только попробуйте сначала реально скомпилить прежде чем говорить что не скомпилит.
1. Multiple declaration for 'b'
2. "b" has already been declared in the current scope
3. Duplicate name 'b' not allowed in struct or union
Что было видно и без попыток скомпилировать сие тремя компиляторами. Начиная с самого древнего и кривого BCC.

 


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kimstik
сообщение Jan 25 2009, 21:53
Сообщение #23


Участник
*

Группа: Свой
Сообщений: 46
Регистрация: 4-02-05
Из: Москва
Пользователь №: 2 430



живодеры!!
вот увидете - перестанет компилятор вам компилить вообще после этого - пожалеете smile.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 25 2009, 22:10
Сообщение #24


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Jan 26 2009, 00:51) *
Что было видно и без попыток скомпилировать сие тремя компиляторами. Начиная с самого древнего и кривого BCC.

вот это:
Код
volatile union
{
  struct
  {
    int b;
    union
    {
      int a;
      int b;
    };
  };
  int c;
} t;

VisualStudio 2005 прожевывает не поперхнувшись... smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 25 2009, 22:33
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Jan 26 2009, 01:10) *
VisualStudio 2005 прожевывает не поперхнувшись... smile.gif

Ну фиг с ней - у меня по любому такое написать не получится. Хотя иногда достаточно, на первый взгляд, запутанные union-ы пишу.

Код
#pragma pack( push, 1 )

typedef struct Cons_shdr_s
{  
 BYTE type;
 BYTE cmd;          
      union{
     BYTE obj;
     BYTE obj_1;
     };
     union{       
     BYTE lin;              
     BYTE lin_1;              
     BYTE lin_cons;
     };

}Cons_shdr;

typedef struct Cons_bhdr_s
{
 BYTE obj_2;           
 BYTE lin_2;        
}Cons_bhdr;

typedef struct Cons_frame_s
{     

 union{
 Cons_shdr;     
 ulong hdr;
 };
 union{
     union{
     BYTE nlen;
     char text[CONS_TXT_SIZE];
     BYTE time[4];
     };
     struct{
         union{
         Cons_bhdr;
         ushort ident; 
         };
         union{
         BYTE nlen;
         char text[CONS_TXT_SIZE];
         };
     }b;
 };
}Cons_frame;
#pragma pack( pop )


Комментариии, правда,удалены smile.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 25 2009, 22:39
Сообщение #26


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Jan 26 2009, 01:33) *
Ну фиг с ней - у меня по любому такое написать не получится. Хотя иногда достаточно, на первый взгляд, запутанные union-ы пишу.
Комментариии, правда,удалены smile.gif.

Это просто было в качестве примера что неименнованные структуры и объединения нужно очень осторожно применять, можно случайно нарваться...

Структурки у Вас веселые... smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 25 2009, 22:42
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Jan 26 2009, 01:39) *
Структурки у Вас веселые... smile.gif

Зато потом, после достаточно вдумчивого и аккуратного описания, ее результатами пользоваться очень удобно и без лишних раздумий.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
777777
сообщение Jan 26 2009, 07:51
Сообщение #28


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



А ты не пробовал объявлять ее вообще без volatile? Вообще-то это требуется крайне редко, например, в подобном коде:

int n = 10;
while(n--)
{}

Здесь компилятор просто присвоит переменной -1 и больше никакого кода создавать не будет. Если же у тебя в обработчике таймера переменная инкрементируется, а в основной программе только читается, то обычно никаких проблем не возникает - нет для этого почвы. Компилятор не может сделать никаких предположений о содержимом переменной и будет вынужден ее прочитать.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 26 2009, 08:20
Сообщение #29


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(777777 @ Jan 26 2009, 09:51) *
А ты не пробовал объявлять ее вообще без volatile?
Шикарный совет. "Как, вы еще не получали граблями в этом месте? Вот вам! smile3046.gif "
Цитата(777777 @ Jan 26 2009, 09:51) *
Вообще-то это требуется крайне редко,
Вообще-то это требуется всегда, когда переменная изменяется неизвестным компилятору образом, например в прерывании, другом потоке или аппаратно отражает состояние внешних по отношению к ядру устройств.
Цитата(777777 @ Jan 26 2009, 09:51) *
Компилятор не может сделать никаких предположений о содержимом переменной и будет вынужден ее прочитать.
Зато _вы_ можете сделать предположение за компилятор. cranky.gif . Может он. Чтобы не мог - существует volatile. Если в конкретном случае без volatile вдруг не сделал, то при малейшем изменении исходника или версии компилятора сможет сделать и вот вам граблями в лоб - получите. Даже если чтения разнесены в разные функции и файлы - все больше компиляторов поддерживают многофайловую компиляцию. Хотите приключений - делайте, но не советуйте этого другим. Это примерно как "лазил я однажды в телевизор и нифига меня током не ударило. Так что незачем при ремонте его отключать от сети".


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 26 2009, 11:38
Сообщение #30


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(777777 @ Jan 26 2009, 11:51) *
А ты не пробовал объявлять ее вообще без volatile?
Но ведь это сразу создаст проблемы.
Допустим, я захочу подождать, пока таймер не "протикает" несколько раз:
Код
extern dword sys_tick;

Wait(dword mksec) {
dword new_value, old_value = sys_tick;
do{
new_value = sys_tick;
}while ((new_value - old_value) < mksec);
}

Без volatile цикл while просто повиснет, так как new_value просто не будет считываться - компилер, будучи уверенным, что она не изменяется (нет присваивания), выкинул операцию считывания из кода...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:52
Рейтинг@Mail.ru


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