haker_fox 60 14 января, 2019 Опубликовано 14 января, 2019 · Жалоба 2 hours ago, jenya7 said: опасение что я воспользуюсь переменной до SDRAM_Controller_Init() А вы попробуйте записать что-нибудь до инициализации SDRAM по любому адресу. На кортексах-м BusFault поймаете. И правильно. Потому, что железа "не существует". А компилятор ничего о железе не знает. Он добавит до функции main() код, который инициализирует все глобавильные переменные нулямя. Среди них будет и одна ваша, но находящаяся в адресном пространстве SDRAM. До вызова main() EMC ещё не настроен, следовательно получите ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 14 января, 2019 Опубликовано 14 января, 2019 · Жалоба 2 часа назад, haker_fox сказал: Он добавит до функции main() код, который инициализирует все глобавильные переменные нулями Я хотел, чтобы Евгений сам дал этот ответ и сам понял глубину своего заблуждения... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 14 января, 2019 Опубликовано 14 января, 2019 · Жалоба Если инициализировать SDRAM в __low_level_init(), то всё с глобальные переменными, расположенными в ней, будет в полном порядке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 14 января, 2019 Опубликовано 14 января, 2019 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 14 января, 2019 Опубликовано 14 января, 2019 · Жалоба а если в sdrame лежит только какой-нибудь буфер который инициализировать совсем не надо, даже нулями, может правильнее всё-таки no_init сделать. встречал ещё замечательные грабли когда из-за слишком обширной инициализации забытый вочдог, включенный по умолчанию, успевал сбрасывать процессор до входа в main. его туда тоже конечно можно добавить, но no_init проще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 15 января, 2019 Опубликовано 15 января, 2019 · Жалоба 15 часов назад, jenya7 сказал: переменная сохранит свое значение после отключения питания? Видимо да.... Если сумеете изобрести МК с ОЗУ, сохраняющей своё содержимое при отсутствии питания. А ещё сможете стать очень богатым человеком, потеснив Cypress с её FRAM. 12 часов назад, _pv сказал: переменная может находиться в какой-нибудь внешней памяти, контроллер которой ещё не проинициализирован. Исходя из вопроса ТС, это должна быть не "какая-то память", а именно что-то типа FRAM. Потому что содержимое ОЗУ после выключения обычно разрушается, а во FLASH не размещают "переменные". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 15 января, 2019 Опубликовано 15 января, 2019 · Жалоба 7 hours ago, Сергей Борщ said: Я хотел, чтобы Евгений сам дал этот ответ и сам понял глубину своего заблуждения... Ну теперь ему просто будет легче это сделать)) 3 hours ago, _pv said: встречал ещё замечательные грабли когда из-за слишком обширной инициализации забытый вочдог Кстати, буфера на несколько Мб (мегабайт) я организую отдельными секциями с помощью линковщика. Так получается, что буфер гарантированно ляжет в SDRAM (правда из-за своего объёма он всё-равно тутда ляжет), ну и инициализировать нулями его уже никто не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 15 января, 2019 Опубликовано 15 января, 2019 · Жалоба 12 часов назад, ViKo сказал: После отключения питания переменная не может сохранить свое значение, потому что перестает существовать. Существуют МК с FRAM-памятью. Где это не так. Может ТС говорит о них? Хотя скорей всего как обычно ТС толком не знает что ему нужно... 5 минут назад, haker_fox сказал: Кстати, буфера на несколько Мб (мегабайт) я организую отдельными секциями с помощью линковщика. Так получается, что буфер гарантированно ляжет в SDRAM (правда из-за своего объёма он всё-равно тутда ляжет), ну и инициализировать нулями его уже никто не будет. Куда именно "ляжет" какая-то секция обычно задают в командном файле компоновщика. А что именно инициализировать или нет - определяется там же. При желании можно и в SDRAM класть инициализированные секции. Как - тут уже писали выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nixon 3 17 января, 2019 Опубликовано 17 января, 2019 · Жалоба В 15.01.2019 в 02:27, jcxz сказал: Видимо да.... Если сумеете изобрести МК с ОЗУ, сохраняющей своё содержимое при отсутствии питания. Некоторые микроконтроллеры имеют домен ОЗУ, питаемый отдельно от Vbat. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 17 января, 2019 Опубликовано 17 января, 2019 · Жалоба 16 минут назад, Nixon сказал: Некоторые микроконтроллеры имеют домен ОЗУ, питаемый отдельно от Vbat. Я это знаю, только речь шла про отсутствие питания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 53 26 января, 2019 Опубликовано 26 января, 2019 · Жалоба On 1/14/2019 at 11:02 AM, jenya7 said: Правильно я понимаю что определив int my_var; переменная сохранит свое значение после отключения питания? __no_init означает, что после сброса IAR никакой отсебятины с этой переменной в виде её принудительной иннициализации не делает. А что будет там будет зависеть исключительно от поведения МК(а не компилятора). В ОЗУ при подаче питания обычно мусор, при сбросе (программном или аппаратном) значение сохраняется. В переменных расположенных в аппаратных регистрах - будет то что туда МК по сбросу засунет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 26 января, 2019 Опубликовано 26 января, 2019 · Жалоба 1 час назад, artemkad сказал: __no_init означает, что после сброса IAR никакой отсебятины с этой переменной в виде её принудительной иннициализации не делает. Причём тут инициализация если автор спрашивает про "переменная сохранит свое значение после отключения питания"? Перечитайте ещё раз выделенное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 53 26 января, 2019 Опубликовано 26 января, 2019 · Жалоба 5 minutes ago, jcxz said: Причём тут инициализация если автор спрашивает про "переменная сохранит свое значение после отключения питания"? Перечитайте ещё раз выделенное. Если переменная, к примеру, находится в регистре МК который по сбросу сам МК устанавливает в некое значение, то там после подачи питания будет совсем не мусор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 26 января, 2019 Опубликовано 26 января, 2019 · Жалоба 3 минуты назад, artemkad сказал: Если переменная, к примеру, находится в регистре МК который по сбросу сам МК устанавливает в некое значение, то там после подачи питания будет совсем не мусор. Видимо Вы читать не умеете..... Ещё раз: Причём тут инициализация если автор спрашивает про "переменная сохранит свое значение после отключения питания"? Значение слов после отключения понимаете? PS: И "по сбросу" в регистрах МК не может находиться никаких переменных. В принципе. Учите матчасть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 53 26 января, 2019 Опубликовано 26 января, 2019 · Жалоба 11 minutes ago, jcxz said: PS: И "по сбросу" в регистрах МК не может находиться никаких переменных. В принципе. Учите матчасть. К примеру для Mega48: __no_init volatile unsigned char Flags@ 0x3E; // флаги в регистре GPIOR0 При любом сбросе и подаче питания тут будет однозначный ноль. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться