Processo subjacente do carregador de inicialização do processador ARM

Siga + estrela conta oficial , não perca conteúdo emocionante

bc7aac6f54805baeb8672fbf850e6286.gif

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:

f03f1a2edf6ff9f8cf8bb377b74ca3d3.png

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  ------------

57f41deb3596f7c7aadc85db8853ece4.gif

●Coluna "Ferramentas incorporadas "

●Coluna "Desenvolvimento Integrado"

●Coluna "Tutorial Keil"

●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.

e0a8ea925ad88406f93ef80e5cfec796.jpeg

1db1d2fba5cbd88640279ce285fb4a25.png

Clique em " Ler o texto original " para visualizar mais compartilhamentos.

Acho que você gosta

Origin blog.csdn.net/ybhuangfugui/article/details/131950238
Recomendado
Clasificación