Не могу вернуть указатель из функции
17.10.2014, 12:05
|
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Не могу вернуть указатель из функции
Сообщение от shindax
|
|
Привести пример?
|
Да, приведите! Чтобы без глобальных и volatile.
|
|
|
|
17.10.2014, 12:22
|
|
|
Прописка
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
|
Re: Не могу вернуть указатель из функции
Раз переменная объявлена, как volatile, то она не может быть неглобальной и в данном случае, такая переменная есть неизбежное зло. Никто не говорил, что без них вообще можно обойтись, было сказано "дурной тон". Во всех остальных случаях лучше передавать переменные через парметры функций. И я говорил про пример, как оптимизатор может обойтись с переменой без volatile.
|
|
|
|
17.10.2014, 12:25
|
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,578
Сказал спасибо: 175
Сказали Спасибо 1,567 раз(а) в 810 сообщении(ях)
|
Re: Не могу вернуть указатель из функции
|
|
|
|
17.10.2014, 12:32
|
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Не могу вернуть указатель из функции
Не спугни! "Гусары, молчать!"(С)
|
|
|
|
17.10.2014, 12:37
|
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Не могу вернуть указатель из функции
Сообщение от shindax
|
|
Раз переменная объявлена, как volatile, то она не может быть неглобальной
|
Это почему?
|
Цитата:
|
|
Никто не говорил, что без них вообще можно обойтись, было сказано "дурной тон".
|
Без них нельзя, но тон дурной? Это как?
|
Цитата:
|
|
И я говорил про пример, как оптимизатор может обойтись с переменой без volatile.
|
Регистры МК, это глобальные или локальные переменные? Почему тогда они volatile?
|
|
|
|
17.10.2014, 12:55
|
|
|
Прописка
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
|
Re: Не могу вернуть указатель из функции
Сообщение от STM32F0
|
Да, приведите! Чтобы без глобальных и volatile.
|
Да вот простой пример на PIC:
...
...
|
Код:
|
void main( void )
{
initSFRS();
initSystem();
while(1)
{
// Какой-то автомат либо мало связаный с прерываниями, либо использующий их флаги не
// прибегая к обработчику
}
}
void interrupt isr( void )
{
static unsigned char sec = 0;
static unsigned char min = 0;
static unsigned char hour = 0;
static unsigned int val1 = 0;
static unsigned char val2 = 0;
if( TMR1IF && TMR1IE )
{
val1 = PORTC ‹‹ 8 | PORTB ;
val2 = func1( val1 );
func2( &val1, &val2 );
eepromWrite( val1, val2 );
TMR1IF = 0 ;
sec++ ;
if( sec == 60 )
{
sec = 0 ;
min ++ ;
}
if( min == 60 )
{
min = 0 ;
hour ++ ;
}
if( hour == 24 )
hour = 0 ;
DisplayOut();
}
if( RBIF && RBIE )
{
Обработка кнопок ;
}
} |
И эти часы будут ходить и что-то ещё в прерывании будет делаться, и в main-е что-то будет происходить.
Последний раз редактировалось shindax; 17.10.2014 в 13:09.
|
|
|
|
17.10.2014, 13:01
|
|
|
Прописка
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
|
Re: Не могу вернуть указатель из функции
Сообщение от STM32F0
|
|
Это почему?
|
Потому, что её может изменить прерывание, а передать что-то в прерывание простым способом затруднительно
Сообщение от STM32F0
|
|
Без них нельзя, но тон дурной? Это как?
|
Их можно использовать, если без них уж совсем сложно получается, но как можно реже.
Сообщение от STM32F0
|
|
Регистры МК, это глобальные или локальные переменные? Почему тогда они volatile?
|
Глобальные, разумеется, раз они существуют в адресном пространстве с первых тактов генератора и занимаемая ими память не может быть освобождена для других переменных.
Это всё прописные истины и об этом исписаны тонны бумаги.
Последний раз редактировалось shindax; 17.10.2014 в 13:07.
|
|
|
|
17.10.2014, 13:09
|
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Не могу вернуть указатель из функции
Сообщение от shindax
|
|
Да вот простой пример на PIC:
|
Не катит! Static инициализируются ещё до майна. Следовательно они не локальные в чистом виде.
|
|
|
|
17.10.2014, 13:18
|
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Не могу вернуть указатель из функции
Сообщение от shindax
|
|
Потому, что её может изменить прерывание, а передать что-то в прерывание простым способом затруднительно
|
Локальная тоже может быть volatile!
|
Цитата:
|
|
Их можно использовать, если без них уж совсем сложно получается, но как можно реже.
|
Volatile тоже рекомендуют не тулить где попало, однако это не "дурной тон", почему-то.
|
Цитата:
|
|
Это всё прописные истины и об этом исписаны тонны бумаги.
|
Так почитайте ещё раз!
|
|
|
|
17.10.2014, 13:18
|
|
|
Прописка
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
|
Re: Не могу вернуть указатель из функции
Сообщение от STM32F0
|
|
Не катит! Static инициализируются ещё до майна. Следовательно они не локальные в чистом виде.
|
С чего бы это? Что изменится, если они будут инициализированы после мэйна? Неважно, где и когда это произойдёт, важно то, что они являются локальными внутри функции isr. В любой другой функции, могут содержать одноименные локальные переменные. И какие тогда переменные можно считать "истинно глобальными"? Только те, которые вне функций объявлены?
Последний раз редактировалось shindax; 17.10.2014 в 13:20.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:05.
|
|