Июл 12

Немного указательных трюков AVR

Очень и очень часто приходится манипулировать кучей никак не связанных между собой пинов, вот и возникают куча дифайнов и прочей лабуды.
Есть довольно простое решение, немного тормознее, чем хардкод, и память кушает, но много удобнее.
В принципе, ничего нового для программистов я не скажу, а вот для тех у кого в голове ARDUINO, будет полезно
Оформляем структуру в которой будем хранить пины:

1
2
3
4
typedef struct {
    volatile uint8_t *port;
    uint8_t pin;
} out_t;

а дальше создаем массив этих структур:

1
2
3
4
out_t outs = {
 { &PORTA, PA1},
 { &PORTB, PB4},
};

ну и так далее. Получается удобно проходить в цикле.

1
2
3
4
uint8_t i;
for(i=0;i<sizeof(outs)/sizeof(out_t);i++){
 *outs[i].port |= _BV(outs[i].pin);
}

ну и как бонус — инициализация. в AVR регистр направления DDRx всегда на 1 байт младше, чем соответствующий PORTx, получается небольшой трюк:

1
2
3
4
uint8_t i;
for(i=0;i<sizeof(outs)/sizeof(out_t);i++){
 *(outs[i].port-1) |= _BV(outs[i].pin);
}
  • инициализация на выход всего массива. Это много медленнее, чем одной операцией проставить все нужные пины, но если время не критично — поддерживать такой код порядком проще: добавили запись в массив — и готово.
    Да, чтобы не тратить память, можно все это хранить в PROGMEM и доставать по необходимости.

ну и еще напоследок, удобный макрос от разработчиков ядра Linux для ловли багов:

1
2
3
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
// и его применение
BUILD_BUG_ON(sizeof(phs_entry_t) != sizeof(uint32_t));

если структура phs_entry_t размером не равна uint32_t (32 бита) — код не соберется

Июн 03

Откат iOS8 beta

После того, как все поигрались, потеряли сеть итд, хочется обратно нормальной стабильной работы.
Откатывать как обычно:

  1. Подключаем к компьютеру
  2. Вводим телефон в режим DFU: удерживаем Home+Power 10 секунд (экран отключится), отпускаем Power, и ждем еще 10 секунд, отпускаем Home
  3. iTunes найдет телефон в режиме восстановления и предложит поставить на него текущий релиз iOS (на сейчас это 7.1.1) — устанавливаем
  4. После завершения установки, будет предложено восстановить из резервной копии (вы ведь сделали её?)
  5. Ждем более стабильной беты
Мар 18

Kinamania.com

Не так давно Павел Гринёв (aka Kinaman) запустил таки сайт о страшных, но ностальгичных 90х.

Тем кто провел детство в эту ужасную эпоху — крайне рекомендуется посетить ресурс:
kinamania.com

А еще можно посмотреть его замечательный фильм «Проклятие серого слонёнка»

Янв 26

Триколор HD и GS-8306

Плюсов (кроме HD, которое все же работает) нет.
Недостатки в огромных количествах:

  • Реклама при переключении между каналами, отключить нельзя. Страшная, стыдно перед телевизором, за то, что заставляю его показывать это. Про себя молчу.
  • Светодиод в режиме ожидания ночью освещает комнату лучше, чем солнце днем. Можно было бы книжки читать, если бы он при этом еще не мерцал.
  • Смотреть можно только триколор, ручного поиска каналов нет. А еще «ресивером» называют.
  • Зависает. Помогает только выключить-подождать-включить из розетки.
  • Тормозит. Регулировка громкости не сразу отзывается. Про остальное молчу
  • Функционал на нуле. Даже каналы по собственым предпочтениям выстроить нельзя. («Избранное» после обновления списка каналов обнуляется)
  • И самое главное: через месяц редкого использования отгорел HDMI. Теперь и HD нет. Причем не только у меня.

За 10к можно было бы купить приличный ресивер, Dr.hd f15 с DRE модулем, например.
Это самая глупая трата денег в моей жизни. Даже когда кошелек (с порядком большей суммой) потерял — сожалел много меньше.

Янв 11

wvPDF и русский язык

Для полного щастья поставить пакеты texlive (не только -base), texlive-lang-cyrillic
и подредактировать файл
/usr/share/wv/wvLaTeX.xml
изменив в нем

\usepackage[latin1]{inputenc}

на

\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}

После чего конвертирование начинает работать. Но адекватности ожидать все равно не приходится