Keil uVision
Criando um projeto
Acesse o menu Project->New uVision Project. Em seguida, indique um diretório e o nome do projeto.
Selecione o dispositivo que será utilizado ou a definição genérica. Para o exemplo apresentado, utilizou-se a estrutura genérica de um dispositivo ARM Cortex-M0+.

Na próxima tela são exibidas algumas configurações que podem ser adicionadas no projeto. Para esse exemplo, nenhuma configuração será realizada.

Arquivos de código
No painel de controle do projeto, selecione o diretório Source Group 1 e adicione um novo item ao projeto.

Em seguida, selecione a opção Asm File e indique o nome do arquivo.

Ponto de entrada da aplicação: Função Main
Inicialmente será demonstrado a criação de um programa referenciado pelo nome Main. Cabe lembrar que um programa pode ser representado por um conjunto de instruções e dados. Para tal, as regiões de código e dados devem ser indicadas para o montador.
Estrutura básica de um programa
As regiões de memória são indicadas com a diretiva AREA.
AREA NOME, TIPO, ATRIBUTOS
Considerando isso, a estrutura básica para a região de código é mostrada a seguir.
AREA ASM_MAIN, CODE, READONLY
THUMB
Main
;Instruções do programa
END
Exemplo de programa
Considere um exemplo simples para preencher a função main.
R0 = 10;
R1 = 0;
Incrementa R1;
Compara R1 com R0.
Se forem iguais, volta para o item 1, caso contrário, executa o item 3;
AREA ASM_MAIN, CODE, READONLY
THUMB
Main
MOVS R0,#10 ;R0 = 10
MOVS R1,#0 ;R1 = 0
Main_Loop
ADDS R1,R1,#1 ;R1 = R1 + 1
CMP R1,R0 ;Compara se R1==R0, altera flag Z em APSR se for igual
BNE Main_Loop ;Salta para Main_Loop se Z == 0
B Main ;Salto incondicional para Main
END
Construindo o programa
Para montar o programa, acesse o menu Project -> Build.

O montador notificará que faltam algumas definições no projeto. De fato, apenas o código da aplicação foi definido. No entanto, para o programa gravado no microcontrolador é necessário definir o ponto de entrada, isto é, o código que é executado quando ocorre um evento de Reset.

Inicialização do microcontrolador
A inicialização do sistema é definida como sendo a configuração básica para que o sistema possa operar em um estado conhecido. Tal condição é iniciada quando o microcontrolador é energizado, entrando no estado de Reset. Nessa condição, o processador inicia a execução do programa a partir de um endereço especificado numa região de memória chamada de Reset Vector.
Para esta etapa de inicialização é importante conhecer o mecanismo de Reset do microcontrolador. No Cortex-M0+, o contador de programa é inicializado com o valor do ResetVector, indicado no endereço 4 da memória de programa.

Assim, é necessário indicar para o montador essas regiões e valores. Para tal, é utilizado a macro EXPORT.
AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors
DCD 0x20000100 ; Top of Stack
DCD Reset_Handler ; Reset Handler
;definição dos outros vetores
AREA ASM_MAIN, CODE, READONLY
EXPORT Reset_Handler
THUMB
Reset_Handler
Main
MOVS R0,#10 ;R0 = 10
MOVS R1,#0 ;R1 = 0
Main_Loop
ADDS R1,R1,#1 ;R1 = R1 + 1
CMP R1,R0 ;Compara se R1==R0, altera flag Z em APSR se for igual
BNE Main_Loop ;Salta para Main_Loop se Z == 0
B Main ;Salto incondicional para Main
END
Agora, a montagem do programa não apresentará erros.

Simulação
Para simular a execução do programa, configure as opções de Debug. Para tal, acesse as opções de configuração do projeto.

Na tela de configuração, selecione a opção Use Simulator.

Ao retornar para tela inicial, acesse o item Debug -> Start Debug Session.

Ao iniciar a sessão, execute o programa instrução por instrução e observe o painel de registradores. Note os valores carregados nos registradores especiais e as definições realizadas no programa.

Chamada da função Main
Considere agora que o código Main será chamado pela rotina de inicialização do microcontrolador. Tal procedimento é comum, sendo responsável por inicializar configurações básicas do sistema antes de chamar a função principal.
AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors
DCD 0x20000100 ; Top of Stack
DCD Reset_Handler ; Reset Handler
;definição dos outros vetores
AREA ASM_INIT, CODE, READONLY
EXPORT Reset_Handler
Reset_Handler
;configurações do hardware
;chamada da função main
LDR R0, =Main ;carrega endereço representado por Main
BX R0 ;salta para Main
AREA ASM_MAIN, CODE, READONLY
THUMB
Main
MOVS R0,#10 ;R0 = 10
MOVS R1,#0 ;R1 = 0
Main_Loop
ADDS R1,R1,#1 ;R1 = R1 + 1
CMP R1,R0 ;Compara se R1==R0, altera flag Z em APSR se for igual
BNE Main_Loop ;Salta para Main_Loop se Z == 0
B Main ;Salto incondicional para Main
END
Last updated