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

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

В прошлый раз я писал как создавал драйвер для лампочки. Эта часть будет посвящена тому как я использовал свой драйвер в отдельном проекте.

Написание основного проекта
Свой проект я разместил в папке ~/hard_project, основной и единственный файл которого имеет следующее содержание:
// файл ~/hard_project/libdrv/main.c
#define F_CPU 16000000UL /* тактовая частота МК */
#include "leddrv/leddrv.h"

int main(void)
{
  led_init(); // инициализация лампочки
  for (;;) // бесконечный цикл
    led_blink_ms(500); // мигнуть с частотой 0,5сек
}
Этот код настолько прост и понятен что в дополнительных комментариях и не нуждается.

Упрощённую версию Makefile для сборки проекта можно скачать тут. Скомандовав в консоли, я и получил целевой hex файл:
$ make
avr-gcc -g -Wall -O2 -mmcu=atmega168 -o .main.o -c main.c
avr-gcc -g -Wall -O2 -mmcu=atmega168  -o .main.elf .main.o -static -Lleddrv/ -lleddrv
avr-objcopy -j .text -j .data -O ihex .main.elf main.hex

А затем и прошил свой МК:
$ make program
avrdude -v -c dapa -p atmega168 -P /dev/parport0 -b 115200 -U flash:w:main.hex

И вот оно, о чудо - работает!



Итог
Всё круто! Цель достигнута. В моих планах написать аналогичные библиотеки для ЖК-модуля и датчика температуры. Надеюсь это произойдёт в недалёкой перспективе:)

---
Скачать hard_project.tar.gz

воскресенье, 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

Скачать: