Pull to refresh
45
0
Лаврентий Иванов @Pugnator

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

Send message
не забывай про сопоставление сигнатур. Какой тип и прочее. Но я тут не спец, просто что читал «по верхам»
Скорее мониторинг АПЛ. Преобразования Фурье всякие с подводных микрофонов и прочее
Стекло от щёлочи становится очень хрупким со временем.
Китайская нержавейка реагирует с щёлочью неплохо. Я правда в горячей щёлочи воронил детали, но тем не менее. В ванне из AISI304 такого не наблюдалось.
Если я правильно понял, то написание эмуляторов для старых архитектур будет проще на всём этом — достаточно оформить красиво документацию к инструкциям?
Половина указанного про Lua, особенно про отсутствие continue описано в книге автора языка.
Про vararg — да, неудобно.
про индексацию с 1 — вкусовщина. Привык за полчаса
Пользуюсь активно, хех. 225732 =)
90% моих контактов — там. Почему? Скайп как-то по работе. Монструозный клиент. Там всего 1 контакт из 350 — личный.
Воцапы, вайберы — привязка к телефону. Либо телефон держать онлайн. Я не криптогик, мне это просто неудобно.
Смартфоном я мало пользуюсь. Да и бесит весь этот зоопарк клиентов. Один в вацапе, другой в вайбере, тертий вконтаче, четвертый в телеграме. Нафиг мне этот зоопарк из уведомлений.
Так что — миранда. А на смартфоне тоже стоит, жаль, что клиент на мобиле не умеет две учетки подключать — врядли это технически сложно запилить.
Что-то не нашел самое интересное — схему питания. Фильтры, DC-DC и прочее. Блок питания — самый важный узел в звуковой системе ж.
Возможно я не совсем понятно выразился. Вот есть у меня 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 или вообще что-либо. А хардкодить — некрасиво и неправильно. Хочется нормального парсера. Не бизон же с флексом прикручивать.
Эх, сделал бы кто красивый AT&T парсер с нормальной обработкой GPRS включения. Свой уже полгода пилю — сколько глюков — ужас)
Просто браузер это не совсем инструмент. инструмент выбираешь по характеристикам. Лучшее за меньшие деньги. А тут важно наличие элементов, вызывающих радость, к которым тянется рука. именно так делаются бесполезные, но радостные покупки. таким для меня был flash get, к примеру. И поэтому я до сих пор пользуюсь аськой
из свао в Балашиху 400 по пробкам. А любом такси отдал бы за 800
а что с ленточными накопителями? ведь бэкапы это тоже хранение
Как быть с ситуацией, когда видя слово, человек помнит его перевод, просто зрительно, а вот обратно через 5 секунд не вспомнит. Сужу по себе. Сейчас изучаю новый для себя язык и пытаюсь сделать себе удобный инструмент под себя именно для тренировки словарного запаса.
Читать книги это всё здорово. Но.
По той же причине системы типа anki далеко не всегда удачны. ИМХО.
лет 30, пока нынешние саларимены живы и на работе
про веб не скажу, но в целом jit сильно отстает от ванильной луа. в некоторых случаях это важно
На жки давно. не видел новых на элт, кроме совсем дешевых отечественных
bcd это обычный файл реестра, это удобная нативная база данных, зачем им изобретать новый велосипед?
В целом я делаю так.

Тут описание
Это просто идея, которая мне нравится. Я не делают время-критичных устройств и лишний 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
Я вот даже использую для этих целей статический член класса. И могу описывать прерывание внутри объекта, и каждый тип «драйвера» имеет свой обработчик. крайне читаемый код получается

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity