Сообщество - Arduino & Pi

Arduino & Pi

1 527 постов 20 915 подписчиков

Популярные теги в сообществе:

18

Первый тяп-ляп на STM32 + ESP8266

  • Важное замечание, занимаюсь этим в свободное от основной деятельности время :)
    Изучаю электронику и микроконтроллеры ~2 месяца, с веб бекендом знаком относительно давно.

    Для ЛЛ: штука с которой можно отправлять сообщения на удаленный сервер (сайт), по командам что-то включать/выключать, стать успешным стримером на собственной стриминговой площадке! (точнее сказать... html страничка отображающая графику из склеенных пикселей на удаленном сервере на который они приходят от STM32).


    Видео-версия поста:

    https://rutube.ru/video/a8dc0cf622f6ba1cd9ab055a7aba4fc0/

    + Тоже самое видео только ютуб:

    https://www.youtube.com/watch?v=PIxWcxboZJY


    Попытка оформить пост в текстовом формате:
    Убедительная просьба посмотреть видео, так как писать я не умею, а нейрослоп за свой текст выдавать не хочу, да и в конкретном случае видео нагляднее.

  • Все начиналось с чтения «Чарльз Платт — Электроника для начинающих», попутно заказывая всякие непонятные штуки с Алиэкспресс, которые требуются в книге (а которые не требуются, летели в корзину заказов по принципу «дешево и прикольно выглядит», почти всё ценой до 200 р).

    Прочитав примерно половину книги, детали, которые требуются дальше, еще не успели приехать.

  • Но успели приехать: паяльный набор дурака новичка(привет синий паяльник), какой-то набор начинающего ардуинщика (как оказалось, огрызок) и куча всяких плат/флюсов и мешок электронных компонентов (начиная от таймеров, заканчивая самими нераспаянными микроконтроллерами и подложками для них).

  • Вот и решил, что помигаю светодиодом через плату, это же ненадолго... Ага.

    После мигания захотелось уже пощелкать реле через кнопку, потом попробовать вывести текст на дисплейчик двустрочный LCD1602, потом сделать импровизированный калькулятор и т. д. В конце концов я кое-как подключил уже другой экранчик 128*160 по SPI (спасибо логическому анализатору за 300 рублей) и вывел первую картинку Windows XP.

    И тут меня посетила мысль... У меня же есть джойстик! Что если поверх картинки будет другая двигаться, которой я буду управлять джойстиком?!

    Так я изобрел велосипед.

  • За этой идеей, помимо страшнючего для новичка интерфейса 3-х всадников апокалипсиса от компании ST (Cube IDE, Cube MX, Cube Programmer), меня ожидало еще и знакомство с FreeRTOS (а там и LVGL), так как на тот момент уже понимал, что дело пахнет писюнами и всё крутить в цикле на флагах не прокатит вдолгую. Хотя как я понял freeRTOS тоже цикл, но на стероидах.

    Так началось приключение длиною почти в месяц... Сопли, слезы, DMA. Короче, заработала шайтан-машина.

  • Что можно: менять цвет фона экрана, управлять яркостью ползунком (ШИМ), включать музыку, отправлять сообщения на удаленный сервер (или на локальный ПК, если указать порт), отправлять команды на запуск задач с удаленного сервера (или с локального ПК, предварительно установив импровизированное рукопожатие).Ну и конечно же, запустить стрим :)

  • На чем работает железо: LVGL графика, freeRTOS ОС (шутка про GNU), язык C (и храни господь HAL).

  • Сервер: Nginx, Docker, FastAPI (Django админка будет, наверное)

  • Что дальше? Скорее всего попытаюсь сделать что-то многофункциональное(возможно, даже полезное) и запихнуть это в плату за 100-200р ради спортивного интереса. Как дополнительный квест - утилизировать 100% времени микроконтроллера.

    А вообще хочу попробовать спроектировать свою кривую-косую плату(это же вроде ПЛИС? не?), где все будет на одном месте, а не то что stm32 -> esp8266, хотя я думал при покупке что это просто какой-то голый wifi модуль.

Первый тяп-ляп на STM32 + ESP8266
Показать полностью 1
18

Часы на ws2812b ring

Здравствуйте, изначально делал часики ради интереса но в итоге они оказались довольны удобные, поэтому остались у меня на рабочем месте.

Из компонентов:

-digispark attiny85

-DS3231

-Датчик освещенности

-Ws2812 ring 12 led

Это имитация стрелочных часов. Для удобства отметки 12, 3, 6 и 9 часов подсвечены тусклым желтым светом. Часовая стрелка реализована красным светодиодом, минутная - синим, а секундная - зеленым. Минуты и секунды отображаются с шагом в пять делений.

Яркость регулируется автоматически: днем есть хороший запас по яркости, а ночью при минимальной яркости часы не мешают и не слепят.

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

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

Корпус - вещь сугубо индивидуальная. Не придумав ничего лучше, я собрал всю конструкцию навесным монтажом на толстом медном проводе, из которого также сделал ножки. Питание через Type-C.

Ускоренное видео работы.

Показать полностью 7 1
15

Ответ на пост «Делаем из степпера геймпад для игр. Худеем и веселимся»1

Для здорового образа жизни надо играть в арму 3 (для тех кто не в курсе - типичная сессия это 2 часа бега, 5 минут в засаде, 30 секунд боя и ты убит) через это (сам облизываюсь, но пока дороговато было):
https://rutube.ru/video/67a38e583c95ed3801261d668771718d/

44

Делаем из степпера геймпад для игр. Худеем и веселимся1

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

Внутри уже есть свой шагомер, по сути можно уже подключиться к нему и отслеживать шаги на компьютере. Но тут возникают сложности. Мы получаем сигнал только тогда, когда уже совершили шаг. А мне нужно отслеживать именно движение тренажера. Как только мы остановились и сигнал должен перестать идти.
Сначала выбор пал на потенциометр с вращением.

Но как грамотно и легко его прикрутить?
Налепил для теста вот так:

Ось со стяжкой крутится, передавая вращение на потенциометр. Тьфу, ерунда какая-то получилась. Какой же тип соединения использовать? Шестерёнки? Это их отдельно на 3д принтере напечатай. Накинуть ремень? Можно, но проблематично.
И тут я увидел ползунковый потенциометр!

А тут и поршень как раз рядышком.
Ну а соединить всё это проще простого! Взял ненужную антенну от роутера и получилась вот такая страшная штука на стяжках.

Поршень стягивается и выпрямляется, а антенна двигает потенциометр. В принципе вместо антенны можно просто взять деревянную реечку. Обязательно делаем прокладку из чего-нибудь, а то поршень нагревается сильно. В дальнейшем уж придумаю занятную коробочку или железные хомуты, но для теста подойдет и так.
Теперь как передать сигнал на компьютер? При изменении данных потенциометра пусть зажимается кнопка W. Выбор пал на Pro Micro ATMEGA32U4.

Отлично эмулирует клавиатуру, да и стоит копейки. Ну и шнур на метра три прикупим. Жаль только у этой модели Micro USB. Теперь всё спаять и пишем код. Тут я не мастер и нейросеть помогла всё собрать. В комментариях оставлю схему(попробую нарисовать) и ссылки на товары(вышло в районе 800р за всё)
К сожалению записать процесс теста сложно, но могу показать как реагирует нажатие степпера в игре:

Гонки просто безумно круто играть!
Как в детстве, хочется нажать сильнее кнопку, чтоб машина ехала ещё быстрее. Тут точно так же!
Начинаешь активно шагать. Забыл сказать, что для руля используем геймпад. Клавиатуру стоя не подержишь)
Пойду тестировать остальные игры)
Я надеюсь получилось полезно и просто. Если есть идеи для улучшения, обязательно пишите!
Для лучшей активности закажу xgun и попробую побегать и пострелять.

Обязательно запишу вам инструкцию и расскажу вам об этом странном геймпаде. Спасибо за внимание! Все делал в первый раз, строго не судите)

Показать полностью 7 1
87

Автоматический полив. Схема и скетч

Продолжение поста про Автоматический полив растений своими руками

Управление максимально простое первая строка статична, вторая строка состоит и 3-ёх экранов, в которых настройка лампы, настройка 1-ого насоса (P1), настройка 2-ого насоса (P2).

Для фитолампы настраиваются время включения и выключения

Для насосов настраиваются следующие параметры:

100s - сколько секунд качает насос воду

3d(2) - период поливания 3 дня (осталось 2 дня до следующего полива, если 0 то значит сегодня)

20h - полив будет включаться в 20:00

Есть в запасе еще 3 реле, не сложно будет добавить еще экран для настройки параметров.

Автоматический полив. Схема и скетч

Схема в формате ПДФ в норм качестве - https://disk.yandex.ru/i/qEtdoScnoX2zMQ

Сам скетч такой:

#include <Wire.h>

#include "GyverEncoder.h"

#include <microDS3231.h>

#include <GyverHTU21D.h>

#include <LiquidCrystal_I2C.h>

#include <EEPROM.h>

// ПИНЫ

#define rele1 2 // Лампа

#define rele2 3 // Насос 1

#define rele3 4 // Насос 2 (добавь провод на этот пин)

#define CLK 7

#define DT 6

#define SW 5

Encoder enc1(CLK, DT, SW);

MicroDS3231 rtc;

GyverHTU21D htu;

LiquidCrystal_I2C lcd(0x27, 16, 2);

// ПЕРЕМЕННЫЕ НАСТРОЕК

int16_t a1, a2; // Лампа: a1 - старт, a2 - стоп

int16_t b1, b2, b3; // Насос 1: b1 - сек, b2 - дни, b3 - час

int16_t c1, c2, c3; // Насос 2: c1 - сек, c2 - дни, c3 - час

// СИСТЕМНЫЕ ПЕРЕМЕННЫЕ

uint8_t w = 0; // Состояние меню (0-просмотр, 1..8 - настройка)

uint8_t mode = 0; // Экран (0-LAMP, 1-P1, 2-P2)

uint32_t startDay1, startDay2; // Дни отсчета для полива

unsigned long pumpTimer1, pumpTimer2;

bool isWatering1 = false, isWatering2 = false;

bool wateredToday1 = false, wateredToday2 = false;

void setup() {

//rtc.setTime(COMPILE_TIME);

Serial.begin(9600);

htu.begin();

enc1.setType(TYPE2);

Wire.setWireTimeout(3000, true);

pinMode(rele1, OUTPUT);

pinMode(rele2, OUTPUT);

pinMode(rele3, OUTPUT);

digitalWrite(rele1, 1);

digitalWrite(rele2, 1);

digitalWrite(rele3, 1);

lcd.init();

lcd.backlight();

// ЗАГРУЗКА ИЗ EEPROM

EEPROM.get(0, a1); EEPROM.get(2, a2);

EEPROM.get(4, b1); EEPROM.get(6, b2); EEPROM.get(8, b3); EEPROM.get(10, startDay1);

EEPROM.get(14, c1); EEPROM.get(16, c2); EEPROM.get(18, c3); EEPROM.get(20, startDay2);

}

void loop() {

enc1.tick();

static uint32_t sensT;

if (millis() - sensT >= 2000) { sensT = millis(); htu.readTick(); }

handleEncoder();

static uint32_t dispT;

if (millis() - dispT >= 300) { dispT = millis(); updateDisplay(); }

controlHardware();

}

void handleEncoder() {

if (w == 0) {

// Порядок: 0 (LAMP) -> 1 (P1) -> 2 (P2)

if (enc1.isLeft()) { mode++; if (mode > 2) mode = 0; lcd.clear(); }

if (enc1.isRight()) { if (mode == 0) mode = 2; else mode--; lcd.clear(); }

if (enc1.isClick()) {

if (mode == 0) w = 1; // Настройка Лампы

else if (mode == 1) w = 3; // Настройка P1

else if (mode == 2) w = 6; // Настройка P2

}

}

else if (w == 1) {

if (enc1.isRight()) a1--; if (enc1.isLeft()) a1++;

if (a1 > 23) a1 = 0; if (a1 < 0) a1 = 23;

if (enc1.isClick()) { EEPROM.put(0, a1); w = 2; }

}

else if (w == 2) {

if (enc1.isRight()) a2--; if (enc1.isLeft()) a2++;

if (a2 > 23) a2 = 0; if (a2 < 0) a2 = 23;

if (enc1.isClick()) { EEPROM.put(2, a2); w = 0; lcd.clear(); }

}

else if (w == 3) {

if (enc1.isRight()) b1--; if (enc1.isLeft()) b1++;

if (b1 > 300) b1 = 1; if (b1 < 1) b1 = 300;

if (enc1.isClick()) { EEPROM.put(4, b1); w = 4; }

}

else if (w == 4) {

if (enc1.isRight()) b2--; if (enc1.isLeft()) b2++;

if (b2 > 9) b2 = 1; if (b2 < 1) b2 = 9;

if (enc1.isClick()) { EEPROM.put(6, b2); w = 5; }

}

else if (w == 5) {

if (enc1.isRight()) b3--; if (enc1.isLeft()) b3++;

if (b3 > 23) b3 = 0; if (b3 < 0) b3 = 23;

if (enc1.isClick()) {

startDay1 = rtc.getUnix(3) / 86400L;

EEPROM.put(10, startDay1); EEPROM.put(8, b3); w = 0; lcd.clear();

}

}

else if (w == 6) {

if (enc1.isRight()) c1--; if (enc1.isLeft()) c1++;

if (c1 > 300) c1 = 1; if (c1 < 1) c1 = 300;

if (enc1.isClick()) { EEPROM.put(14, c1); w = 7; }

}

else if (w == 7) {

if (enc1.isRight()) c2--; if (enc1.isLeft()) c2++;

if (c2 > 9) c2 = 1; if (c2 < 1) c2 = 9;

if (enc1.isClick()) { EEPROM.put(16, c2); w = 8; }

}

else if (w == 8) {

if (enc1.isRight()) c3--; if (enc1.isLeft()) c3++;

if (c3 > 23) c3 = 0; if (c3 < 0) c3 = 23;

if (enc1.isClick()) {

startDay2 = rtc.getUnix(3) / 86400L;

EEPROM.put(20, startDay2); EEPROM.put(18, c3); w = 0; lcd.clear();

}

}

}

void updateDisplay() {

int8_t hrs = rtc.getHours();

int8_t mins = rtc.getMinutes();

bool blink = (millis() / 500) % 2;

uint32_t currentDay = rtc.getUnix(3) / 86400L;

// --- ВЕРХНЯЯ СТРОКА ---

lcd.setCursor(0, 0);

if (hrs < 10) lcd.print('0'); lcd.print(hrs);

lcd.print(blink ? " " : ":");

if (mins < 10) lcd.print('0'); lcd.print(mins);

lcd.setCursor(6, 0); lcd.print("T:"); lcd.print((int)htu.getTemperature()); lcd.write(223);

lcd.setCursor(11, 0); lcd.print(" ");

lcd.setCursor(12, 0); lcd.print("H:"); lcd.print((int)htu.getHumidity());

// --- НИЖНЯЯ СТРОКА ---

// 1. РЕЖИМ ПРОСМОТРА (Главные экраны)

if (w == 0) {

lcd.setCursor(0, 1);

if (mode == 0) { // Экран LAMP

lcd.print(F("LAMP "));

if (a1 < 10) lcd.print('0'); lcd.print(a1); lcd.print(F(":00-"));

if (a2 < 10) lcd.print('0'); lcd.print(a2); lcd.print(F(":00 "));

}

else { // Экраны P1 или P2

int s = (mode == 1) ? b1 : c1;

int d = (mode == 1) ? b2 : c2;

int h = (mode == 1) ? b3 : c3;

uint32_t sd = (mode == 1) ? startDay1 : startDay2;

int daysToWait = ((currentDay - sd) % d);

lcd.print(mode == 1 ? F("P1") : F("P2"));

lcd.setCursor(2, 1); if (s < 100) lcd.print(' '); if (s < 10) lcd.print(' '); lcd.print(s); lcd.print('s');

lcd.setCursor(7, 1); lcd.print(d); lcd.print('d');

lcd.print('('); lcd.print(daysToWait); lcd.print(')');

lcd.setCursor(13, 1); if (h < 10) lcd.print('0'); lcd.print(h); lcd.print('h');

}

}

// 2. НАСТРОЙКА ЛАМПЫ (Вернули этот блок)

else if (w == 1 || w == 2) {

lcd.setCursor(0, 1);

lcd.print(F("LAMP "));

if (w == 1 && blink) lcd.print(F(" "));

else { if (a1 < 10) lcd.print('0'); lcd.print(a1); }

lcd.print(F(":00-"));

if (w == 2 && blink) lcd.print(F(" "));

else { if (a2 < 10) lcd.print('0'); lcd.print(a2); }

lcd.print(F(":00 "));

}

// 3. НАСТРОЙКА НАСОСОВ (P1: w=3-5, P2: w=6-8)

else if (w >= 3) {

bool isP1 = (w <= 5);

int s = isP1 ? b1 : c1;

int d = isP1 ? b2 : c2;

int h = isP1 ? b3 : c3;

lcd.setCursor(0, 1);

lcd.print(isP1 ? F("P1") : F("P2"));

// Сек (Позиция 2-4)

lcd.setCursor(2, 1);

if ((w == 3 || w == 6) && blink) lcd.print(F(" "));

else {

if (s < 100) lcd.print(' ');

if (s < 10) lcd.print(' ');

lcd.print(s);

}

lcd.print('s'); // Позиция 5

lcd.setCursor(7, 1);

if ((w == 4 || w == 7) && blink) {

lcd.print(F(" ")); // Один пробел для мигания одной цифры

} else {

lcd.print(d);

}

lcd.print(F("d ")); // Позиция 8

// Час запуска (Позиция 10)

lcd.setCursor(10, 1);

if ((w == 5 || w == 8) && blink) {

lcd.print(F(" "));

} else {

if (h < 10) lcd.print('0');

lcd.print(h);

}

lcd.print(F("h ")); // Очистка конца строки

}

}

