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

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

2 hours ago, jenya7 said:

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

А вы попробуйте записать что-нибудь до инициализации SDRAM по любому адресу. На кортексах-м BusFault поймаете. И правильно. Потому, что железа "не существует". А компилятор ничего о железе не знает. Он добавит до функции main() код, который инициализирует все глобавильные переменные нулямя. Среди них будет и одна ваша, но находящаяся в адресном пространстве SDRAM. До вызова main() EMC ещё не настроен, следовательно получите ошибку.

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


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

2 часа назад, haker_fox сказал:

Он добавит до функции main() код, который инициализирует все глобавильные переменные нулями

Я хотел, чтобы Евгений сам дал этот ответ и сам понял глубину своего заблуждения...

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


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

Если инициализировать SDRAM в __low_level_init(), то всё с глобальные переменными, расположенными в ней, будет в полном порядке.

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


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

10 часов назад, VladislavS сказал:

Если инициализировать SDRAM в __low_level_init(), то всё с глобальные переменными, расположенными в ней, будет в полном порядке.

Да по сути то можно прям в стартапе до вызова main(). Например, для STM32 (какого-то):

ExeptionSystemReset    PROC
  EXPORT ExeptionSystemReset    [WEAK]
  IMPORT fmc_SDRAMInit
  IMPORT __main

  LDR     R0, =fmc_SDRAMInit
  BLX     R0
  LDR     R0, =__main
  BX      R0
ENDP

 

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


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

а если в sdrame лежит только какой-нибудь буфер который инициализировать совсем не надо, даже нулями, может правильнее всё-таки no_init сделать.

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

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


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

15 часов назад, jenya7 сказал:

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

Видимо да.... Если сумеете изобрести МК с ОЗУ, сохраняющей своё содержимое при отсутствии питания.

А ещё сможете стать очень богатым человеком, потеснив Cypress с её FRAM.  :biggrin:

12 часов назад, _pv сказал:

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

Исходя из вопроса ТС, это должна быть не "какая-то память", а именно что-то типа FRAM. Потому что содержимое ОЗУ после выключения обычно разрушается, а во FLASH не размещают "переменные".

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


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

7 hours ago, Сергей Борщ said:

Я хотел, чтобы Евгений сам дал этот ответ и сам понял глубину своего заблуждения...

Ну теперь ему просто будет легче это сделать))

 

3 hours ago, _pv said:

встречал ещё замечательные грабли когда из-за слишком обширной инициализации забытый вочдог

Кстати, буфера на несколько Мб (мегабайт) я организую отдельными секциями с помощью линковщика. Так получается, что буфер гарантированно ляжет в SDRAM (правда из-за своего объёма он всё-равно тутда ляжет), ну и инициализировать нулями его уже никто не будет.

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


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

12 часов назад, ViKo сказал:

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

Существуют МК с FRAM-памятью. Где это не так. Может ТС говорит о них?

Хотя скорей всего как обычно ТС толком не знает что ему нужно...

5 минут назад, haker_fox сказал:

Кстати, буфера на несколько Мб (мегабайт) я организую отдельными секциями с помощью линковщика. Так получается, что буфер гарантированно ляжет в SDRAM (правда из-за своего объёма он всё-равно тутда ляжет), ну и инициализировать нулями его уже никто не будет.

Куда именно "ляжет" какая-то секция обычно задают в командном файле компоновщика. А что именно инициализировать или нет - определяется там же. При желании можно и в SDRAM класть инициализированные секции. Как - тут уже писали выше.

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


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

В 15.01.2019 в 02:27, jcxz сказал:

Видимо да.... Если сумеете изобрести МК с ОЗУ, сохраняющей своё содержимое при отсутствии питания.

Некоторые микроконтроллеры имеют домен ОЗУ, питаемый отдельно от Vbat.

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


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

16 минут назад, Nixon сказал:

Некоторые микроконтроллеры имеют домен ОЗУ, питаемый отдельно от Vbat.

Я это знаю, только речь шла про отсутствие питания.

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


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

On 1/14/2019 at 11:02 AM, jenya7 said:

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

int my_var;

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

__no_init означает, что после сброса IAR никакой отсебятины с этой переменной в виде её принудительной иннициализации не делает. А что будет там будет зависеть исключительно от поведения МК(а не компилятора). В ОЗУ при подаче питания обычно мусор, при сбросе (программном или аппаратном)  значение сохраняется. В переменных расположенных в аппаратных регистрах - будет то что туда МК по сбросу засунет.

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


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

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

__no_init означает, что после сброса IAR никакой отсебятины с этой переменной в виде её принудительной иннициализации не делает.

Причём тут инициализация если автор спрашивает про "переменная сохранит свое значение после отключения питания"?

Перечитайте ещё раз выделенное.

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


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

5 minutes ago, jcxz said:

Причём тут инициализация если автор спрашивает про "переменная сохранит свое значение после отключения питания"?

Перечитайте ещё раз выделенное.

Если переменная, к примеру, находится в регистре МК который по сбросу сам МК устанавливает в некое значение, то там после подачи питания будет совсем не мусор. 

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


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

3 минуты назад, artemkad сказал:

Если переменная, к примеру, находится в регистре МК который по сбросу сам МК устанавливает в некое значение, то там после подачи питания будет совсем не мусор. 

Видимо Вы читать не умеете.....  :sad:

Ещё раз: Причём тут инициализация если автор спрашивает про "переменная сохранит свое значение после отключения питания"?

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

 

PS: И "по сбросу" в регистрах МК не может находиться никаких переменных. В принципе. Учите матчасть.

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


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

11 minutes ago, jcxz said:

 

PS: И "по сбросу" в регистрах МК не может находиться никаких переменных. В принципе. Учите матчасть.

К примеру для Mega48:

__no_init volatile unsigned char  Flags@ 0x3E;    // флаги в регистре GPIOR0

При любом сбросе и подаче питания тут будет однозначный ноль.

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


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

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

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

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

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

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

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

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

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

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