Projeto final desenvolvido para a disciplina de Organização de Computadores e Linguagens de Montagem II do curso de Engenharia de Computação da UFC Quixadá.
Este repositório contém a implementação bare-metal de um Interpretador de Comandos (CLI) em linguagem Assembly para a placa BeagleBone Black (arquitetura ARM Cortex-A8). O sistema comunica-se via terminal serial (UART0), aguarda a entrada de comandos pelo usuário e executa ações diretamente no hardware, explorando a manipulação de registradores e o tratamento de interrupções.
Ao iniciar a placa, o firmware opera com o seguinte fluxo de execução:
- Inicialização (Boot): Configura o hardware (GPIO, UART0, Timers) e exibe imediatamente a mensagem de boas-vindas ("Hello world!!! Projeto Bare Metal BBB") no terminal. Em seguida, testa uma interrupção de software (SWI), imprimindo seu número de chamada.
- Segundo Plano (Main Loop): O processador principal entra em um laço contínuo que pisca os LEDs internos de usuário (USR0 a USR3) da BeagleBone Black a cada 1 segundo, demonstrando que o sistema está ativo.
- CLI Baseada em Interrupções: Enquanto a rotina principal roda, o sistema utiliza interrupções (IRQ) na UART0 para ler comandos digitados. O terminal ecoa os caracteres em tempo real e apresenta o prompt
bbb>. Quando um comando é enviado (Enter), o interpretador avalia o buffer e executa a ação correspondente sem travar a rotina dos LEDs (a menos que seja um comando de bloqueio como ogoto).
🔗 Clique aqui para assistir ao vídeo de demonstração do projeto rodando na placa
O interpretador de comandos reconhece as seguintes entradas no terminal:
hello: Imprime a mensagem de boas-vindas do sistema.led on: Acende o LED configurado (USR0) da placa.led off: Apaga o LED da placa.blink: Inicia uma sequência de acendimento e apagamento do LED.time: Exibe a hora atual do sistema (implementação via RTC).set time: Ajusta a hora do sistema para um valor padrão de inicialização.cache: Invalida a memória de instruções (I-Cache) comunicando-se com o coprocessador CP15.goto: Executa um salto condicional para o endereço-base de memória (0x80000000).reset: Realiza um hard reset na placa manipulando o Watchdog Timer (WDT).
O código fonte foi completamente modularizado para separar responsabilidades lógicas e acesso a periféricos:
bin/: Diretório de saída dos binários finais gerados (.bin,.elf).obj/: Diretório contendo os arquivos objetos (.o) gerados durante a compilação.src/: Códigos-fonte em Assembly ARM (.s).uart.s: Lógica de configuração da UART0, buffer de recepção/transmissão e a máquina de estados do CLI.gpio.s: Manipulação direta dos registradores para controle do GPIO e LEDs internos.wdt.s: Rotinas de desativação e reset utilizando o Watchdog Timer.rtc.s: Configuração e stubs do Real-Time Clock.cp15.s: Manipulação do vetor VBAR e gerenciamento de cache no coprocessador CP15.utils.s: Utilitários globais como delays, memory dumps, funções matemáticas e conversão (ASCII/HEX).
memmap.ld: Script do Linker que mapeia as seções do código para a RAM (0x80000000), alinhando-se à carga do U-Boot.Makefile: Script para automação da montagem (Assembler) e Linkagem via Cross-Compiler.
Para compilar o projeto, certifique-se de ter a toolchain arm-none-eabi- instalada no seu ambiente Linux.
-
Clone este repositório:
git clone https://github.com/sua-conta/prompt-arm-bbb.git cd prompt-arm-bbb -
Compile os módulos utilizando o Makefile:
make
-
O processo irá gerar o arquivo de imagem
baremetal.bindentro da pastabin/, que pode ser transferido via protocolo TFTP para a BeagleBone Black através do U-Boot.