Category: компьютеры

Category was added automatically. Read all entries about "компьютеры".

ZX Spectrum, продолжение.

Сегодня я устроил холивар на одном из каналов телеграмма с тематикой железа под Спектрум.

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

Буду ли я дальше что-то делать в своем проекте для Спектрум сообщества? Наверное да, но больше не для них, а ради себя, не зря же я купил 300 рублевую сетевую карту за 3 тысячи. Просто для того, чтобы показать, что мой проект может работать даже на Спектруме, пусть и частично.

И да, про Спектрум я не забыл. Где-то через пару недель ко мне придет сетевая карта для него.
Ось и среду разработки я уже приметил.
Первое, что я сделаю - это управление устройствами через telnet или http.

Есть другая мега задача - велосипед - свой GUI с логической частью на удаленном сервере, что-то типа тонкого клиента. И при чем тут Sun Microsystems если я даже не читал о подобном решении?...
Да, есть задумка реализовать функционал тонкого клиента на разные устройства, но это большая работа, и выполняться будет неспеша. Зато я смогу любое свое решение размещать под любую ос или железку.

core5277, логирование

Сразу несколько изменений.

  Ранее логирование было вынесено в виде драйвера, при этом часть кода находилась в ядре.
Скорость UART логирования в порт(BAUDRATE) была 115200, что сулило большие проблемы так как при передаче октета прерывания запрещались.
Удобство было не очень, например часто приходилось писать конструкции вида:

LDI YH,high(_CORE5277_TEXT_STARTED)|0x80 ;ROM
LDI YL,low(_CORE5277_TEXT_STARTED)
MCALL CORE5277_LOG



Теперь так:
1) В основном файле проекта необходимо объявить LOGGING_PORT:
.SET    LOGGING_PORT                            = (PORTC<<4)|PC0
  После чего, в инициализации ядра произойдет подгрузка файла с функционалом для логирования и инициализация логирования.
  Если LOGGING_PORT не объявлять, то файл подгружен не будет, но все метки для логирования будут также доступны, и мы сэкономим сотни байт ПЗУ.

2) Скорость UART для логирования теперь 460800. При передачи байта прерывания также запрещаются, но теперь на передачу байта требуется ~22 микросекунды. Таймер к примеру тикает каждые 50 микросекунд. Т.е. в теории времени вполне достаточно для логирования и прерываний.

3) Добавлены процедуры логирования символа, байта, слова, строки, строки из ПЗУ.
Теперь предыдущий пример выглядит так:
LOG_ROM _LOGSTR_CORE_STARTED

4) В процессе монитор - процедура позволяющая логировать состояние задач и ядра. К приеру, при перезагрузки контроллера, если включено логирование, мы получим вот такой дамп:

---COREDUMP:
TID:01 STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:02 STA:84 RAM:03E1.13 STK:0B13.00 VRS:00000000000000000000000000000000
TID:03 STA:84 RAM:03F4.39 STK:0C21.00 VRS:00000000000000000000000000000000
TID:04 STA:84 RAM:0000.00 STK:0CE5.00 VRS:05040000000000000000000000000000
TID:05 STA:84 RAM:0000.00 STK:0DB9.00 VRS:04000000000000000000000000000000
TID:06 STA:84 RAM:0000.00 STK:0E5E.00 VRS:D0041201139E4A042D80000000000000
TID:07 STA:84 RAM:042D.13 STK:0F31.00 VRS:16252412062006000000000000000000
TID:08 STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:09 STA:03 RAM:0000.00 STK:08A4.1B VRS:53503A303846430D0A00200000000000
TID:0A STA:03 RAM:0000.00 STK:0889.17 VRS:00000000000000000000000000000000
TID:0B STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:0C STA:03 RAM:0000.00 STK:08BF.1B VRS:00000000000000000000000000000000
TID:0D STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:0E STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:0F STA:03 RAM:0440.0C STK:0872.1E VRS:00000000000000000000000000000000
TID:10 STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:11 STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:12 STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:13 STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:14 STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:15 STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:16 STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
TID:17 STA:00 RAM:0000.00 STK:0000.00 VRS:00000000000000000000000000000000
---DONE


В нем видно:
- номер задачи и ее состояние,
- адрес выделенной динамической памяти и ее размер,
- адрес стека и его размер ,
- дамп 16 байт переменных.

Пока так, потом будет больше полезной информации.

Вот кстати, как пример, часть кода монитора:
...
    LOG_ROM _LOGSTR_COREDUMP
    LDI LOOP_CNTR,0x01
_LOG_COREDUMP__TASK_LOOP:
    LOG_ROM LOGSTR_NEW_LINE

    MOV TEMP,LOOP_CNTR
    LOG_ROM _LOGSTR_TID
    MCALL LOG_BYTE
    LOG_ROM LOGSTR_SPACE

    MOV TEMP,LOOP_CNTR
    MCALL _CORE5277_TASK_HEADER_GET

    LDD TEMP,Z+_CORE5277_TASK_STATE
    LOG_ROM _LOGSTR_STATE
    MCALL LOG_BYTE
    LOG_ROM LOGSTR_SPACE

    LDD TEMP_H,Z+_CORE5277_TASK_RAM_OFFSET+0x00
    LDD TEMP_L,Z+_CORE5277_TASK_RAM_OFFSET+0x01
    LDD TEMP,Z+_CORE5277_TASK_RAM_SIZE
    LOG_ROM _LOGSTR_RAM
    MCALL LOG_WORD
    LOG_ROM LOGSTR_DOT
    MCALL LOG_BYTE
    LOG_ROM LOGSTR_SPACE
    ...



update:
  У драйвера нет собственного стека, он работает в стеке вызванной задачи. В мониторе STK драйвера указывает на точку входа в драйвер после инициализации. Различить драйвер от задачи можно по старшему биту в STA.

core5277, продолжение

Небольшое обновление.

Я столкнулся с критической ошибкой в своем ядре. Пришел к выводу, что метод резервирования памяти драйвера(при его инициализации) работает не корректно. Из-за этой причины я не могу закончить пару драйверов.
Поэтому пришлось увеличить заголовок задачи с 10 байт до 13, и приступить к реализации динамического выделения памяти(мелочь, а приятно). Здесь как обычно, ничего нового, просто еще один велосипед. Запланировано три метода ядра - переопределение объема выделенной памяти(изменение размера), выделение дополнительной памяти и освобождение эннного количества байт. При этом, задача или драйвер всегда будет знать сколько памяти ему выделено из заголовка задачи/драйвера. Ну и теперь задача тоже сможет выделять себе память.

Я еще у меня в руках модуль Dipex'а  SIM868 с переферией:
- 1x DS18B20
- 2x I2C EEPROM(вроде на 32KB каждая)
- 1x RS232
- 1x I2C DS3231(часы реального времени)
- 1x RS485
- BK-868 v2.1(2x SIM модуль)

Хорошая борда для реализации драйвера выделения внешней памяти(EEPROM), драйвера часов реального времени и работы с SIM модулем посредством AT комманд.
Кстати, по сути, на этой железке будет задйствовано 2 устройства на I2C шине и 4 UART'а, при этом встроенный только один.

Кстати, как оказалось, не так давно на Speccy появилась достойная ОСь - NedoOS и сетевая карта ZXNetUSB.
Куда мир катится? Как с такими решениями Intel, Microsoft и Google будут шпионить за пользователями? Там ведь, даже в процессор шпиона не встроишь.

А что это за плата скрипит?...

А палата эта разрабатывалась для аквариумистов. Пока не готов софт, свое ядро мне сильно в этом поможет.

Плата имеет функционал:
1) Диммер ламп накаливания(220В)
2) 3 канала 220В(вкл/выкл)
3) 3 канала до 24В(для светодиодных ламп, в том числе RGB)
4) Порт подключения датчика температуры ds18b20
5) Цифровой порт подключения. Например для датчика уровня воды
6) Бипер, для звуковой сигнализации
7) Порт расширения для модуля Wi-Fi, Bluetooth и т.д.
8) Часы реального времени
9) Порт расширения, например для клавиатуры и дисплея
10) Порт RS485 для настройки и подключения к проекту 5277.ru(который даст широкий функционал по большинству перечисленных пунктов)

Новый функционал, краткий очерк.

Пока мир сходит с ума, я понемногу починяю примус.

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



1) Облако
2) Прямое подключение к контроллеру
3) Новое - прямое подключение к устройствам.

Немного о третьем варианте.

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

А еще мне попали в руки устройства продающиеся под брендом Xiaomi. Пара разных WiFi розеток, WiFi цветная лампа и Bluetooth датчик температуры и влажности. Все устройства введены в проект и работают. Работают как в локальной сети так и в облаке без серверов Xiaomi.





А еще у меня наконец-то дошли руки до инсталлятора под windows, оно даже работает. Там же лежит apk для Андроида.

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



Значительно снижена нагрузка на процессор в контроллере, а также пофиксены многие мелкие баги.

И честно говоря хрен знает что еще я забыл сказать. Это не важно, важно то, что я до сих пор вкладываю в свое детище силы и время.


Близится время когда клиент полетит китайцам, производящим всяческое дешевое железо без стоящего ПО.
Будет весело.

МЕТКА: Не забыть закупить попкорна.

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

P.P.S А это так, просто тестовый проект в Технопарке 'Русский'(ДВФУ)

JSON зло

Потоковый парсинг нескольких десятков килобайт JSON на мини компьютере отработал за несколько десятков секунд в режиме процессора OnDemand.

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

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

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

В итоге я создал свой протокол, который в текстовом виде выглядит как JSON, но передача информации осуществляется чисто в бинарном виде, что значительно упрощает его парсинг.

Новый функционал, сценарии.

Сегодня я ввел возможность запускать по сценарию исполняемые файлы или просто выполнять команды операционной системы внутри процесса контроллера.
Фича достаточно просто реализуется, но тем не менее очень полезна.

К примеру:
Я могу создать несколько сценариев, причиной запуска которых будет недоступность контроллера(со стороны сервера).
первый, срабатывает через 3 минуты, его задача проинформировать
второй, срабатывает через 15 минут, его задача перезапустить сеть(как раз на базе нового функционала)
третий, срабатывает через 20 минут, он полностью перезагрузит компьютер с контроллером.

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