Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/65: Рейтинг темы: голосов - 65, средняя оценка - 4.98
1 / 1 / 0
Регистрация: 09.08.2014
Сообщений: 96
1

Очистка регистров и ОЗУ при инициализации

13.12.2015, 09:14. Показов 12137. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня.
Неоднократно встречал в примерах код чистящий регистры и ОЗУ после сброса. Вопрос следующего плана. Насколько актуальна такая эзотерика? Ведь по логике вещей вряд ли выставившийся там мусор после старта каким то образом может повлиять на программу. Я конечно понимаю что очень удобно иметь чистый буфер под что либо, однако такой буфер годен лишь единожды. И в случае повторного к нему обращения всё равно процедура чистки или инициализации присутствовать будет. И вряд ли она повторит весь путь по программе от ресета. Т.е. по факту я вижу код не очевидной (для меня) полезности. Вот и хотелось услышать мнения тех кто давно работает с МК. Насколько вышеупомянутая чистка полезна практически?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2015, 09:14
Ответы с готовыми решениями:

Очистка ОЗУ
Чем можно очистить оперативную память компа от программ, которые недавно работали, но уже...

Программная очистка ОЗУ
Доброго времени суток ув. делфисты! Возник такой давно назревавший вопрос. Как можно программно...

Вывести состояние сегментных регистров и регистров флагов (ассемблерная вставка)
Вывести в консоль состояние сегментных регистров и регистров флагов. Добавлено через 9 минут ...

Сложить содержание регистров R1 и R4 текущего банка регистров и отразить результат на статическом индикаторе
Сложить содержание регистров R1 и R4 текущего банка регистров и отразить результат на статическом...

29
1 / 1 / 0
Регистрация: 09.08.2014
Сообщений: 96
13.12.2015, 13:47 21
Author24 — интернет-сервис помощи студентам
YTYOUT, а регистры разве нельзя в цикле зачистить. Они же вроде как частью памяти являются?
0
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
13.12.2015, 13:50 22
IMHO
Очистка всей памяти - лишняя трата времени. Явно проинициализировал переменную и всё. То же с регистрами.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
13.12.2015, 14:04 23
Цитата Сообщение от ShodS
Но имей ввиду, если ты вручную инициализируешь глобальные\static переменные, то расходуется лишняя память... иногда это имеет значение...
Да, это я держу в памяти, извиняюсь за каламбур =). Хотя если инициализируешь нулями и не в коде, а просто пишешь static int x = 0 (как я и привык) - проблемы нет, переменная уйдёт в BSS вместе с теми, которые не инициализировал.
Ну и на ПК проблемы нет в принципе.

Цитата Сообщение от Пагранист
Моя вина. Не указал в теме, что речь идёт о примерах программ написанных на ассемблере. Как оно там происходит в С и пр. языках мне не ведомо, поэтому на их счёт судить не берусь.
Ну, на асме свои заморочки, но упростить себе отладку, забивая память каким-то значением - всё равно не худшая идея (если понадобится сэкономить - в окончательном варианте программы это можно выпилить). Если, конечно, не надо ужиматься до последнего байта и такта =)
Хотя зануление регистров, как в примере YTYOUT, меня несколько шокирует: по логике, регистр либо отведён под переменную (и тогда его лучше инициализировать явно - присваивая начальное значение этой переменной), или значение в нём живёт очень недолго.

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

