27.11.2014 Views

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

phreaking<br />

ЕСЛИ НАУЧИШЬСЯ РИСОВАТЬ СИМВОЛЫ, СМОЖЕШЬ ДЕЛАТЬ ЗАБАВНЫЕ АНИМАЦИИ. ЭТО — ПАКМЕН<br />

ВЫВОДИМ, ЧТО ИГРАЕТ В ВИНАМПЕ<br />

с АВРками. Мы используем прерывания, поэтому подключаем и<br />

«interrupt.h».<br />

Хедер «hd44780.h» нужен для работы с дисплеем. В нем описаны<br />

прототипы функций обмена данными с контроллером HD44780.<br />

Рекомендую изучить их самостоятельно; посмотри также файл<br />

«hd44780.c», в котором описаны сами функции. Это и есть готовый<br />

модуль, о котором я писал выше. В статье нет места, чтобы<br />

рассказывать, как он работает, но на диске ты его найдешь.<br />

Открой даташит по дисплею, сравни с функциями и пойми, как<br />

они устроены.<br />

Определим глобальные переменные:<br />

Определяем глобальные переменные<br />

volatile char buf[200]; // Áóôåð<br />

volatile int bufsize = 0; // Äëèíà ñòðîêè<br />

volatile char ready = 0; // Ïîëó÷åíà ëè ñòðîêà?<br />

Массив «buf» — это буфер, куда складываем получаемую строку;<br />

«bufsize» — длина строки (увеличиваем эту переменную с каждым полученным<br />

байтом). А «ready» — это просто флаг, который будет указывать,<br />

получена ли строка полностью.<br />

Но я не просто так выбрал именно этот пример! Тут есть один<br />

хитрый момент. Обрати внимание на директиву «volatile».<br />

Сейчас я тебе расскажу про очень популярную ошибку среди<br />

новичков, чтобы ты ее не повторял. Дело в том, что у компилятора<br />

Си очень хитрый оптимизатор, но им надо уметь пользоваться.<br />

Если в коде встречается условие, которое ну никак не<br />

выполнится, по мнению компилятора, то оптимизатор легко<br />

может вырезать его из программы. Такое условие, например,<br />

— изменение переменной, которая не меняется в коде программы.<br />

Но ведь эта глобальная переменная может изменяться по<br />

прерыванию! Вот директива «volatile» и указывает именно на<br />

то, что переменная может непроизвольно изменяться внешними<br />

силами. Далее я покажу пример именно такого кода. Опишем<br />

функцию-прерывание.<br />

XÀÊÅÐ 07 /127/ 09<br />

WINAVR ОТЛИЧНО РАБОТАЕТ В СОЧЕТАНИИ С AVR<br />

STUDIO<br />

Обработчик прерывания<br />

ISR(USART_RXC_vect)<br />

{<br />

int b;<br />

b = UDR; // Ïîëó÷àåì ýòè äàííûå<br />

if (((b == 13) || (b == 10))<br />

&& (bufsize > 0)) ready = 1;<br />

if ((b != 13) && (b != 10)<br />

&& (bufsize < sizeof(buf)-1))<br />

buf[bufsize++] = b;<br />

}<br />

Здесь ты уже должен все понимать. Получаем один байт данных. Если<br />

это не символ завершения строки, то заносим его в массив и увеличиваем<br />

счетчик длины строки; иначе пишем в переменную «ready» единицу,<br />

107

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!