Стекло от щёлочи становится очень хрупким со временем.
Китайская нержавейка реагирует с щёлочью неплохо. Я правда в горячей щёлочи воронил детали, но тем не менее. В ванне из AISI304 такого не наблюдалось.
Если я правильно понял, то написание эмуляторов для старых архитектур будет проще на всём этом — достаточно оформить красиво документацию к инструкциям?
Половина указанного про Lua, особенно про отсутствие continue описано в книге автора языка.
Про vararg — да, неудобно.
про индексацию с 1 — вкусовщина. Привык за полчаса
Пользуюсь активно, хех. 225732 =)
90% моих контактов — там. Почему? Скайп как-то по работе. Монструозный клиент. Там всего 1 контакт из 350 — личный.
Воцапы, вайберы — привязка к телефону. Либо телефон держать онлайн. Я не криптогик, мне это просто неудобно.
Смартфоном я мало пользуюсь. Да и бесит весь этот зоопарк клиентов. Один в вацапе, другой в вайбере, тертий вконтаче, четвертый в телеграме. Нафиг мне этот зоопарк из уведомлений.
Так что — миранда. А на смартфоне тоже стоит, жаль, что клиент на мобиле не умеет две учетки подключать — врядли это технически сложно запилить.
Возможно я не совсем понятно выразился. Вот есть у меня UART стек в ядре, к примеру. Поверх него кладется более высокоуровневый стек, например, GSM, GPS и так далее. С GPS все просто. Всё строго определено стандартами.
С GSM все сложнее. Мало того, что у разных производителей (не одним SIMcom мы живы) команды отличаются, так что самое важное — нет четкого способа отличить конец команды, служебное сообщение. Ну вот например, что я пытаюсь делать. Давно уже не писал — времени не хватает. Функция
bool Modem::wait_for_reply(CMD::ATCMD cmd, ATRESPONSE expected, word timeout)
Это как-то работает, и то неоптимально. Но как быть при переключении в GPRS? Как отделять? как ждать.
Была бы статья. где на пальцах рассказывалось. как правильно ждать и обрабатывать AT команды, как ожидать ответа и прочее.
Описания команд есть в даташитах, да. Но многие команды не возвращают OK или вообще что-либо. А хардкодить — некрасиво и неправильно. Хочется нормального парсера. Не бизон же с флексом прикручивать.
Просто браузер это не совсем инструмент. инструмент выбираешь по характеристикам. Лучшее за меньшие деньги. А тут важно наличие элементов, вызывающих радость, к которым тянется рука. именно так делаются бесполезные, но радостные покупки. таким для меня был flash get, к примеру. И поэтому я до сих пор пользуюсь аськой
Как быть с ситуацией, когда видя слово, человек помнит его перевод, просто зрительно, а вот обратно через 5 секунд не вспомнит. Сужу по себе. Сейчас изучаю новый для себя язык и пытаюсь сделать себе удобный инструмент под себя именно для тренировки словарного запаса.
Читать книги это всё здорово. Но.
По той же причине системы типа anki далеко не всегда удачны. ИМХО.
Это просто идея, которая мне нравится. Я не делают время-критичных устройств и лишний 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, к примеру, так:
Это наш базовый 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 при создании ставят свой обработчик в таблицу прерываний, сохраняя предыдущее значение. В деструкторе восстанавливают предыдущее состояние.
Я вот даже использую для этих целей статический член класса. И могу описывать прерывание внутри объекта, и каждый тип «драйвера» имеет свой обработчик. крайне читаемый код получается
Китай сделал новый ход в гонке суперкомпьютеров
Китай сделал новый ход в гонке суперкомпьютеров
DIY порошок для посудомойки: как не растворить посуду и не повторить моих ошибок. Год экспериментов
DIY порошок для посудомойки: как не растворить посуду и не повторить моих ошибок. Год экспериментов
Китайская нержавейка реагирует с щёлочью неплохо. Я правда в горячей щёлочи воронил детали, но тем не менее. В ванне из AISI304 такого не наблюдалось.
Архитектура ассемблера Go
Ваш язык программирования — отстой
Про vararg — да, неудобно.
про индексацию с 1 — вкусовщина. Привык за полчаса
ICQ: 20 лет — не предел
90% моих контактов — там. Почему? Скайп как-то по работе. Монструозный клиент. Там всего 1 контакт из 350 — личный.
Воцапы, вайберы — привязка к телефону. Либо телефон держать онлайн. Я не криптогик, мне это просто неудобно.
Смартфоном я мало пользуюсь. Да и бесит весь этот зоопарк клиентов. Один в вацапе, другой в вайбере, тертий вконтаче, четвертый в телеграме. Нафиг мне этот зоопарк из уведомлений.
Так что — миранда. А на смартфоне тоже стоит, жаль, что клиент на мобиле не умеет две учетки подключать — врядли это технически сложно запилить.
Как сделать процессорный звук в Жигулях
STM32F405: прошить 400кб за 10 секунд или быстрый UART-загрузчик заточенный под USB-UART, размером менее 4 килобайт
С GSM все сложнее. Мало того, что у разных производителей (не одним SIMcom мы живы) команды отличаются, так что самое важное — нет четкого способа отличить конец команды, служебное сообщение. Ну вот например, что я пытаюсь делать. Давно уже не писал — времени не хватает. Функция
https://github.com/Pugnator/CoreTex/blob/HAL/firmware/src/drivers/wireless/gsm/atcmd.cc
Это как-то работает, и то неоптимально. Но как быть при переключении в GPRS? Как отделять? как ждать.
Была бы статья. где на пальцах рассказывалось. как правильно ждать и обрабатывать AT команды, как ожидать ответа и прочее.
Описания команд есть в даташитах, да. Но многие команды не возвращают OK или вообще что-либо. А хардкодить — некрасиво и неправильно. Хочется нормального парсера. Не бизон же с флексом прикручивать.
STM32F405: прошить 400кб за 10 секунд или быстрый UART-загрузчик заточенный под USB-UART, размером менее 4 килобайт
Никогда не сдавайся: как Netscape вел неравную борьбу с Internet Explorer
Основатель Uber Трэвис Каланик — «мятежник в элите Кремниевой долины»
Перспективы рынка хранения данных
Сосчитать незримое: достоверно определяем словарный запаc
Читать книги это всё здорово. Но.
По той же причине системы типа anki далеко не всегда удачны. ИМХО.
Отключение аналогового спутникового ТВ: 4 года спустя (часть 2)
Lua микро-фреймворк на Apache
Квантовый скачок
Миграция Windows между BIOS <-> UEFI
Динамическое управление прерываниями в ARM
Как мне кажется, каждый такой «драйвер» получается крайне читаемым с точки зрения алгоритма работы. Но это лишь мое мнение
К примеру, у нас есть класс для уарт.
Данный указатель на себя нужен для того, чтобы получить доступ к самому классу изнутри статической функции — нашего обработчика прерываний. Так как хоть привязки к классу нет, но статический метод имеет доступ к другим статическим членам класса.
Является указателем на нужный нам регистр нужного порта для автоматизации.
В инициализации он устанавливается через блок switch, к примеру, так:
Где наш обработчик выглядит так
Это наш базовый placeholder, тут можно выполнять нужные нам действия.
Теперь мы поверх этого класса наследуемся, скажем, в класс GPS
Спокойно пишем свой обработчик внутри GPS класса
Каждый объект — устройство, работающий поверх UART при создании ставят свой обработчик в таблицу прерываний, сохраняя предыдущее значение. В деструкторе восстанавливают предыдущее состояние.
Всё то же самое для SPI, I2C, DMA и прочих SDIO
Динамическое управление прерываниями в ARM