Как стать автором
Обновить
45
0
Лаврентий Иванов @Pugnator

Пользователь

Китай сделал новый ход в гонке суперкомпьютеров

не забывай про сопоставление сигнатур. Какой тип и прочее. Но я тут не спец, просто что читал «по верхам»

Китай сделал новый ход в гонке суперкомпьютеров

Скорее мониторинг АПЛ. Преобразования Фурье всякие с подводных микрофонов и прочее

DIY порошок для посудомойки: как не растворить посуду и не повторить моих ошибок. Год экспериментов

Стекло от щёлочи становится очень хрупким со временем.
Китайская нержавейка реагирует с щёлочью неплохо. Я правда в горячей щёлочи воронил детали, но тем не менее. В ванне из AISI304 такого не наблюдалось.

Архитектура ассемблера Go

Если я правильно понял, то написание эмуляторов для старых архитектур будет проще на всём этом — достаточно оформить красиво документацию к инструкциям?

Ваш язык программирования — отстой

Половина указанного про Lua, особенно про отсутствие continue описано в книге автора языка.
Про vararg — да, неудобно.
про индексацию с 1 — вкусовщина. Привык за полчаса

ICQ: 20 лет — не предел

Пользуюсь активно, хех. 225732 =)
90% моих контактов — там. Почему? Скайп как-то по работе. Монструозный клиент. Там всего 1 контакт из 350 — личный.
Воцапы, вайберы — привязка к телефону. Либо телефон держать онлайн. Я не криптогик, мне это просто неудобно.
Смартфоном я мало пользуюсь. Да и бесит весь этот зоопарк клиентов. Один в вацапе, другой в вайбере, тертий вконтаче, четвертый в телеграме. Нафиг мне этот зоопарк из уведомлений.
Так что — миранда. А на смартфоне тоже стоит, жаль, что клиент на мобиле не умеет две учетки подключать — врядли это технически сложно запилить.

Как сделать процессорный звук в Жигулях

Что-то не нашел самое интересное — схему питания. Фильтры, DC-DC и прочее. Блок питания — самый важный узел в звуковой системе ж.

STM32F405: прошить 400кб за 10 секунд или быстрый UART-загрузчик заточенный под USB-UART, размером менее 4 килобайт

Возможно я не совсем понятно выразился. Вот есть у меня UART стек в ядре, к примеру. Поверх него кладется более высокоуровневый стек, например, GSM, GPS и так далее. С GPS все просто. Всё строго определено стандартами.
С GSM все сложнее. Мало того, что у разных производителей (не одним SIMcom мы живы) команды отличаются, так что самое важное — нет четкого способа отличить конец команды, служебное сообщение. Ну вот например, что я пытаюсь делать. Давно уже не писал — времени не хватает. Функция
bool Modem::wait_for_reply(CMD::ATCMD cmd, ATRESPONSE expected, word timeout)

https://github.com/Pugnator/CoreTex/blob/HAL/firmware/src/drivers/wireless/gsm/atcmd.cc

Это как-то работает, и то неоптимально. Но как быть при переключении в GPRS? Как отделять? как ждать.
Была бы статья. где на пальцах рассказывалось. как правильно ждать и обрабатывать AT команды, как ожидать ответа и прочее.
Описания команд есть в даташитах, да. Но многие команды не возвращают OK или вообще что-либо. А хардкодить — некрасиво и неправильно. Хочется нормального парсера. Не бизон же с флексом прикручивать.

STM32F405: прошить 400кб за 10 секунд или быстрый UART-загрузчик заточенный под USB-UART, размером менее 4 килобайт

Эх, сделал бы кто красивый AT&T парсер с нормальной обработкой GPRS включения. Свой уже полгода пилю — сколько глюков — ужас)

Никогда не сдавайся: как Netscape вел неравную борьбу с Internet Explorer

Просто браузер это не совсем инструмент. инструмент выбираешь по характеристикам. Лучшее за меньшие деньги. А тут важно наличие элементов, вызывающих радость, к которым тянется рука. именно так делаются бесполезные, но радостные покупки. таким для меня был flash get, к примеру. И поэтому я до сих пор пользуюсь аськой

Основатель Uber Трэвис Каланик — «мятежник в элите Кремниевой долины»

из свао в Балашиху 400 по пробкам. А любом такси отдал бы за 800

Перспективы рынка хранения данных

а что с ленточными накопителями? ведь бэкапы это тоже хранение

Сосчитать незримое: достоверно определяем словарный запаc

Как быть с ситуацией, когда видя слово, человек помнит его перевод, просто зрительно, а вот обратно через 5 секунд не вспомнит. Сужу по себе. Сейчас изучаю новый для себя язык и пытаюсь сделать себе удобный инструмент под себя именно для тренировки словарного запаса.
Читать книги это всё здорово. Но.
По той же причине системы типа anki далеко не всегда удачны. ИМХО.

Отключение аналогового спутникового ТВ: 4 года спустя (часть 2)

лет 30, пока нынешние саларимены живы и на работе

Lua микро-фреймворк на Apache

про веб не скажу, но в целом jit сильно отстает от ванильной луа. в некоторых случаях это важно

Квантовый скачок

На жки давно. не видел новых на элт, кроме совсем дешевых отечественных

Миграция Windows между BIOS <-> UEFI

bcd это обычный файл реестра, это удобная нативная база данных, зачем им изобретать новый велосипед?

Динамическое управление прерываниями в ARM

В целом я делаю так.

Тут описание
Это просто идея, которая мне нравится. Я не делают время-критичных устройств и лишний call-другой мне погоду не делает.
Как мне кажется, каждый такой «драйвер» получается крайне читаемым с точки зрения алгоритма работы. Но это лишь мое мнение

К примеру, у нас есть класс для уарт.
  class Uart
  {
  public:
    Uart (short ch, word bd, bool doinit);
    Uart (short ch, word bd, word isrptr = 0);
    ~Uart(void);

    static class Uart *self;
    static void isr (void);
    //тут какой-то код
  protected:
    //тут всякое разное
    USART_TypeDef* Reg;
  };


static class Uart *self;

Данный указатель на себя нужен для того, чтобы получить доступ к самому классу изнутри статической функции — нашего обработчика прерываний. Так как хоть привязки к классу нет, но статический метод имеет доступ к другим статическим членам класса.
USART_TypeDef* Reg
Является указателем на нужный нам регистр нужного порта для автоматизации.
В инициализации он устанавливается через блок switch, к примеру, так:
__disable_irq();
self = this;
....
switch (channel)
.....
Reg = (USART_TypeDef*) USART1_BASE;
IRQ_VECTOR_TABLE[USART1_IRQn + IRQ0_EX] = isrptr;
....
init();
__enable_irq();


Где наш обработчик выглядит так
class Uart *Uart::self = nullptr;

...


void Uart::isr(void)
  {
    if (self->Reg->SR & USART_SR_RXNE) //receive
      {
        self->Reg->SR &= ~USART_SR_RXNE;
      }
    else if (self->Reg->SR & USART_SR_TC) //transfer
      {
        self->Reg->SR &= ~USART_SR_TC;
      }
  }


Это наш базовый placeholder, тут можно выполнять нужные нам действия.
Теперь мы поверх этого класса наследуемся, скажем, в класс GPS

class Gps: public Uart
{
public:
	Gps(short ch, word bd) :
			Uart::Uart(ch, bd, (word) &gpsisr)
	{
		Gps::self = this;
	}
	static void gpsisr(void);
	static class Gps *self;
};


Спокойно пишем свой обработчик внутри GPS класса

void Gps::gpsisr(void)
{
	if (self->Reg->SR & USART_SR_RXNE)
	{
		short a = self->Reg->DR;
		self->Reg->SR &= ~USART_SR_RXNE;
		if (self->ready)
		{
			return;
		}

		if (0 == self->nmeastr_len && '$' != a)
		{
			return;
		}	
.....................И.Т.Д.
	}
}


Каждый объект — устройство, работающий поверх UART при создании ставят свой обработчик в таблицу прерываний, сохраняя предыдущее значение. В деструкторе восстанавливают предыдущее состояние.

Всё то же самое для SPI, I2C, DMA и прочих SDIO

Динамическое управление прерываниями в ARM

Я вот даже использую для этих целей статический член класса. И могу описывать прерывание внутри объекта, и каждый тип «драйвера» имеет свой обработчик. крайне читаемый код получается

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность