Про отказоустойчивость ПО для микроконтроллеров

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение Аlex »

Как я и предполагал, сплошь "магические числа" или побитовая инициализация.
Вам разьве не понятно для чего нужна данная таблица ? Где-же она магическая ? Тем более это константы, уточню, константы не для программы, а для меня. Эта таблица не изменится никогда, даже если будет меняться тип индикатора и расположение его выводов. Тогда вопрос - зачем, в моём вареанте, нужна читабельность таблицы ?
Теперь вопрос на засыпку: сколько времени понадобится Вам, чтобы переточить свою таблицу под другой вариант печатной платы или под другой индикатор? Я переделаю за минуту.
А мне 10 секунд. Достаточно передефйнить выводы в начале файла.
С компактностью кода у Вас тоже не очень - оптимизировать- ненаоптимизироваться.
Ваша процедура индикации:

Код: Выделить всё

void ind_update()
{
static char ind_num = 0;
char tmp;



ind_num ++;
if(ind_num>3) ind_num = 0;
ind_A1      =ANODE_INVERT;
ind_A2      =ANODE_INVERT;
ind_A3      =ANODE_INVERT;
ind_A4      =ANODE_INVERT;


if(ind[ind_num].A)   ind_A   =CATODE_INVERT;
else            ind_A   =!CATODE_INVERT;
if(ind[ind_num].B)    ind_B   =CATODE_INVERT;
else            ind_B   =!CATODE_INVERT;
if(ind[ind_num].C)    ind_C   =CATODE_INVERT;
else            ind_C   =!CATODE_INVERT;
if(ind[ind_num].D)   ind_D   =CATODE_INVERT;
else            ind_D   =!CATODE_INVERT;
if(ind[ind_num].E)    ind_E   =CATODE_INVERT;
else              ind_E   =!CATODE_INVERT;
if(ind[ind_num].F)    ind_F   =CATODE_INVERT;
else             ind_F   =!CATODE_INVERT;
if(ind[ind_num].G)    ind_G   =CATODE_INVERT;
else             ind_G   =!CATODE_INVERT;
if(ind[ind_num].H)    ind_H   =CATODE_INVERT;
else             ind_H   =!CATODE_INVERT;


if(ind_num==0)   ind_A1 =!ANODE_INVERT;
if(ind_num==1)   ind_A2 =!ANODE_INVERT;
if(ind_num==2)   ind_A3 =!ANODE_INVERT;
if(ind_num==3)   ind_A4 =!ANODE_INVERT;

}
Где-же она не компактна, и чего тут оптимизировать ? :shock:
Вот Ваша

Код: Выделить всё

void indikaciya(void)
{
LPC_GPIO1->DATA&=~(1<<ANODE_2|1<<ANODE_1|1<<ANODE_0);//Гашение всех разрядов
LPC_GPIO0->DATA|=(1<<SEG_a|1<<SEG_b|1<<SEG_c|1<<SEG_d|1<<SEG_e|1<<SEG_f|1<<SEG_g);
if (on_off==1)
   {
   phase++;
   if (phase>2)
      phase=0;
   if (bcd_correct==1)
      {
   switch (phase)
         {
      case 0:
         LPC_GPIO0->DATA&=segcode[bcd_temperatura[0]];
         LPC_GPIO1->DATA|=(1<<ANODE_0);
         break;
      case 1:
         LPC_GPIO0->DATA&=segcode[bcd_temperatura[1]];
         LPC_GPIO1->DATA|=(1<<ANODE_1);
         break;
      case 2:
         LPC_GPIO0->DATA&=segcode[bcd_temperatura[2]];
         LPC_GPIO1->DATA|=(1<<ANODE_2);
         break;
         }
      }
   }
}
Сравните...

А теперь покажите как Вы переточите свой вариант за 1 минуту, если выводы индикаторов будут в разнопиздицу и на разных портах. Например аноды на 3-х разных портах и катоты на 2-х разных.

Да и вообще, считаю наш с Вами спор - глупой затеей. Каждый пишет программы так, как ему хочется/привык.
А вот это я бы назвал хождением по краю обрыва, - если после сброса какой-либо регистр содержит неизвестное значение (сбросов бывает много разных видов, кстати)
Все состояния битов после сброса, прописаны в ДШ. Если там написано 0, значит будет 0. Если написано 1, значит будет 1. И не важно по какой причине произошёл сброс. Но я тоже советую "жизнено важные" биты инить в начале программы. Хотя, сам лично, иногда "грешу" :)
Реклама
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: HT PICC "умничает" - что надо настроить?

Сообщение stas00n »

Аlex писал(а): А теперь покажите как Вы переточите свой вариант за 1 минуту, если выводы индикаторов будут в разнопиздицу и на разных портах. Например аноды на 3-х разных портах и катоты на 2-х разных.
Тут да, я сдаюсь, для упрощения и ускорения кода стараюсь располагать сегменты в пределах одного порта...
Аlex писал(а): Все состояния битов после сброса, прописаны в ДШ. Если там написано 0, значит будет 0. Если написано 1, значит будет 1. И не важно по какой причине произошёл сброс.
А если внимательно посмотреть в доки:
Изображение
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение Аlex »

Тут да, я сдаюсь, для упрощения и ускорения кода стараюсь располагать сегменты в пределах одного порта...
По этому всегда приходится выбирать между оптимизацией/скоростью и возможностью быстрой переточки под другие условия. Тут никуда не денешься :?
А если внимательно посмотреть в доки:
Смотрел, и не раз :) Я имел ввиду биты с определённым значением после сброса. Ну а те, которые ХХХ, естественно нужно инить, если они необходимы. В основном такие биты не "жизнено-важны".
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: HT PICC "умничает" - что надо настроить?

Сообщение stas00n »

Кстати, таблица сегментов у Вас таки магическая. Мне совсем не очевидно почему 63 - это "0", а 125 - "6". А если захочется добавить новые символы, будет ой.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение Аlex »

почему 63 - это "0", а 125 - "6".
63 - 00111111, 125 - 01111101. Т.е 1-сегмент горит, 0-сегмент погашен. Всё очень просто. Если бы Вы добавляли в мою программу символы, Вы полюбому догадались бы :)
Я написал софтину для себя. Визуально на ней включаешь/отключаешь сегменты, а она выводит число. Это число я просто тупо вписываю в таблицу и всё. Тем более программы, которые я пишу, не для учебного материала, по этому я пишу так, как мне удобно/быстро :)
Реклама
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение testerplus »

Аlex писал(а):Все состояния битов после сброса, прописаны в ДШ. Если там написано 0, значит будет 0. Если написано 1, значит будет 1. И не важно по какой причине произошёл сброс. Но я тоже советую "жизнено важные" биты инить в начале программы. Хотя, сам лично, иногда "грешу" :)
Кстати, беда в том, что на вектор сброса можно попасть менее тривиальным путем, чем MCLR, WDT, POR, BOD и пр. Программный счетчик может измениться "случайно" и улететь туда, откуда либо пройдет через верхнюю границу памяти, либо return'ов будет выполнено больше, чем call'ов (и из стека будет извлечен 0). Путей для такого "случайного" изменения PC несколько:
1. Наносекундные помехи могут изменить состояние любого триггера (здесь угроза от попадания в сам PC, в PCLATH, в FSR, а также все уровни стека)
2. Ошибка программы (бывает и такое :), программисты тоже иногда ошибаются), приводящая либо к вызову не туда, куда надо, либо к изменению PC через косвенную адресацию.
3. Ошибка компилятора (хайтек, на мой взгляд, выдал лучший компилятор для PIC16, но и он, тем не менее, содержит ошибки), также приводящая к некорректным действиям над программным счетчиком.

И еще масса причин. Так что в начало программы можно попасть и с не предустановленными значениями SFR. Поэтому переинициализация "жизненно важных" битов - это обязательное действие (INTCON, OPTION, PCLATH, STATUS, PIEx, ADCONx и т.д.).
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение Аlex »

Нужно избегать таких "скачков" любым методом. PC может скакнуть и на адрес после инициализации этих битов, тогда смысла от её не будет ни какого.
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение testerplus »

Аlex писал(а):Нужно избегать таких "скачков" любым методом.
Так и делают. Но "любым методом" можно только снизить вероятность (вылизав электронику, проштудировав листинг на предмет косяков от компилятора и т.д.), но не сделать ее нулевой. Поэтому в системах с повышенными требованиями по отказоустойчивости применяется масса программных способов борьбы с уже "скакнувшим" PC.
PC может скакнуть и на адрес после инициализации этих битов, тогда смысла от её не будет ни какого.
Будет. Такие вещи, как инициализация, обработка WDT, бутлоадер и пр., защищаются сигнатурами, временнЫми проверками, контролем стека (где он доступен программно) и пр. Периодически ведется перепроверка настроек периферии, прерываний и узлов контроля, если это возможно (таких как WDT).

Но это, конечно, не для домашних поделок.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение Аlex »

применяется масса программных способов борьбы с уже "скакнувшим" PC.
Он может так скакануть, что никакие программные сбособы не помогут. Не вижу смысла "перемешивать" инициализацию регистров и "скачок" PC. Если скачок произошёл, значит либо программист с кривыми руками, либо инженер, разработавший железную часть и плату, сделал всё "от балды" (тобиш тоже руки из ... растут).
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение testerplus »

Аlex писал(а):Он может так скакануть, что никакие программные сбособы не помогут.
Может. Только без программных защит зона риска - вся память контроллера, а с защитами - только несколько индивидуальных адресов.
Не вижу смысла "перемешивать" инициализацию регистров и "скачок" PC. Если скачок произошёл, значит либо программист с кривыми руками, либо инженер, разработавший железную часть и плату, сделал всё "от балды".
Пускай программист криворукий и эелектронщик сделал все от балды. Но если, например, у движущегося эскалатора не сработает защита в нужный момент, то кому-то невиновному отрежет ногу. И никому дела не будет до криворукого программиста и схемотехника.

А если программист все сделал правильно, а хайтековский компилятор забыл там где надо PCLATH перед goto установить?

А если и тот и тот все сделали правильно, а прошло пять лет и в одной ячейке flash-памяти произошла утечка заряда? Причин может быть масса: даже фирменные программаторы могут прошить контроллер с ошибкой (все прошьется, все проверки пройдут, но несколько ячеек получат недозаряд, который при комнатной температуре считается корректно, а при -25C - уже будет сбоить), существуют более сложные проблемы с микроэлектроникой (электромиграция, инжекция горячих носителей в диэлектрик и т.п.), резкие перепады температур могут привести к деформации кристалла, в результате которой изменятся паразитные емкости между проводниками, что приведет к нестабильной работе на высоких скоростях.

А не видите смысла, наверное, потому что не сталкивались никогда. На западе этому уделяют очень много внимания.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение Аlex »

Зачем Вы мне рассказываете про баги вылезающие в процессе эксплуатации ? Я прекрасно это всё понимаю, и говорил, что возможность их появления нужно устранять любым путём, лишь бы они не всплывали. А если они не были устранены, значит вина отрезаной ноги лежит на разработчике.
А не видите смысла, наверное, потому что не сталкивались никогда.
Не потому, что не сталкивался, а потому что не понимаю причём тут скачок PC и инициализация. Скачок может произойти туда, где даже ни какая инициализация не спасёт, где программа просто напросто глюкнет и всё.

Ладно, мы ушли от темы, давайте завяжем это дело.... Не люблю спорить.
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение testerplus »

Аlex писал(а):Зачем Вы мне рассказываете про баги вылезающие в процессе эксплуатации ? Я прекрасно это всё понимаю, и говорил, что возможность их появления нужно устранять любым путём, лишь бы они не всплывали. А если они не были устранены, значит вина отрезаной ноги лежит на разработчике.
Вы шутите или серьезно? Как Вы себе представляете процесс доказательства его вины? И какова будет юридическая база для предъявления иска? Максимум, что будет на разработчике - это моральная ответственность, до который многим дела нет.
Не потому, что не сталкивался, а потому что не понимаю причём тут скачок PC и инициализация. Скачок может произойти туда, где даже ни какая инициализация не спасёт, где программа просто напросто глюкнет и всё.
Сбой (к примеру скачок PC) и его последствия (программа глюканет) - это не моментальное событие. Между сбоем и последствием сбоя может пройти достаточно много времени (иногда месяцы). Обнаружение этого сбоя до возникновения последствий - это и есть задача обеспечения отказоустойчивости ПО.

А инициализация здесь вот каким боком: когда сбой обнаружен (например, программа видит, что на вектор сброса попала ни одним из допустимых путей), программа что-то должна сделать. Первым из этого "что-то" и является переинициализация всех управляющих SFR (в особенности периферии и систем контроля, если есть к ним доступ). Дальше уже в зависимости от назначения устройства: либо работаем как ни в чем не бывало, либо производим программный сброс, либо переходим в безопасный режим.
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение testerplus »

Аlex писал(а):Ладно, мы ушли от темы, давайте завяжем это дело.... Не люблю спорить.
Давайте. :)
Странно, почему программисты избегают подобных дискуссий?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение Аlex »

Как Вы себе представляете процесс доказательства его вины?
Да никак. Достаточно ему об этом сказать, а совесть сделает сама своё дело.
А инициализация здесь вот каким боком: .........
Полностью с Вами согласен. Это стандартноая процедура вяснения причины сброса. Но, если в программе не используются методы сброса (WDT, сброс по питанию и т.д....), то смысла от такой проверки нет. Сбросился контроллер - значит иним все регистры заного, и пошли выполнять программу с начала. А скачок PC может произойти не обязательно в начало программы, но хрен знает куда, в то место, о котором даже и не подумаешь.
Мы, возможно, друг друга не допонимаем, по этому и хочу этут тему бросить в "нижний ящик" :)
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение testerplus »

Ну, раз Вы отвечаете, значит не так Вас эта тема и напрягает :) Только предлагаю ее вести не виде спора.
Аlex писал(а):Да никак. Достаточно ему об этом сказать, а совесть сделает сама своё дело.
Да перестаньте Вы :) Таких - единицы, а большинство скажут, что нехер ноги совать, куда попало.
Это стандартноая процедура вяснения причины сброса. Но, если в программе не используются методы сброса (WDT, сброс по питанию и т.д....), то смысла от такой проверки нет.
(Нарвеное не "методы", а "причины"?)
Само собой, я говорю о программах, которым предстоит работать в отказоустойчивых системах. Там проверка причин сброса обязательна (а вместе с ней - тестирование ROM, RAM, ADC, мультиплексора, WDT и пр.) В простых приложениях, вроде будильников, конечно не следует загружать программу проверками сверх меры.
Сбросился контроллер - значит иним все регистры заного, и пошли выполнять программу с начала. А скачок PC может произойти не обязательно в начало программы, но хрен знает куда, в то место, о котором даже и не подумаешь.
Да, может. Но вот пара примеров:
1. Если он из main() прыгает в delay() (т.е. без call), то при выполнении return вытащим из стека 0x0000
2. Если он прыгнет вообще хрен знает куда (за пределы используемой памяти ROM), то, последовательно выполняя инструкции addlw 0xFF (код 0x3FFF), неминуемо попадет на адрес 0x0000.

Не все программы можно просто начать выполнять заново (возьмите, к примеру, шлагбаум: сбой произошел во время подъема. Что делать? Поднимать, опускать или пускай висит как есть?)
Мы, возможно, друг друга не допонимаем, по этому и хочу этут тему бросить в "нижний ящик" :)
Возможно. Но я по профессии занимаюсь именно отказоустойчивостью ПО в МК (непосредственно этим около года, а до этого несколько лет занимался выискиванием ошибок в чужих программах). Могу однозначно сказать: программисты эту тему очень не любят (не только по причине непонимания, есть еще отсутствие инструментария, мотивации и пр.). Этим летом бодался с немецкой фирмой (вернее, с их программистом, чей стаж примерно равен моему возрасту) насчет того, что у него в программе отсутствует проверка работоспособности WDT при старте. Не представляете, каких трудов стоило его заставить сделать эту проверку. (Класс безопасности был таким, что эта проверка должна была там быть)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: HT PICC "умничает" - что надо настроить?

Сообщение Аlex »

Ну, раз Вы отвечаете, значит не так Вас эта тема и напрягает
Конечно нет, ни сколько не напрягает. Всегда готов выслушать мнение грамотных/опытных людей.
Только предлагаю ее вести не виде спора.
Без проблем. Тем более я не из таких, кто любит поспорить.
а большинство скажут, что нехер ноги совать, куда попало.
Скажут, но только для самоуспокоения. Но "следы" в душе всё равно остануться. И они потом, как минимум, призовут его к соторожности создания данных проектов, если не заставят совсем перестать создавать их.

Код: Выделить всё

(Нарвеное не "методы", а "причины"?)
Извеняюсь, оговорился :roll:
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: HT PICC "умничает" - что надо настроить?

Сообщение stas00n »

testerplus, Alex, очень интересные вещи обсуждаете. Я сейчас как раз работаю над проектом устройства, которое должно автономно работать не менее года, при этом при возникновении сбоя должно по возможности продолжать работу в штатном режиме. С вашего позволения переименую тему (ответ на свой первоначальный вопрос я давно получил) и с удовольствием поучаствую в дискуссии.
Аватара пользователя
mial
Друг Кота
Сообщения: 3254
Зарегистрирован: Ср янв 06, 2010 23:31:56
Откуда: Боровичи, Новг. обл.

Re: Про отказоустойчивость ПО для микроконтроллеров

Сообщение mial »

testerplus
Интересную тему затронули, не подскажите где об этом можно почитать?
Прототипы печатных плат на заказ https://radiokot.ru/forum/viewtopic.php?f=54&t=122701
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Про отказоустойчивость ПО для микроконтроллеров

Сообщение Аlex »

stas00n, можно дополнить девайс ещё одним МК. И пусть они друг с другом постоянно общаются. Как только один из них не ответил, ресетим (например по MCLR). В качестве флага сбоя (причины ресета), можно заюзать ногу МК. Т.е., например, доп. девайс смотрит за основным, основной не отвечает, он выставляет на его ноге, например 1-чку, и ресетит его по MCLR. Основное устройство в начале программы смотрит эту ногу и соответственно выполняет какое-либо действие.
Это как вариант ... :roll:
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: Про отказоустойчивость ПО для микроконтроллеров

Сообщение testerplus »

mial писал(а):testerplus
Интересную тему затронули, не подскажите где об этом можно почитать?
Литературы на русском я не знаю, хотя искал. На английском - только урывками, в виде отдельных небольших статей, посвященных какому-то конкретному аспекту. Ищите в интернете по словам в сочетании со словом embedded: reliability, safety, redundancy.

Две недели назад под Питером проводился семинар по продукции Microchip, я там выступал по этой теме (см. FLR10). Я выступал во второй части, касающейся ПО, где вскользь коснулся основных моментов. Но это только презентация, без текста "за кадром" не все будет понятно. Вне рамок остались очень важные вопросы: хранение данных во внешней памяти, загрузчик, отладка, верификация, валидация и еще много чего.

Тема очень обширна и применительно к встраиваемым системам мало где освещена. Я собираюсь подготовить цикл статей (или даже книгу оформить), но пока времени нет. Попробовал написать одну главу о WDT, получилось на 20 страниц мелким шрифтом. Но в открытую ее пока выкладывать не буду.

Настоятельно рекомендую ознакомиться со стандартами: МЭК 61508 (часть 3), МЭК 60730 (приложение H).

(Исправлено: safity -> safety)
Последний раз редактировалось testerplus Ср мар 02, 2011 12:32:07, всего редактировалось 3 раза.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»