Jump to content

    

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

2 hours ago, jenya7 said:

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

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

Share this post


Link to post
Share on other sites
2 часа назад, haker_fox сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
15 часов назад, jenya7 сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
7 hours ago, Сергей Борщ said:

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

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

 

3 hours ago, _pv said:

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

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

Share this post


Link to post
Share on other sites
12 часов назад, ViKo сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
В 15.01.2019 в 02:27, jcxz сказал:

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

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

Share this post


Link to post
Share on other sites
16 минут назад, Nixon сказал:

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

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

Share this post


Link to post
Share on other sites
On 1/14/2019 at 11:02 AM, jenya7 said:

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

int my_var;

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

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

Share this post


Link to post
Share on other sites
1 час назад, artemkad сказал:

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

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

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

Share this post


Link to post
Share on other sites
5 minutes ago, jcxz said:

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

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

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

Share this post


Link to post
Share on other sites
3 минуты назад, artemkad сказал:

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

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

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

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

 

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

Share this post


Link to post
Share on other sites
11 minutes ago, jcxz said:

 

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now