воскресенье, 29 ноября 2009 г.

Пишем драйвер для лампочки=) Часть 1.

Хочу описать собственную идею (возможно она не нова), по которой я собираюсь создавать драйверы для различных аппаратных модулей, микросхем и тп.. Базируется она на основе использования статических библиотек, которые будут подключаться к основному проекту и представлять собой драйвер для какого-нибудь отдельно взятого модуля. Статическую библиотеку предлагаю писать на ассемблере, с целью сокращения объёма кода а также получения наивысшей производительности=) Такая библиотека, подключённая к основному проекту будет занимать минимум, при этом останется больше свободного места в памяти МК для написания основной логики.

В качестве примера можно рассмотреть тривиальный пример - драйвер для лампочки (индикатора). Данный пример подходит только для демонстрации самой идеи, а не её практического применения. Лампочка уж слишком простая вещь чтобы для неё писать целый драйвер. А вообще хотелось бы написать таковые для ЖК-дисплея, микросхемы ds1307, да много чего можно ещё придумать:) Главное желание, и свободное время. С последним у меня пока проблемы... Итак, приступим!

Подготовительная часть
1) Необходимо установить в систему пакеты gcc-avr, binutils-avr, и avr-libc. (если ещё не были установлены)
2) Вкратце изучить документацию по avr-libc. Там содержится очень много интересного(:
3) Создать папку для основного проекта, у меня это ~/hard_project.
4) Создать папку для проекта библиотеки, у меня это ~/hard_project/libdrv.

Написание библиотеки
Основной файл будет иметь следующее содержание:
;; файл ~/hard_project/libdrv/leddrv.S:
#include <avr/io.h>
#include "conf.h"

.global led_init ; void led_init()
; предварительная настройка порта
led_init:
  sbi _SFR_IO_ADDR(LED_DDR),LED_NPIN ; установить ножку на вывод данных
  ret

.global led_on ; void led_on()
; включение лампочки
led_on:
  sbi _SFR_IO_ADDR(LED_PORT),LED_NPIN ; записать логическую 1 в порт
  ret

.global led_off ; void led_off()
; выключение лампочки
led_off:
  cbi _SFR_IO_ADDR(LED_PORT),LED_NPIN ; записать логический 0 в порт
  ret

.global led_blink ; void led_blink(uint16_t f)
; мигание лампочки с заданной частотой
led_blink:
  sbi _SFR_IO_ADDR(LED_PORT),LED_NPIN ; записать логическую 1 в порт
  push r24
  push r25
  rcall delay ; задержать выполнение
  cbi _SFR_IO_ADDR(LED_PORT),LED_NPIN ; записать логический 0 в порт
  pop r25
  pop r24
  rcall delay ; задержать выполнение
  ret

; задержка на заданное значение
delay: ; до 770*65535/F_CPU, сек
   clr r0
0: com r0
1: dec r0
    brne 1b
    sbiw r24,1
    brne 0b ; 770 тактов за цикл
    ret

Здесь первый параметр для функции led_blink будет передаваться через регистр r24:r25, согласно соглашениям компилятора avr-gcc. Далее, заголовочный файл будет иметь следующее содержание:
// файл ~/hard_project/libdrv/leddrv.h:
#include <stdint.h>
#ifdef F_CPU
#define led_blink_ms(x) led_blink(((x)*(uint64_t)F_CPU)/(770*1000ul))
#endif

void led_init();
void led_on();
void led_off();
void led_blink(uint16_t f);

Здесь определён макрос led_blink_ms для удобства. При его вызове нужно указывать значение в миллисекундах, в отличии от led_blink, в которой указывается значение в условных единицах =) Последний файл проекта будет иметь следующее содержание:
// файл ~/hard_project/libdrv/conf.h:
#define LED_PORT PORTC
#define LED_DDR  DDRC
#define LED_NPIN PC1

Ну здесь наверное понятно, указываются параметры порта и ножки на которой будет сидеть лампочка =)

Это всё. Теперь необходимо собрать нашу бибиотеку. Упрощённую версию Makefile для сборки проекта можно скачать тут. Скомандовав в консоли, я и получил целевой файл libleddrv.a:
$Make
avr-gcc -Wall -x assembler-with-cpp -mmcu=atmega168 -o .leddrv.o -c leddrv.S
avr-ar rcs libleddrv.a .leddrv.o

В следующий раз я покажу как использовал эту библиотеку в своём проекте=)

---
Скачать исходники libdrv.tar.gz

среда, 18 ноября 2009 г.

Программа IBCrypt v1.00

IBCrypt - программа реализующая возможность шифрования информации с использованием блочного алгоритма на основе сети Фейштеля.
С использованием IBCrypt можно зашифровывать и расшифровывать файлы, а также простые текстовые сообщения написанные во встроенном текстовом редакторе. Более подбробно сведения об алгоритме шифрования описаны в справочном руководстве. Программа является моей курсовой работой по курсу «Информационная безопасность».

  

Лицензия: GNU GPL v3. Программа написана с использованием библиотеки Qt4

Скачать (с rapidshare.de):
  • Версия для GNU/Linux, с включёнными зависимостями: (i686, amd64)
  • Пакет для Arch Linux (i686, amd64)
  • Пакет для Debian/Ubuntu (i686, amd64)
  • Версия для Windows
  • Исходный код
Скачать (с альтернативного источника):
  • Версия для GNU/Linux, с включёнными зависимостями: (i686, amd64)
  • Пакет для Arch Linux (i686, amd64)
  • Пакет для Debian/Ubuntu (i686, amd64)
  • Версия для Windows
  • Исходный код

вторник, 17 ноября 2009 г.

Этот мир сошёл с ума...

Недавно я узнал что существуют девушки которые увлекаются (да именно увлекаются!) микроконтроллерами, юниксами, и си++. При этом они внешне выглядят вполне себе симпатично, как обычные девушки..

А если представить себе такую жену? Сидишь с ней знач в одной комнате. Она за ноутом пишет операционку для 8-битного AVR... Ну а ты рядом за другим ноутом, клепаешь PKGBUILD для своей недавно написанной на Си супернавороченной проги... Общаешься с ней через жабир, типа эта - "Жена, жрать хочу, давай заканчивай там..." :-D

Всё, нет пути. Мы все скоро умрём..

Мои впечатления о Chromium..

Давно хотел сменить браузер. Долгое время использовал оперу, и меня она устраивала. Она быстро работала, и хорошо интегрировалась с KDE/Oxygen при помощи темы opera_oxygen_project. Но в последнее время стала меня раздражать своими глюками. Во-первых: почему-то стало не возможным переход по ссылке до тех пор пока страница не загрузится. В соседних вкладках происходили так же подобные артефакты. Во-вторых: иногда происходили проблемы с отображением страницы - текст за текст налазил. Ну и в третьих: если долго не чистить историю, то со временем опера начинала жутко тормозить. Кроме того, шрифты без предварительного шаманства в настройках выглядили просто ужасно. Всё это меня достало. Файрфокс хоть и хорош своей расширяемостью, он очень плохо интегрируется с KDE. Да меня бы и устраивал Konqueror, если бы не пожирал огромное количество памяти..

Поэтому, решил я попробовать Chromium от гугла. И не пожалел. Загружается за 1-2сек. на моём нетбуке Acer One. Очень лёгкий, прорисовка страниц работает очень быстро. Глюков пока не заметил. Памяти жрёт приемлемо, но не больше чем опера. Есть конечно и некоторые минусы - шрифты уж слишком размазывает (может как-то лечиться?), ну и выглядит не настолько нативно как мне хотелось бы. И ещё меня насторожила вот эта ссылка, в которой сказано что Chromium отсылает "лишнюю" информацию гуглу. В связи с этим был создан проект Iron, который является форком хромиума, и с которого удалён "плохой" код. Будем на это надеятся...


понедельник, 16 ноября 2009 г.

Программа MMixMulator

MMixMulator - симулятор компьютера MMIX. Представляет собой интегрированную среду, способную эмулировать поведение компьютера MMIX, архитектура которого описывается в книге Д. Кнута "Искусство программирования". Составляющими компонентами MMixMulator являются: компилятор ассемблера MMIX (mmixas), интерпретатор машинного кода (mmixex), и среда для разработки приложений (mmixbuger).
  • MMixBuger - среда для разработки приложений MMIX. Представляет собой программу, имеющую графический интерфейс, которая содержит редактор кода с подсветкой синтаксиса, обозреватель памяти, регистров общего и специального назначения, встроенный отладчик. С помощью данной среды, программа MMIX может быть составлена, скомпилирована и выполнена. Результат выполнения отображается в командной строке (консоли). Программа может быть отлажена по шагам, точкам останова.
  • MMixAS - ассемблер, совместимый с тем который описывается в книге Кнута (при этом некоторые фишки не поддерживаются на данный момент)
  • MMixEx - интепретатор машинного кода MMIX. Позволяет запускать программы скомпилированные при помощи MMIX-ассемблера.

Также стоит отметить, что на данный момент отсутствует поддержка инструкций с плавающей точкой, TRIP, и ещё нескольких не особо важных=) MMixMulator - это тема моего дипломного проекта. Документация находится в процессе написания присутствует.
Лицензия: GNU GPL v3. Программа написана с использованием библиотеки Qt4

Скачать:

четверг, 15 октября 2009 г.

Программа «Я Труп» v1.0!)

Однажды, холодными зимними буднями, меня попросили создать программу.. и не то чтобы просили, просто умоляли. Браться за работу я не очень то и хотел, но сжалился перед человеком, тем более что просили сделать не безвозмездно. Я был четвёртым программистом который за неё взялся, как я в последствии об этом узнал.
Работёнка предстояла сложная и для меня не привычная - надо было написать программу которая моделирует поведение устройства, конкретно устройства оперативного регулирования напряжения. Данное устройство описывалось в кандидатской работе заказчика, так что мне пришлось ещё в неё вникать. Там почти голая математика, работа с комплексными числами, многомерными матрицами, и при этом огромные по объёму расчёты которые программа должна была вычислять.
Создавалась сия програмка очень медленно, мешала учёба и основная работа в которой я работал...
В один прекрасный солнечный денёк, меня сильно обругал заказчик, и пригрозил мне сделать "ахтунг" если я не потороплюсь)) Тогда и родилось такое замечательное название к программе:) Пришлось делать..
Через два года, и с большими перерывами, работа над программой всё-таки была завершена.
О программе
Программа была написана на языке Си и Си++. Внешний вид показан на следующих рисунках:

 
Вкратце, принцип действия таков: При помощи редактора конфигурации вводятся исходные параметры системы. Затем после нажатия кнопки "Начать вычисления" происходят различные расчёты и моделирование (используя механизм псевдослучайных чисел). Результат работы сохраняется в виде отчёта в формате pdf, где содержаться различные результаты промежуточных вычислений, и графики.
Промежуточные вычисления в удобочитаемом формате, а также графики и конвертирование в pdf производятся при помощи утилит latex, gnuplot, и dvipdf, поэтому программа требует наличие в системе установленных пакетов gnuplot, texlive, и texlive-langcyrillic.
Лицензия: GNU GPL v3. Программа написана с использованием библиотеки Qt4.

Скачать (с rapidshare.de):
Скачать (с альтернативного источника):Пример генерируемого файла отчёта можно посмотреть здесь

вторник, 10 марта 2009 г.

Решение проблемы с модулем CGI::Ajax при передаче символов "+" и "%"

Наткнулся на один неприятный баг в данном модуле для Perl. Например есть вот такой код:
#!/usr/bin/perl -w
use strict;
use CGI; # or any other CGI:: form handler/decoder
use CGI::Ajax;

my $cgi = new CGI;
my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );
print $pjx->build_html( $cgi, \&Show_HTML);

sub perl_func {
 return( join("<br>",@_) );
}

sub Show_HTML {
 my $html = <<EOHTML;
 <HTML>
 <BODY>
  Enter something: 
  <input type="text" id="val">
  <input type="button" onclick='exported_func(["val"],["resultdiv"])' value="Do!"/>
  <br>
  <div id="resultdiv"></div>
 </BODY>
 </HTML>
EOHTML
 return $html;
}


Так вот, если запустить этот Perl-скрипт из браузера, ввести в поле ввода "плохую" строку вроде "text % text + text", нажать кнопку "Do!" мы не увидим знака "+" в "resultdiv".

Есть решение, в нашем примере, после строки:
 my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );

нужно добавить:
 $pjx->js_encode_function('encodeURIComponent');

В таком случае, при вводе в поле "+", мы получим "+", но если добавить/заменить "+" на "%" то ничего не получим. Кроме того, браузер выдаст различные ошибки JavaScript.

Методом копания в исходниках CGI::Ajax, была обнаружено что неполадки возникают при попытке повторного раскодирования запрошенной строки. Файл /usr/share/perl5/CGI/Ajax.pm, строка 942:

<...>
 pjxInitialized : function(){},
 pjxCompleted : function(){},
 readyState4 : function(){
  var rsp = $decodefn(this.r.responseText); /* the response from perl */
  var splitval = '__pjx__'; /* to split text */
  /* fix IE problems with undef values in an Array getting squashed*/
  rsp = rsp.replace(splitval+splitval+'g',splitval+" "+splitval);
  var data = rsp.split(splitval);

<...>

В данном куске кода строка:
  var rsp = $decodefn(this.r.responseText); /* the response from perl */
должна быть заменена на:
 var rsp = this.r.responseText; /* the response from perl */

А также в нашем примере, после строки:
 my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );

нужно добавить:
 $pjx->js_encode_function('encodeURIComponent');

И ошибка будет решена! :-)