• Nenhum resultado encontrado

3. DESENVOLVIMENTO DO SISTEMA PROPOSTO

3.3. Desenvolvimento do Sistema

3.3.4. Projeto do Software Embarcado (Nios II)

O processador Nios II está presente no hardware proposto. Desta forma é possível configurar periféricos e controlar o caminho de dados a partir de um software embarcado. Esta abordagem de processar os pixels em hardware entrega maior velocidade de processamento em relação ao uso do processador para a mesma finalidade.

O processador Nios II conta com diversas ferramentas para auxiliar o desenvolvimento de software. A principal delas é um Ambiente de Desenvolvimento Integrado (IDE - do inglês: Integrated Development Environment) baseado em

Eclipse. A Figura 50 mostra a tela do Eclipse com o projeto “camera_soc” em uso.

Figura 50 - Compilando o software embarcado no Eclipse.

Fonte: Captura de tela do Nios II SBT for Eclipse.

As principais funções do software desenvolvido são:

• Configurar parâmetros do sensor de imagem;

• Detectar eventos gerados pelo gatilho;

• Garantir a aquisição continuamente, baseada em gatilhos;

• Comandar os DMAs para operações de escrita e leitura dos dados (pixels) na memória de vídeo;

• Enviar dados para a interface de comunicação serial.

Diversos parâmetros foram utilizados para dar maior flexibilidade ao software e permitir incrementos futuros. Os parâmetros relacionados aos quadros, imagem e pixels determinam o tamanho do quadro de aquisição e o de transmissão, o tempo

de exposição do sensor, o número de quadros a ser transmitido a cada gatilho, o endereço da memória de vídeo, entre outros. Abaixo está o trecho de código correspondente aos parâmetros citados:

#define D5M_COLUMN_SIZE 2592

#define D5M_ROW_SIZE 1944

#define D5M_COLUMN_BIN 0x0000

#define D5M_ROW_BIN 0x0000

#define EXPOSURE_LIMIT 1079

#define GL_UMEMORY ALT_MEMORY_BASE

#define GL_INC_D_AD ALT_PIO_OUT_ENA_INC_D_BASE

#define GL_ENA_INC_DATA 0

#define GL_DIS_INC_DATA 1

#define GL_WIDTH 160

#define GL_HEIGHT 120

#define GL_NUM_FRAMES 1

#define GL_END_FRAME_IDENT 0x89ABCDEF

#define GL_FRAME_SIZE GL_WIDTH * GL_HEIGHT

#define GL_BUF_SIZE (GL_FRAME_SIZE*GL_NUM_FRAMES) + ((GL_NUM_FRAMES-1) * 4)

Já os parâmetros associados aos DMAs definem o modo de operação, quantidade de bytes a serem transferidos, endereços de leitura e escrita, entre outros. Abaixo está o trecho de código que define estes parâmetros:

#define VDMA_BUFFER_SIZE GLOBAL_BUFFER_SIZE

#define VDMA_VIDEO ALT_INC_DMA_NAME

#define VDMA_RD_FIFO_ADDR ALT_INC_DMA_RD_FIFO_BASE

#define VDMA_WR_MEM_ADDR ALT_INC_DMA_WR_MEM_BASE

#define VDMA_USE_MODE ALT_DMA_SET_MODE_32

#define CDMA_BUFFER_SIZE GLOBAL_BUFFER_SIZE

#define CDMA_VIDEO ALT_OUTC_DMA_NAME

#define CDMA_RD_MEM_ADDR ALT_OUTC_DMA_RD_MEM_BASE

#define CDMA_WR_FIFO_ADDR ALT_OUTC_DMA_WR_FIFO_BASE

#define CDMA_USE_MODE ALT_DMA_SET_MODE_32

Vários parâmetros estão fazendo referências a outras definições que estão no arquivo “system.h”. Este arquivo é gerado automaticamente pelo Platform Designer, justamente para facilitar o uso dos módulos instanciados na entidade “camera_soc”.

Desta forma não é necessário utilizar endereços de memória para acessar os periféricos, facilitando a alteração do sistema.

O fluxograma de operação do software embarcado do sistema “camera_soc”

está ilustrado na Figura 51.

Figura 51 - Fluxograma de execução do software embarcado.

Fonte: Do Autor.

Para configurar o tempo de exposição do sensor de imagem, foi utilizado uma função da API (do inglês Application Programming Interface, ou Interface de Programação de Aplicativos) fornecida pela Intel para acessar o Kit TRDB_5M, através da interface I²C (Inter-Integrated Circuit). As funções desta API estão declaradas no arquivo “altera_up_avalon_audio_and_video_config.h”.

Para desligar a FIFO de entrada basta configurar para nível lógico baixo o módulo “alt_pio_out_enable_incoming_data”. A função utilizada para acesso direto ao módulo foi o IOWR() que está declarada na API “io.h”.

Para configurar a interrupção gerada a partir do gatilho, foi criada a função init_inter_pio_trigger_in() que configura a máscara e o modo de interrupção para o módulo “alt_pio_in_trigger_in”. A função handle_trigger_in_interrupt() é registrada para ser o manipulador sempre que houver um evento.

Para inicializar o DMA de vídeo, foi criada a função dma_init() que faz uso da API “alt_dma.h”. Para o caso específico da arquitetura “camera_soc” a interface de leitura do DMA precisou ser configurada para ler milhares de bytes de um endereço fixo (“alt_incoming_fifo”). A interface de escrita foi configurada para escrever milhares

de bytes na memória “alt_memory”, iniciando no endereço zero e depois incrementando a cada 32 bits. As macros ALT_DMA_TX_ONLY_OFF e ALT_DMA_RX_ONLY_ON definem esse modo, respectivamente.

Depois desta etapa, o software fica aguardando um evento de interrupção.

Ocorrendo o acionamento do gatilho, a FIFO “alt_incoming_fifo” é ativada pelo sinal

“alt_pio_out_enable_incoming_data”. A função IOWR() coloca em nível lógico alto.

Como resultado, a FIFO de 2.048 bytes começa a ser preenchida pelos dados que estão trafegando no caminho dos dados. Em paralelo, a função dma_run() é chamada para ler a FIFO na quantidade de bytes correspondente ao número de quadros especificado nos parâmetros (tipicamente de um a três quadros).

Após completar a transferência dos dados para a memória de vídeo (“alt_memory”), inicia a etapa que vai ler os dados dessa memória e vai enviar a interface de comunicação (UART). Essa operação é realizada pelo DMA de comunicação que corresponde ao módulo “alt_outcoming_dma”. Então é chamada a função comDma_init() para inicializar o DMA de comunicação e em seguida a função comDma_run(). Desta forma os dados são enviados ao módulo

“custom_st_serial_controller”, que é uma UART automática, pois está sempre pronta para receber e transmitir dados, sem a necessidade de ser controlada por software.

Documentos relacionados