суббота, 17 марта 2018 г.

Черный список

У нас есть телефонная станция на базе Asterisk расположена в датацентре. Всякий кому не лень пытается "взломать" пароль SIP и подключится на халяву к нашей телефонной сети. Меня это беспокоит.
Статистика неумолима. до 80млн. запросов в год на подбор пароля. Это невероятно много запросов, которые захламляют лог. Такого чтобы кто-то подключился и получил телефонных услуг на халяву, не замечено.

понедельник, 5 марта 2018 г.

Виртуальная сеть для контроллера

Настраивал операционную систему. Выбирал таймеры для реализации виртуальной сети.
Нашел несколько полезных вещей, стал применять.

Таймеры на Windows. Необходимым оказалось подкручивать параметр мультимедиа таймера
Использую функцию timeBeginPeriod(wTimerRes);
Я заметил, что на нескольких разных компьютерах под управлением Windows 7 по разному ведет себя процесс отладки. Он то бежит как угорелый, символы быстро пробегают по экрану, то тормозит. Даже на одном компьютере я получил результат, что  после перезагрузки, он стал медленнее обрабатывать протокол. Замерил параметр задержки, оказалось, что вместо usleep(1000)=1мс, квант времени равняется 15мс. А у меня протокол должен работать с разрешением времени минимум 5мс. При 15мс, виртуальная сеть тормозит и вызывает таймауты в работе виртуальных устройств.

Таймеры pthread. Моя сеть должна работать на Windows, Linux и на моей операционке. Основа виртуальной сети - очередь таймерных объектов -- блоков памяти, которые доставляются в строго определенное время.
Исследовал разрешение таймеров.
clock_getres(CLOCK_MONOTONIC) возвращает 370 микросекунд. На разных процессорах эта цифра разная, но меньше 1мс.
clock_getres(CLOCK_REALTIME) возвращает 15.6мс.
Измерять время надо монотонным, иначе цифры округляются до безобразных величин.

Монотонный таймер оказался не очень то монотонным, на этом потерял целый день на отладку работы виртуальной сети и планировщика.
Чтобы сделать из монотонного таймера действительно монотонный применил такой ход:
(uint64_t)(tv_nsec + tv_sec*1000000000); Иногда в tv_nsec встречаются любые числа, неожиданные. Монотонным таймер становится только после такой операции.

 timestamp = osKernelSysTick();
 while ((uint32_t)(timestamp - tr->wait.timestamp) < tr->wait.timeout) {
     interval.tv_nsec = (tr->wait.timeout - (uint32_t)(timestamp - tr->wait.timestamp));
     clock_nanosleep(CLOCK_MONOTONIC, 0, &interval, &diff);
     timestamp = osKernelSysTick();
 }

Применил такой вариант ожидания. Ожидание применяется перед получением пакета данных.

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

void osAsyncQueuePut(osAsyncQueue_t* queue, void* data)
{
    List_t* tr = g_slice_alloc(sizeof(List_t));
    tr->data = data;
    volatile void** ptr = (volatile void**)&queue->tail;
    do {
        tr->next = atomic_pointer_get(ptr);
        atomic_mb();
    } while(!atomic_pointer_compare_and_exchange(ptr, tr->next, tr));
}

Эта операция добавляет элемент в список - вместо верхнего элемента. Список снимается в одно движение со стороны планировщика:
queue->head = atomic_pointer_exchange(&queue->tail, NULL);
Перед разбором список надо перевернуть, чтобы получить нормальный хронологический порядок.

Вот и все искусство.

среда, 28 февраля 2018 г.

Модель описания протокола, часть 2

Потратил около недели чтобы реализовать один конечный автомат из стандарта BACnet/MSTP. Хочу поделиться идеями реализации, пожаловаться на сложности. Во первых, надо сказать я его раза три написал. При том что описание получается от 300+ до 600+ строк. Это такой громадный switch() со встроенными проверками и switch() по командам протокола и ветвлением по разным признакам.

вторник, 20 февраля 2018 г.

Модель описания протокола

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

CMSIS RTOS osThread vs C11 threads.h vs pthread

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

SVG: типовые ошибки векторной графики

Изучал исходники сairographics нашел интересные места.

Векторные операции и векторная графика

В этой статье суммирую опыт перевода графического приложения на векторные операции SSE/AVX. Приложение двумерное, плоская графика. Для обработки используется упакованный double. Цель статьи обобщить опыт работы с векторными типами данных приментельно к плоской графике и показать, как можно оптимизировать операции над векторами.

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

понедельник, 19 февраля 2018 г.

Развитие концепции CMSIS RTOS

Зачем? Я пишу операционную систему. Надо. Для автоматики здания надо, для управления огромными боевыми человекоподобными роботами надо.

Чего не хватает? CMSIS RTOS -- хороше API для встроенных приложений. Но мне пришлось пересмотреть ее чуть ли не полностью, перетрясти. Я стараюсь ничего не менять. Но надо.

понедельник, 29 августа 2016 г.

HTTP сервис, что скрывается в облаках

Как правильно сказать: "Добро пожаловать в облачные технологии"?! Наверное в современной терминологии Облаком называется граница знаний, куда вас не пустили, где технологии недоступные для вашего понимая, вам даже не рассказали что это.
Моя глобальная задача -- множество устройств, которые обладают коллективным разумом.  Частная задача -- эффективное взаимодействие множества серверов в пределах видимости, в одной серверной и в одной локальной сети, в демилитаризованной зоне, где важно быстро и четко.

вторник, 9 августа 2016 г.

Обработка SVG без cairographics

Хочу поделиться идеями, почему на линуксах с Cairographics так медленно открываются окошки.
У меня есть своя библиотека обработки SVG, в которую я пытаюсь встроить SVG анимацию. В процессе работы обнаружил возможность оптимизации по скорости.

понедельник, 8 августа 2016 г.

Мои страхи. Будущее программирования.

Иногда я скатываюсь до прогнозов.

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

суббота, 16 июля 2016 г.

пятница, 1 июля 2016 г.

RTOS: как сделать мир лучше

Слова бы правильные подобрать. Изучал код TNKernel, смотрел FreeRTOS, изучал код TNeo. И тут меня пробило - надо одному единственному человеку объяснить, может остальные повторять не будут. Час пытался сформулировать, что надо объяснить. Час пытался написать письмо, что указать человеку, как не надо писать программы.

воскресенье, 10 апреля 2016 г.

CMSIS RTOS - Модель работы приложения с аппаратным ресурсом

Я проснулся с мыслью, что если никто в ближайшее время не отсканирует и не выложит в свободный доступ тонны книг по физике, физику просто забудут. Мне кажется последние 20 лет  физика умирает, двадцать лет назад казалось, что физика умирает уже 10 лет. За это время уже умерли физики, которые хоть что-то могли донести из своих знаний. Страшный сон.
Мне кажется современные физики не способны понять, что температура в степени 3/2 в уравнениях появляется только в случае, если одно уравнение подставлять в другое уравнение.


Модель работы приложения с аппаратным ресурсом.
Это не относится напрямую к RTOS. Я пытаюсь осмыслить, как работать из приложения с ресурсами контроллера, чтобы оставаться в рамках API.

среда, 16 марта 2016 г.

CMSIS RTOS - операционная система для контроллеров Cortex

Пишу операционную систему со всеми объектами типа: задач, тредов, мьютексов, семафоров и очередей. В качестве основы выбрал спецификацию CMSIS RTOS 1.02 и при необходимости расширяю ее стандартными вызовами POSIX. Уже написал рабочую версию. Работает. Хочу немного описать или попробовать описать ее достоинства.

понедельник, 27 октября 2014 г.

Solaris 11 TimeZone 26 октября 2014

"Оказалось, что правильно часы идут только на мобильном телефоне Samsung и на сетевом оборудовании Cisco, потому что они сами не переводят время и ничего не знают про энергосберегающие технологии прошлых лет. С этого года наша страна сдвинулась на пару тысяч километров в сторону Китая..." так начиналось прошлое мое сообщение о непредвиденном переводе часов на русское время.
Не прошло и трех лет нас опять передвинули из Абу-даби в Москву. Последние три года мой компьютер под виндой прожил в Абу-даби. Настала пора менять на всех серваках временную зону и часовые пояса.