void controlHardware() {

int8_t hrs = rtc.getHours();

uint32_t currentDay = rtc.getUnix(3) / 86400L;

// ЛАМПА

if (a1 < a2) digitalWrite(rele1, (hrs >= a1 && hrs < a2) ? 0 : 1);

else digitalWrite(rele1, (hrs >= a1 || hrs < a2) ? 0 : 1);

// ПОЛИВ P1

if (hrs == b3 && ((currentDay - startDay1) % b2 == 0) && !wateredToday1) {

digitalWrite(rele2, 0); pumpTimer1 = millis(); isWatering1 = true; wateredToday1 = true;

}

if (hrs != b3) wateredToday1 = false;

if (isWatering1 && (millis() - pumpTimer1 >= (unsigned long)b1 * 1000)) {

digitalWrite(rele2, 1); isWatering1 = false;

}

// ПОЛИВ P2

if (hrs == c3 && ((currentDay - startDay2) % c2 == 0) && !wateredToday2) {

digitalWrite(rele3, 0); pumpTimer2 = millis(); isWatering2 = true; wateredToday2 = true;

}

if (hrs != c3) wateredToday2 = false;

if (isWatering2 && (millis() - pumpTimer2 >= (unsigned long)c1 * 1000)) {

digitalWrite(rele3, 1); isWatering2 = false;

}

}


Всем спасибо за внимание:)

p.s. обновил схему питание насосов было от 5 В, а они на 12В

Показать полностью 1 1
47

Автоматический полив растений своими руками

Ардуино, два насоса меммбранных, шланги, куча тройникиков, и штырьки от капельного полива ну и большое желание в паре со свободным от работы временем.


Показать полностью 4
89

Как я разрабатывал отказоустойчивый Промышленный Контроллер под физические помехи.Ч2

Серия Моими разработками, соревнуюсь с Брендами в АСУ ТП

Вторая часть работы по моей разработке отказоустойчивых ПЛК.

Кто читает впервые:

Я, автор , независимый исследователь ( тот который не работает за счет фондов, институтов и организаций), разработчик SCADA системы Gatherlog.

А так же автор комплекса по разработке Промышленных Контроллеров под названием 3o|||sheet. Среда, IDE читается как Зошыт - тетрадь, но так как для компилятора и среды выполнения названия не придумал, пока все называю 3o|||sheet.

Приходится, одно и то же видео вставлять, так как люди читают, не переходя на прошлые посты, что и о чем у меня за проекты.

В прошлый раз, показал свой научный метод Дивергентного Многоверсионного Выполнения Программ для усиления ошибок, которые пропускают классические методы типа lockstep\TMR.

Суть моего метода в - декорреляции адресного пространства. Мы компилируем программу N раз (смотря сколько ядер или какую точность детекции выбрать) перемешав в памяти код: функции, блоки, и переменные. То есть, если на первом ядре функция Main будет по адресу 1000 то на втором ядре она будет по адресу 2000. Точно так же с переменными - они перемешиваются по разным местам (но не случайным образом).

В этом посте буду делать скрины из своей научной работы.

Это совершенно не влияет на ход программы. Каждое ядро, его счетчик команд, будет синхронно прыгать по своим адресам, но траектории программы - будут абсолютно одинаковы.

То есть, при корректной работе, - программы будут идентичны, а при сбое - каждое ядро будет сходить сума по своему из за декорреляции адресов. Это ключевой принцип, так как современные методы lockstep/TMR при сбое (одинаковом сбое всех ядер) сходят сума - одинаково, а значит согласовано, система не заметит сбоя. Это реальная проблема признанная в промышленности. Которую я решил.

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

В прошлом посте, были сообщения, что я все эти ошибки - придумал (радиацию, электромагнитные импульсы), и сам их победил. А в системе достаточно - таймера, который сбросит если все зависло. Так говорит - старая школа, но так было раньше. Почему старые процессоры x386 x486 выпускались 30 лет и до сих пор летают в самолетах? Грубый тех процесс более устойчив к физическим помехам (радиации и электромагнитным полям) на высоте 10 000 метров. Чувствительность современных микроконтроллеров и процессоров к физическим сбоям из за мелкого тех-процесса обсуждается, изучается и все признают эту проблему которая будет только увеличиваться.

Вот группа ученых, которые придумали и даже утверждают , что им в лаборатории удалось доказать , обход системы защиты - пин кода. Своими электромагнитами импульсами они заставили перепрыгнуть счетчик команд через 6 (шесть) инструкций который отвечал за сравнение пароля. Тестировали они на Atmega328 - обычный микроконтроллер.

В своей работе они описывают следующее:

Перевод: «С другими настройками (положением и амплитудой напряжения) мы подтвердили возможность увеличить количество последовательно пропущенных инструкций до шести»

Теперь, когда мы разобрались, что повреждение счетчика команд из за физического воздействия - не моя выдумка, а минимум выдумка еще несколько десятков профессоров,

перехожу к своей научной работе, и то как я предлагаю решать этот вопрос. В моей работе есть есть два раздела, первый - грубая диверсификация кода на уровне функций и логических блоков , о которой я выше упоминал.

Каждая функция и блок - в перемешанных адресах на каждом ядре.

Каждая функция и блок - в перемешанных адресах на каждом ядре.

Второе дополнение под названием: Detection of Small-Magnitude Program Counter Faults. Где я предложил следующий подход. Наш компилятор - вставляет пустые инструкции NOP , периодически, и сдвинуты по фазе в разных репликах(ядрах).

Что это дает, это как раз мешает - пропуску инструкций если физическое влияние "застало" счетчик команд - внутри функций. Формула указан так:

Шаг этих вставок NOP соответствует - детекции пропуску инструкций. То есть, если бы ученые пытались взломать мой ПЛК, а я бы в настройках компилятора установил шаг 6(L)/2(N) - наша система бы зафиксировала пропуск 3 и больше инструкций.

В моем ПЛК в системе есть модуль канонизации инструкций (которая выбирает - что в 32 битной инструкции, какие биты отслеживаем в траектории программы). Этот модуль инструкции NOP просто игнорирует. NOP - инструкция ничего не делает, и их вставка не влияет на программу, но - раздвигает адреса. А теперь хитрость.

Хитрость в том что, если программа идет последовательно - все ядра покажут идентичный ход выполнения. Но , если было физическое воздействие, и счетчик перепрыгнул допустим на 3 три инструкции который вкладывается в формулу :

|∆P C| ≤ l/N

смотри рисунок, одно ядро окажется на инструкции iD а второе на инструкции iE . Пропуск будет детектирован и ошибка наблюдаема.

В моем методе есть недостатки, вставка NOP - увеличивает память, и в моем компиляторе есть возможность выбирать критические участки кода где это используется:

Разная плотность NOP - разная детекция пропуска иснтрукций.

Разная плотность NOP - разная детекция пропуска иснтрукций.

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

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

Наш интерфейс. Тяжелые функциональные блоки, в тестах мы выставляли режим Detection of Small-Magnitude Program Counter Faults.

Наш интерфейс. Тяжелые функциональные блоки, в тестах мы выставляли режим Detection of Small-Magnitude Program Counter Faults.

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

В данный момент, я тестировал эти повреждения указателя программного счетчика - изменяя его программно. Система тестировалась на FPGA и исправно фиксировала каждый пропуск. На микроконтроллере это не имеет смысла так как программный счетчик - виртуальный, а этот метод может работать только в многоядерных системах или FPGA.

Тестируемые.

Тестируемые.

В следующий раз, когда вернусь к вопросу отказоустойчивости - проведем уже эксперимент с физическим воздействием.

Задавайте вопросы в комментариях и на почту zoshytlogic@gmail.com.

Не забывайте читать прошлые посты.

Показать полностью 11 2
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества