Перейти к содержанию
    

Использование __no_init

Правильно я понимаю что определив

__no_init int my_var;

переменная сохранит свое значение после отключения питания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет. По умолчанию глобальные переменные инициализируются нулями (если значение явно не задано). Если указано __no_init  то инициализация не происходит и значения у этих переменных могут быть любыми.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, arhiv6 said:

Нет. По умолчанию глобальные переменные инициализируются нулями (если значение явно не задано). Если указано __no_init  то инициализация не происходит и значения у этих переменных могут быть любыми.

спасибо. не понимаю тогда зачем нужен __no_init. как по мне пусть лучше переменная будет обнуленная чем с мусором.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, jenya7 сказал:

спасибо. не понимаю тогда зачем нужен __no_init. как по мне пусть лучше переменная будет обнуленная чем с мусором.

Бывает, что наоборот, требуется не обнулять переменную при сбросе. Сбросили девайс, а содержимое памяти с таким квалификатором останется неизменным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Arlleex said:

Бывает, что наоборот, требуется не обнулять переменную при сбросе. Сбросили девайс, а содержимое памяти с таким квалификатором останется неизменным.

в том то и вопос

либо

1 hour ago, Arlleex said:

 содержимое памяти с таким квалификатором останется неизменным.

либо

2 hours ago, arhiv6 said:

значения у этих переменных могут быть любыми.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

переменная может находиться в какой-нибудь внешней памяти, контроллер которой ещё не проинициализирован.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

то есть при сбросе с сохраненной запиткой значение в переменной останется неизменным. а при полном спросе по питанию значения потеряются.

2 minutes ago, _pv said:

переменная может находиться в какой-нибудь внешней памяти, контроллер которой ещё не проинициализирован.

ну так инициализирую при обращении к внешней памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__section (SDRAM) int var = 0x1234; 

void main(){
  SDRAM_Controller_Init();
}

компилятору в таком случае что по вашему сделать надо? догадаться что инициализировать переменную пока рано, и записать в неё значение только после инициализации контроллера памяти?

ну а просто int var;  равносильно int var = 0;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, jenya7 сказал:

то есть при сбросе с сохраненной запиткой значение в переменной останется неизменным. а при полном спросе по питанию значения потеряются.

Совершенно верно. Только обратите внимание, что это поведение определяется устройством Вселенной в которой нам довелось жить и конструкцией конкретного микроконтроллера, а вовсе не иаровским расширением(extended keyword) __no_init.

Последнее всего лишь отменяет инициализацию при старте программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 minutes ago, _pv said:

__section (SDRAM) int var = 0x1234; 

void main(){
  SDRAM_Controller_Init();
}

компилятору в таком случае что по вашему сделать надо? догадаться что инициализировать переменную пока рано, и записать в неё значение только после инициализации контроллера памяти?

ну а просто int var;  равносильно int var = 0;

так а в чем проблема я не понял? опасение что я воспользуюсь переменной до SDRAM_Controller_Init(); ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После отключения питания переменная не может сохранить свое значение, потому что перестает существовать. :prankster2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например, для работы с сегментами EEPROM удобно __no_init использовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или для флагов перехода в загрузчик, или для сохранения структуры причины отказа в бортовой журнал после немедленного сброса, или много еще почему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jenya7 сказал:

так а в чем проблема я не понял? опасение что я воспользуюсь переменной до SDRAM_Controller_Init(); ?

А как вы думаете, кто и когда должен занести 0x1234 в var?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jenya7 said:

так а в чем проблема я не понял? опасение что я воспользуюсь переменной до SDRAM_Controller_Init(); ?

Ну например, можно словить какое-нибудь исключение, за то что полезли туда куда не надо, до инициализации контроллера памяти.

Повторюсь что просто int var; равносильно int var = 0;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...