BMSTU/01-ess-lab-01-report.tex

136 lines
8.5 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\documentclass{article}
\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
\makeReportTitle{лабораторной}{1}{Создание простой системы в Platform Designer \\ в пакете Quartus Prime}{Программное обеспечение встроенных систем}{}{доцент кафедры ИУ-3 \\ Федоров С.В.}
\newpage
\blankpage
\pagestyle{fancy}
% \tableofcontents
% \newpage
\section*{Цель работы}
\addcontentsline{toc}{section}{Цель работы}
Изучить средства создания систем на кристалле на основе процессора Nios II фирмы Intel в средстве Platfrom Designer. Освоить методику создания и конфигурации систем на кристалле. Реализовать и отладить программное обеспечение системы на кристалле. Освоить методику отладки проекта с применением программных и аппаратных средств. Получить навыки работы с документацией производителя.
\section*{Задания}
\begin{enumerate}
\item Модифицируйте исходную программу следующим образом: нажатие кнопки KEY3 должно зажигать все светодиоды, KEY0 гасить все светодиоды, нажатие центральных кнопок KEY2 и KEY1 должно гасить светодиоды по очереди слева и справа по одному на каждое нажатие.
\item Реализуйте обработку нажатия кнопок и формирование значений на светодиодах по прерыванию. Используйте справочные материалы в каталоге лабораторной работы.
\end{enumerate}
\section*{Листинги программ}
\textbf{Программа по заданию 1} (изменения выделены красным цветом, комментарии приведены и выделены зеленым). для сдвига влево или вправо используется оператор >>, а для наложения полученного значения на текущие обжуленные биты побитовая маска \& с последующим присваиванием обратно в переменную led:
\begin{lstlisting}[language=C,style=CCodeStyle]
#include <stdio.h>
#include <unistd.h>
#include "altera_avalon_pio_regs.h"
#include "system.h"
<@\texttt{\textcolor{codecomments}{// Value read from button PIO when no buttons pressed}}@>
#define NONE_PRESSED 0xF
<@\texttt{\textcolor{codecomments}{// Time in microseconds to wait for switch debounce}}@>
#define DEBOUNCE 30000
int main(void) {
#define KEY_3 0x7
#define KEY_2 0xB
#define KEY_1 0xD
#define KEY_0 0xE
int buttons;
int led = 0x01;
IOWR_ALTERA_AVALON_PIO_DATA(GREEN_LED_BASE,led);
while (1) {
buttons = IORD_ALTERA_AVALON_PIO_DATA(BUTTONS_BASE);
if (buttons != NONE_PRESSED) {
<@\texttt{\textcolor{red}{switch(buttons) \{}}@>
<@\texttt{\textcolor{red}{case KEY\_3:}}@>
<@\texttt{\textcolor{red}{led = 0xFF;}\textcolor{codecomments}{ // all bits 1}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_2:}}@>
<@\texttt{\textcolor{red}{led \&= led >> 1;}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_1:}}@>
<@\texttt{\textcolor{red}{led \&= led << 1;}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_0:}}@>
<@\texttt{\textcolor{red}{led = 0x00;}\textcolor{codecomments}{ // all bits 0}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{\}}}@>
IOWR_ALTERA_AVALON_PIO_DATA(GREEN_LED_BASE,led);
usleep (DEBOUNCE);
while (buttons != NONE_PRESSED)
buttons = IORD_ALTERA_AVALON_PIO_DATA(BUTTONS_BASE);
usleep (DEBOUNCE);
}
}
} // end
\end{lstlisting}
\textbf{Программа по заданию 2.} Структура программы: обработчик прерывания от кнопок (в нем считываются задетектированные нажатия кнопок), подпрограмма регистрации обработчика прерывания и главная программа, которая вызывает подпрограмму регистрации и управляет состоянием светодиодов. Во всех функциях использовались макроконстанты, объявленные в заголовочных файлах \code{system.h} и \code{altera\_avalon\_pio\_regs.h}, хранящих адреса соответствующих инструкций и данных. Также был добавлен заголовочный файл \code{sys/alt\_irq.h}. Адреса изменились, потому что теперь это не значения на кнопках (1 для свободной, 0 для нажатой), а значения в регистре прерываний (1 для места, где сработало прерывание).
\begin{lstlisting}[language=C,style=CCodeStyle]
#include <stdio.h>
#include <unistd.h>
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"
#include "system.h"
#define NONE_PRESSED 0xF
<@\texttt{\textcolor{red}{\#define KEY\_3 0x8}}@>
<@\texttt{\textcolor{red}{\#define KEY\_2 0x4}}@>
<@\texttt{\textcolor{red}{\#define KEY\_1 0x2}}@>
<@\texttt{\textcolor{red}{\#define KEY\_0 0x1}}@>
#define DEBOUNCE 30000
volatile int edge_capture; //from docs
void handle_button_interrupts(void* context, alt_u32 id) {
volatile int* edge_capture_ptr = (volatile int*) context;
*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(<@\texttt{\textcolor{red}{BUTTONS\_BASE}}@>);
// Сбросили флажки зарегистрированного прерывания
<@\texttt{\textcolor{red}{IOWR\_ALTERA\_AVALON\_PIO\_EDGE\_CAP}}@>(BUTTONS_BASE, 0x0);
IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTONS_BASE);
}
void init_button_pio() {
// from docs
void* edge_capture_ptr = (void*) &edge_capture; // для формирования передаваемого в
прерывание контекста
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTONS_BASE, 0xf);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTONS_BASE, 0x0);
alt_ic_isr_register(BUTTONS_IRQ_INTERRUPT_CONTROLLER_ID,
BUTTONS_IRQ
handle_button_interrupts,
edge_capture_ptr, 0x0);
}
int main(void) {
int led = 0x01;
printf("Simple\n");
IOWR_ALTERA_AVALON_PIO_DATA(GREEN_LED_BASE,led);
init_button_pio();
<@\texttt{\textcolor{red}{edge\_capture = 0;} \textcolor{codecomments}{// инициализация}}@>
<@\texttt{\textcolor{red}{while (1) \{}}@>
<@\texttt{\textcolor{red}{if (edge\_capture != 0) \{} \textcolor{codecomments}{// Если переменная была изменена (случилось прерывание)}}@>
<@\texttt{\textcolor{red}{switch(edge\_capture) \{}}@>
<@\texttt{\textcolor{red}{case KEY\_3:}}@>
<@\texttt{\textcolor{red}{led = 0xFF;}\textcolor{codecomments}{ // all bits 1}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_2:}}@>
<@\texttt{\textcolor{red}{led \&= led >> 1;}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_1:}}@>
<@\texttt{\textcolor{red}{led \&= led << 1;}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{case KEY\_0:}}@>
<@\texttt{\textcolor{red}{led = 0x00;}\textcolor{codecomments}{ // all bits 0}}@>
<@\texttt{\textcolor{red}{break;}}@>
<@\texttt{\textcolor{red}{\}}}@>
IOWR_ALTERA_AVALON_PIO_DATA(GREEN_LED_BASE,led);
edge_capture = 0; <@\texttt{\textcolor{codecomments}{// сбросили глобальную переменную наличия данных от периферии}}@>
}
}
}
\end{lstlisting}
\end{document}