Siga + estrela conta oficial , não perca conteúdo emocionante
Autor | strongHuang
Conta pública do WeChat | strongHuang
Compartilhei com você artigos relacionados sobre a execução do Bootloader do ponto de vista do aplicativo. Hoje, descreverei como escrever o Bootloader para processadores ARM e o processo subjacente a partir dos princípios subjacentes.
Sobre o Bootloader
O carregador de inicialização, como o próprio nome indica, é um carregador de inicialização, que é um programa antes da execução do sistema operacional ou do programa aplicativo e um código de programa que é executado depois que o sistema é ligado.
O BootLoader é implementado dependendo fortemente do hardware, especialmente em plataformas embarcadas. Portanto, é quase impossível estabelecer um BootLoader geral na plataforma incorporada. No entanto, ainda podemos resumir alguns conceitos gerais para o bootloader para orientar o design e a implementação do BootLoader específico do usuário.
--- Fonte da Enciclopédia Baidu
O Bootloader existe em telefones celulares, computadores e muitos sistemas embarcados.Ele tem muitas funções, como: inicializar o driver do aplicativo subjacente, carregar programas aplicativos e atualizar programas aplicativos.
O Bootloader pode variar muito para diferentes dispositivos. De um modo geral, o Bootloader depende do hardware subjacente e dos requisitos reais do projeto.
como escrever bootloader
Um bootloader é um pedaço de código de bootloader que atualiza o código do aplicativo do usuário.O novo código pode ser obtido usando muitos canais de download de hardware (por exemplo, USB, porta de rede).
Depois que a ROM de inicialização é executada, o programa bootloader é executado, atualizado se necessário e, em seguida, o aplicativo do usuário final é executado.
O bootloader e o aplicativo do usuário devem ser escritos e compilados como dois projetos ou objetos separados, resultando em dois arquivos separados e executáveis (bin/hex).
A principal tarefa do bootloader é reprogramar/substituir o aplicativo do usuário se necessário e pular para o aplicativo do usuário para executá-lo, o aplicativo não precisa necessariamente saber da existência do bootloader.
O bootloader geralmente está localizado no endereço base da memória flash do chip. O diagrama a seguir descreve a relação de mapeamento entre a memória e o código Flash:
Há muitas maneiras de inicializar o bootloader no modo de programação para reprogramar o aplicativo do usuário no Flash ou pular diretamente para o aplicativo do usuário existente para execução. A maneira mais fácil é verificar os pinos GPIO para determinar se o modo de programação deve ser inserido.
A maioria dos fornecedores de chips fornece aos usuários uma maneira conveniente, como interfaces ISP e IAP, que o bootloader usará para atualizar o conteúdo do flash.
Quando o conteúdo do Flash tiver sido atualizado ou já estiver atualizado, o bootloader pulará para o aplicativo do usuário. Isso requer uma série de etapas antes de executar o aplicativo do usuário:
1. Certifique-se de que a CPU esteja no modo privilegiado.
2. Desabilite todas as interrupções habilitadas no NVIC.
3. Desative todos os periféricos ativados que podem gerar solicitações de interrupção e limpe todos os sinalizadores de interrupção não utilizados nesses periféricos.
4. Limpe todas as solicitações de interrupção não utilizadas no NVIC.
5. Desabilite o SysTick e limpe seu bit de exceção pendente.
6. Se o gerenciador de inicialização usar manipuladores de falhas individuais, desative-os.
7. Se você achar que o kernel está sendo executado com o PSP, ative o MSP (você precisará copiar o PSP para o MSP antes disso, pois o compilador ainda pode estar usando a pilha).
8. Carregue o endereço da tabela vetorial da aplicação do usuário no registrador SCB->VTOR. Certifique-se de que o endereço atenda aos requisitos de alinhamento.
9. A última parte é definir o MSP para o valor encontrado na tabela de vetores do aplicativo do usuário e, em seguida, carregar o valor do vetor de redefinição do aplicativo do usuário no PC, que é a função de salto.
Isso é feito chamando uma função como o exemplo BootJump() abaixo:
static void BootJump(uint32_t *Address)
{
//1.确保CPU处于特权模式。
if( CONTROL_nPRIV_Msk & __get_CONTROL())
{ /* not in privileged mode */
EnablePrivilegedMode() ;
}
//2.禁用NVIC中所有启用的中断。
Disable_All_Peripherals();
//3.禁用所有可能产生中断请求的使能外设,并清除这些外设中的所有未使用中断标志。
NVIC->ICER[ 0 ] = 0xFFFFFFFF;
NVIC->ICER[ 1 ] = 0xFFFFFFFF;
NVIC->ICER[ 2 ] = 0xFFFFFFFF;
NVIC->ICER[ 3 ] = 0xFFFFFFFF;
NVIC->ICER[ 4 ] = 0xFFFFFFFF;
NVIC->ICER[ 5 ] = 0xFFFFFFFF;
NVIC->ICER[ 6 ] = 0xFFFFFFFF;
NVIC->ICER[ 7 ] = 0xFFFFFFFF;
//4.清除NVIC中所有未使用的中断请求。
NVIC->ICPR[ 0 ] = 0xFFFFFFFF;
NVIC->ICPR[ 1 ] = 0xFFFFFFFF;
NVIC->ICPR[ 2 ] = 0xFFFFFFFF;
NVIC->ICPR[ 3 ] = 0xFFFFFFFF;
NVIC->ICPR[ 4 ] = 0xFFFFFFFF;
NVIC->ICPR[ 5 ] = 0xFFFFFFFF;
NVIC->ICPR[ 6 ] = 0xFFFFFFFF;
NVIC->ICPR[ 7 ] = 0xFFFFFFFF;
//5.禁用SysTick并清除其异常挂起位。
SysTick->CTRL = 0;
SCB->ICSR |= SCB_ICSR_PENDSTCLR_Msk;
//6.如果引导加载程序使用了单个故障处理程序,请禁用它们。
SCB->SHCSR &= ~( SCB_SHCSR_USGFAULTENA_Msk | \
SCB_SHCSR_BUSFAULTENA_Msk | \
SCB_SHCSR_MEMFAULTENA_Msk ) ;
//7.如果发现内核当前与PSP一起运行,则激活MSP
if( CONTROL_SPSEL_Msk & __get_CONTROL())
{ /* MSP is not active */
__set_MSP( __get_PSP()) ;
__set_CONTROL( __get_CONTROL() & ~CONTROL_SPSEL_Msk);
}
//8.将用户应用程序的向量表地址加载到SCB-> VTOR寄存器中。
SCB->VTOR = ( uint32_t )Address ;
//9.跳转
BootJumpASM( Address[ 0 ], Address[ 1 ]);
}
Mais uma vez, o bootloader está relacionado ao hardware subjacente e às necessidades reais. O código acima é apenas para referência, principalmente para fornecer ideias para que todos possam entender.
Se você ainda não consegue entendê-lo, é recomendável entendê-lo em conjunto com o projeto de bootloader real, como o que compartilhei com você antes: STM32 oficial IAP rotina descrição detalhada
------------ FIM ------------
●Coluna "Ferramentas incorporadas "
●Coluna "Desenvolvimento Integrado"
●Tutoriais selecionados na coluna incorporada
Preste atenção à conta oficial e responda " Jiagroup " para ingressar no grupo de intercâmbio técnico de acordo com as regras e responda " 1024 " para ver mais conteúdo.
Clique em " Ler o texto original " para visualizar mais compartilhamentos.