Ну и главная причина - этот код наверняка просто таскается из проекта в проект.
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
13.12.2015, 15:43 24
Есть золотое правило , начинать любую работу с чистого листа. Так например я не инициализирую регистр ZERO- уверен, что он ноль. Кстати так поступает AVRSTUDIO , она сама чистит всё и вся. Спрашивается с чего бы?
Почему не в цикле регистры - так быстрее , можете посчитать - хотя принципиального значения не имеет.
YTYOUT, а регистры разве нельзя в цикле зачистить. Они же вроде как частью памяти являются?
Можно , но этой проге практически свыше 10 лет , я к ней привык и не заморачиваюсь ее оптимизацией , вставляю файл include-м автоматом в проект и всё.
0
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
13.12.2015, 15:48 25
Стандарт C начиная с С99 подразумевает инициализацию нулями всех непроинициализированных переменных. И сторонние библиотеки подчас пишутся изходя из этого стандарта. Поэтому зануление всей области BSS (не статичиски проинициализированных переменных) категорически, нет, КАТЕГОРИЧЕСКИ НЕОБХОДИМА.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 222
13.12.2015, 17:30 26
Очистить/установить всю ROM можно так
Код
START:
;   SER   R16
CLR   R0
ldi ZL,low(ramend)    ; Настройка стека
out SPL,ZL
ldi ZH,high(ramend)
out SPH,ZH
;SIT_ROM:
CLR_ROM:
;   PUSH   R16
PUSH   R0
SBIW   ZL,1

;   BRNE   SIT_ROM
BRNE   CLR_ROM
0
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 200
13.12.2015, 23:36 27
Встречал код на асме, который после сброса по питанию по-быстрому "прикидывал" допустимость значений массива переменных состояния и возвращался к работе. Если же содержимое трактовалось как "ненормальное", - тогда уже полный сброс с инициализацией. Кругом очень "шумная" контактная аппаратура и токи килоамперные.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
13.12.2015, 23:40 28
UmКиЙF, кажется, здесь (или на каком-то другом форуме) обсуждали аналогичный трюк на Си при использовании watchdog: переменные выкидывались в секцию .noinit (которую runtime не затирает на старте) и проверялись на корректность в начале main.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
14.12.2015, 10:58 29
Как-то так:
Код
.macro Clear_Registers
clr      ZH
ldi      ZL, 30
Clear_Register_Cycle:
dec      ZL
st      Z, ZH
brne   Clear_Register_Cycle
.endmacro

.macro   Clear_SROM
ldx      SROM_START
Clear_SROM_Cycle:
st      X+,RCLR
cpi      XL,LOW(SROM_START+SROM_SIZE)
brne   Clear_SROM_Cycle
cpi      XH,HIGH(SROM_START+SROM_SIZE)
brne   Clear_SROM_Cycle
.endmacro
При включении сбросе МК инициализируются только ввод-вывод. По поводу SROM. Здесь особенности схемотехники, топологии. Я обратил внимание, что очистка SROM во многих устройствах - обязанность самого программиста. Скорее всего причина в большом токе. Так как кол-во ячеек SROM может быть очень много. Вот представьте, объединить сотни, тысячи, миллионы ячеек. Какие токи могут быть. И какая входная емкость.
0
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 893
14.12.2015, 12:33 30
Цитата Сообщение от dymyurk1978
Я обратил внимание, что очистка SROM во многих устройствах - обязанность самого программиста..
Или вписывания туда определенных значений для красивого старта. И опять начинаешь думать - если писательство на АСМе не представляет для тебя проблем, а вот раздумья, чем заполнить ячейки при старте и как поступить с ними при ресете по ватчдогу или ноге Ресет есть проблема - помог бы в этом Си?
0
14.12.2015, 12:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2015, 12:33
Помогаю со студенческими работами здесь

Вывод на экран двоичного содержимого двух регистров (ввести значения этих регистров требуется с клавиатуры)
требуется разработать программу вывода на экран двоичного содержимого двух регистров так, чтобы...

Ошибка при инициализации приложения 0xc0000135 (при запуске игры)
У меня возникла " Ошибка при инициализации приложения (0xc0000135)" и.тп при запуске игры...Решила...

Форма отказывается двигаться при изменении this.Location при ее инициализации
В кратце. Я пытаюсь изменить свойство this.Location у формы во время её инициализации. При...

Просмотр стека и регистров FPU при работе в VS
Можно ли при отладке посмотреть стек в Visual studio? и стек сопроцессора? И еще такой вопрос....

Содержимое регистров при переходе от Delphi к Assembler
Здравствуйте. Скажите пожалуйста, при систематическом входе и выходе из Assembler, содержание...

Значения регистров при запуске программы (DOS COM)
Решил ради интереса сварганить прогу, выводящую 'Hello World', но состоящую только из 1-байтовых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru