1 / 1 / 0
Регистрация: 09.08.2014
Сообщений: 96
|
|
1 | |
Очистка регистров и ОЗУ при инициализации13.12.2015, 09:14. Показов 12137. Ответов 29
Метки нет (Все метки)
Доброго дня.
Неоднократно встречал в примерах код чистящий регистры и ОЗУ после сброса. Вопрос следующего плана. Насколько актуальна такая эзотерика? Ведь по логике вещей вряд ли выставившийся там мусор после старта каким то образом может повлиять на программу. Я конечно понимаю что очень удобно иметь чистый буфер под что либо, однако такой буфер годен лишь единожды. И в случае повторного к нему обращения всё равно процедура чистки или инициализации присутствовать будет. И вряд ли она повторит весь путь по программе от ресета. Т.е. по факту я вижу код не очевидной (для меня) полезности. Вот и хотелось услышать мнения тех кто давно работает с МК. Насколько вышеупомянутая чистка полезна практически?
0
|
13.12.2015, 09:14 | |
Ответы с готовыми решениями:
29
Очистка ОЗУ Программная очистка ОЗУ Вывести состояние сегментных регистров и регистров флагов (ассемблерная вставка) Сложить содержание регистров R1 и R4 текущего банка регистров и отразить результат на статическом индикаторе |
1 / 1 / 0
Регистрация: 09.08.2014
Сообщений: 96
|
|
13.12.2015, 13:47 | 21 |
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
Ну и на ПК проблемы нет в принципе.
Сообщение от Пагранист
Хотя зануление регистров, как в примере YTYOUT, меня несколько шокирует: по логике, регистр либо отведён под переменную (и тогда его лучше инициализировать явно - присваивая начальное значение этой переменной), или значение в нём живёт очень недолго. Кстати, ещё один возможный повод для такой практики - занулить сразу несколько переменных одним циклом (а те, что должны быть не нулями - инициализируются потом). Но я, откровенно говоря, не люблю на такое закладываться - непрозрачно как-то... Ну и главная причина - этот код наверняка просто таскается из проекта в проект.
0
|
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
13.12.2015, 15:43 | 24 |
Есть золотое правило , начинать любую работу с чистого листа. Так например я не инициализирую регистр ZERO- уверен, что он ноль. Кстати так поступает AVRSTUDIO , она сама чистит всё и вся. Спрашивается с чего бы?
Почему не в цикле регистры - так быстрее , можете посчитать - хотя принципиального значения не имеет.
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
0
|
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 893
|
|
14.12.2015, 12:33 | 30 |
Сообщение от dymyurk1978
0
|
14.12.2015, 12:33 | |
14.12.2015, 12:33 | |
Помогаю со студенческими работами здесь
30
Вывод на экран двоичного содержимого двух регистров (ввести значения этих регистров требуется с клавиатуры) Ошибка при инициализации приложения 0xc0000135 (при запуске игры) Форма отказывается двигаться при изменении this.Location при ее инициализации Просмотр стека и регистров FPU при работе в VS Содержимое регистров при переходе от Delphi к Assembler Значения регистров при запуске программы (DOS COM) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |