реклама на сайте
подробности

 
 
> Защита секция кода во FLASH в ATmega, Как защититься от несанкционированного выполнения кода
Дон Амброзио
сообщение Feb 11 2008, 17:42
Сообщение #1


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



А кто как защищает код в MCU от несанкционированного выполнения в результате случайного перехода из одной точки программы в другую от воздействия помехонесущего электромагнитного поля (искажения записанного в счётчике команд значения). А?

Приведу пример
--------------------
lab_1_input: ldi R16 , $00
mov R16 , $98
...
lab_1_output: mov R17 , R5
-----------------------
lab_2_1_input: mov R18, R17


Т.е. допустим программа предусматривает переход к выполнению кодового фрагмента, начинающегося с метки lab_2_1_input только после отработки до конца фрагмента [lab_1_input;lab_1_output]

А представим , что от помехи произошёл случайный переход из произвольной точки 1-го фрагмента кода в произвольную точку 2-го фрагмента кода....

Как вы ПРОГРАММНО отлавливаете такие ситуации?

Т.е. как Вы реализовываете в своих программах для микроконтроллеров ATmega механизм защиты FLASH-памяти от несанкционированного выполнения кода. Ну т.е. как контролировать, что в данный фрагмент кода вошли не где попало, а через строго определённые на этапе проектирования программы, точки

Цитата(Дон Амброзио @ Feb 11 2008, 20:36) *
А кто как защищает код в MCU от несанкционированного выполнения в результате случайного перехода из одной точки программы в другую от воздействия помехонесущего электромагнитного поля (искажения записанного в счётчике команд значения).

Кстати, причины такого случайного джампа могут быть не только в разрушении PC.
Может также случайным образом измениться содержимое ячейки FLASH или содержимое хранимой в ОЗУ таблицы переходов... В любом случае МОЖЕТ произойти переход в точку некоторого логического сегмента кода, которая не предусмотрена данным логическим сегментом FLASH


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Kris2007
сообщение Feb 12 2008, 13:21
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 75
Регистрация: 15-03-07
Пользователь №: 26 193



А че такое бывает чтобы из-за электромагнитных помех грохнулся счетчик команд?
По моему это неудачные попытки нати существующую ошибку в коде. Не нашли списали на э.м помехи.

Импульсник на 3квт делали на атмеге. Там тАкие помехи идут и все ок. Я уж не говорю о других устройствах. Если некая помеха по питанию и на пине это еще понятно но случайная запись в PC ..

Сообщение отредактировал Kris2007 - Feb 12 2008, 13:26
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Feb 12 2008, 16:18
Сообщение #3


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Цитата(Kris2007 @ Feb 12 2008, 16:21) *
А че такое бывает чтобы из-за электромагнитных помех грохнулся счетчик команд?

Бывает, бывает. Молодой человек. Я написал тестовую прогу для ATmega8 которая представляет собой следующее:

.cseg
.org 0
;-----------------
.set Number = 0
;-----------------
Begin_Loop :
.set Number = Number +1
ldi R16 , Number
nop
...
nop
cpi R16 , Number
breq PC+0x02
rjmp Crash
;-----------------
.set Number = Number +1
ldi R16 , Number
nop
...
nop
cpi R16 , Number
breq PC+0x02
rjmp Crash
;-----------------
.set Number = Number +1
ldi R16 , Number
nop
...
nop
cpi R16 , Number
breq PC+0x02
rjmp Crash
;-----------------------
......
......
......
;-----------------
.set Number = Number +1
ldi R16 , Number
nop
...
nop
cpi R16 , Number
breq PC+0x02
rjmp Crash
;-----------------------
rjmp Begin_Loop
;-----------------------
Crash :

; Зажечь светодиод
...

; Остановиться
;------------------------
После подачи помехи в виде электромагнитной наводки от пьёзозажигалки мне удавалось как зажечь светодиод

Цитата(Kris2007 @ Feb 12 2008, 16:21) *
Импульсник на 3квт делали на атмеге. Там тАкие помехи идут и все ок. Я уж не говорю о других устройствах. Если некая помеха по питанию и на пине это еще понятно но случайная запись в PC ..

У меня тоже в условиях эксплуатация все девайсы работают нормально. А когда я над ними "издеваюсь" с помощью пьезозажигалки, то порой такие "чудеса" наблюдаю

Цитата(SasaVitebsk @ Feb 12 2008, 16:36) *
А с какими ты работал? Сейчас практически все AVR "такие"

Не звизди.. twak.gif
"Все такие" говоришь? А как же ATmega 8, 8515, 8535, 64, 128..А?

Цитата(Дон Амброзио @ Feb 12 2008, 18:54) *
А как же ATmega 8, 8515, 8535, 64, 128..А?
В них по WDT происходит полноценный сброс, а не прерывание

Цитата(SasaVitebsk @ Feb 12 2008, 16:36) *
Просто к моменту когда ты начал обдумывать свои "правильные" методики борьбы, человечество с этим уже работало и над этим думало не один десяток лет. И WDT оказался одним из самых эффективных методов борьбы с зависаниями и сбоями.

Дык с зависаниями или сбоями? Вы уж определитесь.. Ибо понятие "сбой" гораздо шире понятия "зависание"

Цитата(SasaVitebsk @ Feb 12 2008, 16:36) *
раз уж ты уходишь от переписывания моей процедуры.

Странный ты.. Ну на тебе твою переделанную процедуру (хотя я же объяснял тебе выше как это сделать. Неужели для тебя это так сложно? 07.gif )

...
ldi R25 , high ( Border_Counter)
ldi R24 , low ( Border_Counter)
ReadLptEPP:
sbiw R25:R24 , 1
breq Crash
sbic pinc,LptSTB ; Строб пришёл?
rjmp ReadLptEPP ; иначе повторить
...


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 12 2008, 17:00
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Дон Амброзио @ Feb 12 2008, 20:18) *
Не звизди.. twak.gif
"Все такие" говоришь? А как же ATmega 8, 8515, 8535, 64, 128..А?

В них по WDT происходит полноценный сброс, а не прерывание

Используйте m88, m165, m1281...

Цитата
Дык с зависаниями или сбоями? Вы уж определитесь.. Ибо понятие "сбой" гораздо шире понятия "зависание"

А что по вашему есть "зависание"?

Цитата
Странный ты.. Ну на тебе твою переделанную процедуру (хотя я же объяснял тебе выше как это сделать. Неужели для тебя это так сложно? 07.gif )

...
ldi R25 , high ( Border_Counter)
ldi R24 , low ( Border_Counter)
ReadLptEPP:
sbiw R25:R24 , 1
breq Crash
sbic pinc,LptSTB ; Строб пришёл?
rjmp ReadLptEPP ; иначе повторить
...

На частоте 14745600 максимальное время - 22мс. При 4-ёх байтном счётчике ~ 40 минут.
Итак вопрос чем ваш вариант лучше применения WDT? Не будем здесь обсуждать 1.5 кратное увеличение длины кода и прочие нюансы. Вчём прелесть? Я действительно хочу понять вашу мысль.

Дело в том, что некоторые применяют как раз противоположные подходы. К примеру, для перехода в 0 инициализируют WDT и делают цикл. Вот как раз отрывок из Atmel-овского avr231
Код
                        case TYPE_RESET:
                            busReplyByte(ERROR_OK);
                            for(;;);
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Feb 12 2008, 17:14
Сообщение #5


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Цитата(SasaVitebsk @ Feb 12 2008, 20:00) *
К примеру, для перехода в 0 инициализируют WDT и делают цикл.

Это не для "перехода в 0" делается , а для перевода микроконтроллера в определённое исходное состояние, именуемого сбросом

Цитата(SasaVitebsk @ Feb 12 2008, 20:00) *
Используйте m88, m165, m1281...
Не я выбираю MCU: что мне дали, то я и юзаю ( я последнее время больше программером работаю, хотя я могу и платы разводить, и схемы проектировать). Мне дают готовый девайс и я пишу для него прогу

Цитата(SasaVitebsk @ Feb 12 2008, 20:00) *
А что по вашему есть "зависание"?
Вы точно не читаете то, что уже написано. Я же написал выше, что " понятие "сбой" гораздо шире понятия "зависание"". Из чего следует, что зависание - это частный случай сбоя и зависание далеко не исчерпывает все возможные виды сбоев


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 12 2008, 19:16
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Дон Амброзио @ Feb 12 2008, 21:14) *
Вы точно не читаете то, что уже написано. Я же написал выше, что " понятие "сбой" гораздо шире понятия "зависание"". Из чего следует, что зависание - это частный случай сбоя и зависание далеко не исчерпывает все возможные виды сбоев


А что именно здесь читать? Вы считаете что вы ответили на вопрос? С моей точки зрения вы его обошли. Правда не удачно.

"Зависание" - это не частный случай сбоя, а это частный результат сбоя. Их (результатов) может быть всего два вида. Первый - вылет на сброс, второй - "зависание" (зацикливание). Причём понятно, что проц не сразу туда попадает, а с момента сбоя - попадает в ближайший цикл, который не может пройти.

Видете как просто? По объёму написанного - столько же. Так почему просто не ответить на поставленный вопрос?

Далее - исходя из этого - WDT лучше помогает чем ваши ограничители. Какой в них смысл? Таймауты применяют при работе с внешним оборудованием, для того, чтобы диагностировать сбой в работе оного. Диагностировать, для того чтобы обработать ошибку определённым образом. Например если не получили ответа от rs485, посылаем повторный запрос, если произошёл сбой при работе с ЖКИ - сбрасываем и перерисовываем. Но если в результате "не ответа" нечего делать? Если уровень сбоя превышает возможности его обработки, в этом случае идёт полная перезагрузка процессора. И аппаратный аварийный рестарт - всегда был более лучшим средством чем программный.
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Feb 12 2008, 19:56
Сообщение #7


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Цитата(SasaVitebsk @ Feb 12 2008, 22:16) *
Их (результатов) может быть всего два вида. Первый - вылет на сброс, второй - "зависание" (зацикливание).
Очень упрощённый взгляд на проблему. Результатом сбоя явлются либо материальный ущерб, либо (в худшем случае) человеческие жертвы


Цитата(SasaVitebsk @ Feb 12 2008, 22:16) *
Причём понятно, что проц не сразу туда попадает, а с момента сбоя - попадает в ближайший цикл, который не может пройти.

Видете как просто?

Такая простота хуже воровства и граничит с полной профессиональной некомпетентностью

Цитата(SasaVitebsk @ Feb 12 2008, 22:16) *
попадает в ближайший цикл, который не может пройти.
Да нет таких в нормальной продуманной программе. Сколько раз Вам повторять


Цитата(SasaVitebsk @ Feb 12 2008, 22:16) *
Таймауты применяют при работе с внешним оборудованием
А в многопоточных RTOS не применяется? У меня наприммер в моих программах работающих в среде моей же RTOS я контролирую до 50-ти таймаутов различных внешних и внутренних событий


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Дон Амброзио   Защита секция кода во FLASH в ATmega   Feb 11 2008, 17:42
- - Liseev   А как вы будете защищать "механизм защиты от ...   Feb 11 2008, 18:05
|- - Дон Амброзио   Цитата(Liseev @ Feb 11 2008, 21:05) Испол...   Feb 11 2008, 18:40
|- - Liseev   Цитата(Дон Амброзио @ Feb 11 2008, 21:40)...   Feb 11 2008, 19:32
|- - SasaVitebsk   Цитата(Дон Амброзио @ Feb 11 2008, 22:40)...   Feb 11 2008, 21:34
|- - Дон Амброзио   Цитата(SasaVitebsk @ Feb 12 2008, 00:34) ...   Feb 11 2008, 21:52
||- - SasaVitebsk   Цитата(Дон Амброзио @ Feb 12 2008, 01:52)...   Feb 11 2008, 22:45
||- - Дон Амброзио   Цитата(SasaVitebsk @ Feb 12 2008, 01:45) ...   Feb 11 2008, 23:08
||- - SasaVitebsk   Цитата(Дон Амброзио @ Feb 12 2008, 03:02)...   Feb 11 2008, 23:11
|||- - Дон Амброзио   Цитата(SasaVitebsk @ Feb 12 2008, 02:11) ...   Feb 11 2008, 23:31
|||- - SasaVitebsk   Цитата(Дон Амброзио @ Feb 12 2008, 03:31)...   Feb 12 2008, 08:41
||||- - Дон Амброзио   Цитата(SasaVitebsk @ Feb 12 2008, 11:41) ...   Feb 12 2008, 12:01
|||- - defunct   Цитата(Дон Амброзио @ Feb 12 2008, 01:31)...   Feb 13 2008, 12:47
|||- - Дон Амброзио   Цитата(defunct @ Feb 13 2008, 15:47) это ...   Feb 13 2008, 16:08
|||- - defunct   ЦитатаА кто как организует код программы, чтобы пр...   Feb 13 2008, 23:51
|||- - Дон Амброзио   Цитата(defunct @ Feb 14 2008, 02:51) Дете...   Feb 14 2008, 00:30
|||- - defunct   Цитата(Дон Амброзио @ Feb 14 2008, 02:13)...   Feb 14 2008, 00:33
||||- - Дон Амброзио   Цитата(defunct @ Feb 14 2008, 03:33) Пото...   Feb 14 2008, 00:49
|||||- - defunct   Цитата(Дон Амброзио @ Feb 14 2008, 02:49)...   Feb 14 2008, 00:55
|||||- - Дон Амброзио   Цитата(defunct @ Feb 14 2008, 03:55) Вооб...   Feb 14 2008, 01:26
|||||- - defunct   Цитата(Дон Амброзио @ Feb 14 2008, 03:21)...   Feb 14 2008, 01:34
||||||- - Дон Амброзио   Цитата(defunct @ Feb 14 2008, 04:34) Поче...   Feb 14 2008, 01:40
||||||- - defunct   Цитата(Дон Амброзио @ Feb 14 2008, 03:40)...   Feb 14 2008, 01:43
|||||- - singlskv   Цитата(Дон Амброзио @ Feb 14 2008, 04:26)...   Feb 14 2008, 09:38
||||- - Дон Амброзио   Цитата(defunct @ Feb 14 2008, 03:33) А во...   Feb 14 2008, 01:05
|||||- - defunct   Цитата(Дон Амброзио @ Feb 14 2008, 02:56)...   Feb 14 2008, 01:06
||||- - galjoen   Цитата(defunct @ Feb 14 2008, 03:33) Ну и...   Feb 14 2008, 07:11
||||- - defunct   Цитата(galjoen @ Feb 14 2008, 09:11) Сове...   Feb 14 2008, 15:18
||||- - Дон Амброзио   Цитата(galjoen @ Feb 14 2008, 10:11) У AR...   Feb 14 2008, 15:35
||||- - singlskv   Цитата(Дон Амброзио @ Feb 14 2008, 18:35)...   Feb 14 2008, 18:10
||||- - Дон Амброзио   Цитата(singlskv @ Feb 14 2008, 21:10) Ой....   Feb 14 2008, 18:45
||||- - singlskv   Цитата(Дон Амброзио @ Feb 14 2008, 21:35)...   Feb 14 2008, 18:51
|||- - Дон Амброзио   Цитата(Дон Амброзио @ Feb 14 2008, 03:30)...   Feb 14 2008, 00:35
|||- - defunct   Цитата(Дон Амброзио @ Feb 14 2008, 02:30)...   Feb 14 2008, 00:45
||- - galjoen   Цитата(Дон Амброзио @ Feb 12 2008, 02:08)...   Feb 12 2008, 00:33
|- - galjoen   Цитата(Дон Амброзио @ Feb 11 2008, 20:42)...   Feb 11 2008, 22:05
- - Непомнящий Евгений   Ну как вариант - расставить assert-ы по всей проге...   Feb 11 2008, 19:26
|- - Дон Амброзио   Цитата(Непомнящий Евгений @ Feb 11 2008, 22...   Feb 11 2008, 20:15
- - arttab   Средства должны оправдывать цели. уровень защиты о...   Feb 12 2008, 01:45
|- - Дон Амброзио   Цитата(arttab @ Feb 12 2008, 04:45) Средс...   Feb 12 2008, 05:05
|- - VladimirYU   Цитата(Дон Амброзио @ Feb 12 2008, 08:05)...   Feb 12 2008, 06:23
||- - Дон Амброзио   Цитата(VladimirYU @ Feb 12 2008, 09:23) К...   Feb 12 2008, 06:35
|- - adc   Цитата(Дон Амброзио @ Feb 12 2008, 08:05)...   Feb 12 2008, 12:49
||- - Дон Амброзио   Цитата(adc @ Feb 12 2008, 15:49) Вот вот....   Feb 12 2008, 13:03
||- - SasaVitebsk   Цитата(Дон Амброзио @ Feb 12 2008, 17:03)...   Feb 12 2008, 13:36
|- - tyro   Цитата(Дон Амброзио @ Feb 12 2008, 08:05)...   Feb 13 2008, 07:56
|- - Дон Амброзио   Цитата(tyro @ Feb 13 2008, 10:56) Обсужда...   Feb 13 2008, 09:39
|- - zltigo   Цитата(Дон Амброзио @ Feb 13 2008, 12:36)...   Feb 13 2008, 09:42
|- - Dog Pawlowa   Цитата(zltigo @ Feb 13 2008, 13:42) За те...   Feb 13 2008, 09:49
|- - zltigo   Цитата(Dog Pawlowa @ Feb 13 2008, 12:49) ...   Feb 13 2008, 10:02
|- - Дон Амброзио   Цитата(zltigo @ Feb 13 2008, 13:02) Для н...   Feb 13 2008, 10:51
- - Непомнящий Евгений   ИМХО, стратегия поведения после обнаружения ошибки...   Feb 12 2008, 06:39
|- - VladimirYU   Цитата(Непомнящий Евгений @ Feb 12 2008, 09...   Feb 12 2008, 06:43
||- - SasaVitebsk   Цитата(Дон Амброзио @ Feb 12 2008, 23:56)...   Feb 12 2008, 21:34
||- - Дон Амброзио   Цитата(SasaVitebsk @ Feb 13 2008, 00:34) ...   Feb 12 2008, 21:44
|- - adc   Цитата(Дон Амброзио @ Feb 12 2008, 19:18)...   Feb 13 2008, 06:12
|- - Дон Амброзио   Цитата(adc @ Feb 13 2008, 09:12) Всегда п...   Feb 13 2008, 09:26
||- - adc   Цитата(Дон Амброзио @ Feb 13 2008, 12:26)...   Feb 13 2008, 09:39
||- - Дон Амброзио   Цитата(adc @ Feb 13 2008, 12:39) Как можн...   Feb 13 2008, 09:57
||- - galjoen   Цитата(Дон Амброзио @ Feb 13 2008, 12:57)...   Feb 13 2008, 10:19
||- - galjoen   Цитата(galjoen @ Feb 13 2008, 13:19) Я т...   Feb 13 2008, 10:53
||- - adc   Цитата(galjoen @ Feb 13 2008, 13:19) Цита...   Feb 13 2008, 11:25
||- - galjoen   Цитата(adc @ Feb 13 2008, 14:25) Но ведь ...   Feb 13 2008, 12:24
|- - galjoen   Цитата(adc @ Feb 13 2008, 09:12) Всегда п...   Feb 13 2008, 09:41
- - Rst7   ЦитатаНе я выбираю MCU: что мне дали, то я и юзаю ...   Feb 12 2008, 18:23
|- - Дон Амброзио   Цитата(Rst7 @ Feb 12 2008, 21:23) Если не...   Feb 12 2008, 18:50
- - arttab   хорошо что не подрались... может для начала оп...   Feb 13 2008, 02:02
- - Schtirlitz   Надо отделить мух от котлет. Ибо проблема надежнос...   Feb 13 2008, 09:31
|- - Дон Амброзио   Цитата(Schtirlitz @ Feb 13 2008, 12:31) И...   Feb 13 2008, 09:41
|- - Дон Амброзио   Цитата(Schtirlitz @ Feb 13 2008, 12:31) Н...   Feb 13 2008, 09:44
|- - Schtirlitz   Цитата(Дон Амброзио @ Feb 13 2008, 12:44)...   Feb 13 2008, 10:01
|- - Дон Амброзио   Цитата(Schtirlitz @ Feb 13 2008, 13:01) А...   Feb 13 2008, 11:14
- - mig2002   Возвращаясь к первоначальному вопросу могу посовет...   Feb 13 2008, 11:01
- - mig2002   В принципе, однозначного решения данного вопроса б...   Feb 13 2008, 11:43
|- - Дон Амброзио   Цитата(mig2002 @ Feb 13 2008, 14:43) В пр...   Feb 13 2008, 12:09
|- - mig2002   Цитата(Дон Амброзио @ Feb 13 2008, 14:09)...   Feb 13 2008, 13:20
- - Дон Амброзио   Вообще сейчас скажу крамольную мысль (только чур н...   Feb 13 2008, 12:16
- - Rst7   ЦитатаА у вас как с ЭМС? С наносекундными импульса...   Feb 13 2008, 12:50
|- - galjoen   Цитата(Rst7 @ Feb 13 2008, 15:50) У меня ...   Feb 13 2008, 14:34
|- - defunct   Цитата(galjoen @ Feb 13 2008, 16:34) Може...   Feb 13 2008, 15:12
|- - Дон Амброзио   Цитата(defunct @ Feb 13 2008, 18:12) угу,...   Feb 13 2008, 15:51
|- - defunct   Цитата(Дон Амброзио @ Feb 13 2008, 17:51)...   Feb 13 2008, 17:16
|- - Дон Амброзио   Цитата(defunct @ Feb 13 2008, 20:16) Я же...   Feb 13 2008, 18:35
|- - galjoen   Цитата(Дон Амброзио @ Feb 13 2008, 21:35)...   Feb 13 2008, 19:17
- - IgorKossak   Считаю своим долгом всем напомнить, что неплохо бы...   Feb 13 2008, 13:26
- - adnega   Недавно дорабатывал текстовое информационное табло...   Feb 13 2008, 13:50
- - defunct   ЦитатаПосле аппаратных доделок табло перестало лов...   Feb 13 2008, 14:09
- - Rst7   ЦитатаУ меня-то пластмассовый корпус 120*60*32 мм....   Feb 13 2008, 14:41
|- - galjoen   Цитата(Rst7 @ Feb 13 2008, 17:41) И в под...   Feb 13 2008, 15:53
|- - Rst7   Цитата(galjoen @ Feb 13 2008, 17:53) Объя...   Feb 14 2008, 06:25
- - Дон Амброзио   Не секрет, что стоимость простых MCU упала до стои...   Feb 14 2008, 15:56
|- - zltigo   Цитата(Дон Амброзио @ Feb 14 2008, 18:56)...   Feb 14 2008, 16:05
- - Rst7   ЦитатаСтранно.. Я читал совершенно другие "ме...   Feb 14 2008, 17:35
3 страниц V   1 2 3 >


Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 16:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01584 секунд с 7
ELECTRONIX ©2004-2016