neoquest: небесполезный pc speaker
DESCRIPTION
Presentation from NeoQUEST Conference about PC Speaker.TRANSCRIPT
НЕБЕСПОЛЕЗНЫЙ PC SPEAKER
Павленко Евгений Левин Дмитрий
МЕТОДЫ ОТЛАДКИОрганизационные меры
Интерактивные отладчики
Эмуляторы
Диагностические сообщения
Средства самодиагностики и самопроверки
Средства трассировки
Средства профилирования
НИЗКОУРОВНЕВАЯ ОТЛАДКАОтладка — этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки.
Использование отладчиков — инструментов, которые включают в себя интерфейс для
пошагового выполнения программы: оператор за оператором, функция
за функцией, с остановками на некоторых строках исходного кода или при достижении
определённого условия.
Вывод текущего состояния программы с помощью расположенных в критических точках программы операторов вывода —
на экран, принтер, громкоговоритель или в файл.
СЛОЖНЫЕ УСЛОВИЯ ОТЛАДКИ
PC SPEAKER РАБОТАЕТ ВСЕГДА
АППАРАТНЫЕ ОТЛАДЧИКИ
ДИАГНОСТИЧЕСКИЕ СООБЩЕНИЯ
ПОМОГАЮТ ПОНЯТЬ КАК ВЕДЕТ СЕБЯ СИСТЕМА НА САМОМ ДЕЛЕ
Диагностические сообщения через COM-порт
Диагностические сообщения в памяти
Диагностические сообщения через PC SPEAKER
ДИАГНОСТИЧЕСКИЕ СООБЩЕНИЯ — COM
ПОМОГАЮТ ПОНЯТЬ КАК ВЕДЕТ СЕБЯ СИСТЕМА НА САМОМ ДЕЛЕ
bool gdb_serial_setup( int port, int baud ){
unsigned cval;int cflag = CREAD | HUPCL | CLOCAL;int quot = 0;
switch (baud){case 115200: cflag |= B115200; break;case 9600: cflag |= B9600; break;}cflag |= CS8;quot = 115200 / gdb_baud;cval = cflag & (CSIZE | CSTOPB);cval >>= 4;if (cflag & PARENB)
cval |= UART_LCR_PARITY;if (!(cflag & PARODD))
cval |= UART_LCR_EPAR;
cval = 0x3;outportb(gdb_port + UART_LCR, cval | UART_LCR_DLAB); // set DLAB outportb(gdb_port + UART_DLL, quot & 0xff); // LS of divisor outportb(gdb_port + UART_DLM, quot >> 8); // MS of divisor outportb(gdb_port + UART_LCR, cval); // reset DLAB outportb(gdb_port + UART_IER, UART_IER_RDI); // turn on interruptsoutportb(gdb_port + UART_MCR, UART_MCR_OUT2 | UART_MCR_DTR | UART_MCR_RTS);
if (0xff == inportb(gdb_port + UART_LSR))return false;
gdb_serial_initialized = true;return true;
}
static void write_char( int chr ){
while (0 == (inportb(gdb_port + UART_LSR) & UART_LSR_THRE));
outportb(gdb_port + UART_TX, chr);}
ДИАГНОСТИЧЕСКИЕ СООБЩЕНИЯ —PC SPEAKER
ПОМОГАЮТ ПОНЯТЬ КАК ВЕДЕТ СЕБЯ СИСТЕМА НА САМОМ ДЕЛЕ, РАБОТАЮТ В ЛЮБЫХ
УСЛОВИЯХ
Программируемый таймер, генерирующий прямоугольную звуковую волну частоты, дольной 1,193 МГц, без участия центрального процессора. Это позволяет проигрывать простые одноголосые звуковые сигналы. К 1990-м годам программисты, запуская быстрые арпеджио, научились исполнять на динамике музыку, которая не вызывает отвращение.
Прямое управление мембраной через порт 61h с дискретностью в 1 бит. Подавая с большой частотой то 0, то 1, с помощью широтно-импульсной модуляции можно синтезировать низкокачественный оцифрованный звук —правда, за счёт существенного использования ресурсов процессора. Этим в своё время широко пользовались трекеры и некоторые игры (AnotherWorld, Metal Mutant).
PC SPEAKER → ARDUINO
PC SPEAKER
ОТЛАДКА С ПОМОЩЬЮ ADRUINO
СИМВОЛЫ КОДИРУЮТСЯ НАПРЯЖЕНИЕМ, ОЧЕНЬ ПРОСТАЯ РЕАЛИЗАЦИЯ, 1 СИМВОЛ В СЕКУНДУ
ИСХОДНЫЙ КОД#define TR_ARDUINO_PCSPK_0 50
#define TR_ARDUINO_PCSPK_1 100
#define TR_ARDUINO_PCSPK_AFTER_BIT 50
#define TR_ARDUINO_PCSPK_AFTER_BYTE 100
void dbg_pcspk_send_byte( char a, int(*dbg_ard_send_bit)(int), int delay )
{
unsigned char buf[8] =
{!!(a & 0x1), !!(a & 0x2), !!(a & 0x4), !!(a & 0x8), !!(a & 0x10), !!(a & 0x20), !!(a & 0x40), !!(a & 0x80)};
for (int i = 0; i < sizeof(buf); i++)
{
dbg_ard_send_bit(buf[i]);
}
dbg_delay(delay);
}
extern "C" void dbg_pcspk_disable() {
unsigned char tmp = inportb(0x61);tmp &= 0xFC;outportb(0x61, tmp);
}
extern "C" void dbg_pcspk_enable() {
unsigned char tmp = inportb(0x61);tmp |= 2;outportb(0x61, tmp);
}
int dbg_ard_send_bit(int b){
dbg_pcspk_enable();dbg_delay(b ? TR_ARDUINO_PCSPK_1 :
TR_ARDUINO_PCSPK_0);dbg_pcspk_disable();dbg_delay(TR_ARDUINO_PCSPK_AFTER_BIT);
}
void trDbgPrintBuf_ard( const char *p_str){
char c = *p_str;
while(c){
dbg_pcspk_send_byte(c, dbg_ard_send_bit, TR_ARDUINO_PCSPK_AFTER_BYTE);
p_str++;c = *p_str;
}}
PC SPEAKER → СИНТЕЗ РЕЧИ
PC SPEAKER
СИНТЕЗ РЕЧИПример преобразования фразы:1) Исходная фраза – «James Bond 007.»2) Замена цифр и знаков препинания – «James Bond zero
zero seven dot»3) Разбиение на фонемы – «J-A-M-EZ B-UH-N-D Z-EH-R-
AH Z-EH-R-AH S-EE-V-EH-N D-OH-T»
ТРУДНАЯ РЕАЛИЗАЦИЯ, НЕ ОЧЕНЬ ПОНЯТНО ГОВОРИТ,
ИНТЕРЕСНО И ОЧЕНЬ СМЕШНО
ВНИМАНИЕ! КОНКУРС!
PC SPEAKER → MIC
PC SPEAKER
ОТЛАДКА ЧЕРЕЗ МИКРОФОН
БЫСТРЕЕ, ЧЕМ ARDUINO; СЛОЖНЕЕ, ЧЕМ ARDUINO; НЕОБХОДИМА СИНХРТОНИЗАЦИЯ; НЕ ТРЕБУЕТСЯ ARDUINO
РАЗБИЕНИЕ ПОТОКА НА БЛОКИ
ВЫДЕЛЕНИЕ СИНХРОПОСЫЛКИ И ОПРЕДЕЛЕНИЕ ПАРАМЕТРОВ
ДЕКОДИРОВАНИЕ ИНФОРМАЦИИ
ИСХОДНЫЙ КОД#define TR_MIC_PCSPK_0 1
#define TR_MIC_PCSPK_1 3
#define TR_MIC_PCSPK_AFTER_BIT 4
#define TR_MIC_PCSPK_AFTER_BYTE 8
#define TR_MIC_PCSPK_FREQ_0 1000
#define TR_MIC_PCSPK_FREQ_1 333
void trDbgMicSendSync()
{
for (int I = 0; I < 16; I++)
{
dbg_pcspk_send_byte('-', dbg_mic_send_bit, TR_MIC_PCSPK_AFTER_BYTE);
}
}
int dbg_mic_send_bit(int b){
if (b){
dbg_sound_play(TR_MIC_PCSPK_FREQ_1);
dbg_delay(TR_MIC_PCSPK_1);}else{
dbg_sound_play(TR_MIC_PCSPK_FREQ_0);
dbg_delay(TR_MIC_PCSPK_0);}dbg_sound_stop();
dbg_delay(TR_MIC_PCSPK_AFTER_BIT);}
void dbg_pcspk_send_byte( char a, int (*send_bit)(int), int delay ){
unsigned char buf[8] = {!!(a & 0x1), !!(a & 0x2), !!(a & 0x4), !!(a & 0x8), !!(a & 0x10), !!(a & 0x20),
!!(a & 0x40), !!(a & 0x80)};for (int i = 0; i < sizeof(buf); i++){
send_bit(buf[i]);}dbg_delay(delay);
}
void trDbgPrintBuf_mic(const char *p_str){
char c = *p_str;while (c){
dbg_pcspk_send_byte(c, dbg_mic_send_bit,TR_MIC_PCSPK_AFTER_BYTE);
p_str++;c = *p_str;
}}
PC SPEAKER → ВОЗДУХ → MIC
PC SPEAKER
ВЗГЛЯД С ДРУГОЙ СТОРОНЫЗащищенный ПК на
котором выключен USB, WiFi, LAN и т.д.
ВЫВОДЫ PC SPEAKER — незаменимая вещь для отладки в экстремальных
условиях.
Четыре варианта отладки через PC SPEAKER:
С использованием Arduino;
Синтез речи;
По проводу с использованием микрофона;
По воздуху с использованием микрофона.
Через PC SPEAKER можно скрытно передавать информацию по воздуху.