minhas informações de contato
Correspondência[email protected]
2024-07-08
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Recentemente, descobri que após mesclar alguns códigos em outras plataformas no STM32, ocorreu um problema de travamento, então eu queria resolver de maneira geral os princípios de solução de problemas de travamento no STM32.
A descrição acima é uma informação de impressão de falha. Após investigação, descobriu-se que a profundidade da pilha do timer do FreeRTOS estava definida como muito pequena. Havia muito conteúdo em execução na função de execução do timer e a memória solicitada por cada variável local era. não foi lançado a tempo e, eventualmente, ocorreu um acidente.
Vamos falar sobre o cronômetro no FreeRTOS. Na verdade, ele pode ser entendido como uma tarefa, o que equivale a criar um thread para manter o tempo e, em seguida, pesquisar e consultar a lista de cronômetros atuais para descobrir qual tempo de execução do cronômetro expirou. isto.
Portanto, o tamanho da memória utilizada pelo temporizador também precisa ser configurado.
R0~R12 são registradores de uso geral
R13 é o stack pointer e fisicamente existem dois stack pointers:O ponteiro de pilha principal (MSP) é o ponteiro de pilha padrão, que será selecionado para uso após a reinicialização e quando o processador estiver no modo de processamento; o outro ponteiro de pilha é o ponteiro de pilha de processo (PSP), que só pode ser usado em thread; modo (quando há um RTOS))
R14 é o registrador de link (LR), usado para salvar o endereço de retorno quando uma função ou sub-rotina é chamada. No final da função ou sub-rotina, o controle do programa pode retornar ao programa chamador carregando o valor de LR no contador do programa (PC) e continuar a execução. Durante o tratamento de exceções, LR será atualizado automaticamente para um EXC_RETURN especial (retorno de exceção). ) valor.
Por exemplo, a chama b. Neste momento, o endereço da subfunção b é colocado no ponteiro pc, e o endereço de a é colocado no LR. Depois que b é executado, o endereço de a é colocado no ponteiro PC. do LR para execução.
Uma falha no braço é, na verdade, uma interrupção anormal. Quando a interrupção ocorre, o processador salvará o status atual da tarefa na pilha.
quadro de pilha
Stack Frame refere-se a uma área de memória usada para salvar parâmetros de função, variáveis locais, endereços de retorno e outras informações durante uma chamada de função.
Quando uma função é chamada, o STM32 alocará um quadro de pilha para ela. O tamanho do quadro de pilha depende de fatores como o número de parâmetros, o número de variáveis locais e as configurações de otimização do compilador.
Combinando as informações acima, podemos saber que se quisermos saber qual função travou quando a função travou, precisamos encontrar o quadro de pilha que foi colocado na pilha quando a interrupção de exceção foi acionada, e esse quadro de pilha está no R13 (Ponto de pilha) ponteiro de pilha armazenado.
Encontramos uma maneira de obter o conteúdo apontado pelo ponteiro do registro R13 na função de tratamento de falhas HardFault_Handler() e, em seguida, imprimi-lo.
O microcontrolador STM32 usa o núcleo ARM Cortex-M, que possui dois ponteiros de pilha, um é o ponteiro de pilha principal (MSP) e o outro é o ponteiro de pilha de processo (PSP).
MSP (Ponteiro de Pilha Principal): O ponteiro da pilha principal é usado principalmente para o kernel do sistema operacional ou rotina de serviço de interrupção.
PSP (Ponteiro de Pilha de Processo): O ponteiro da pilha do processo é usado principalmente por aplicativos de usuário.
Quando o núcleo Cortex-M retorna ao modo Thread, ele pode voltar para o ponteiro de pilha principal MSP ou o ponteiro de pilha de processo PSP de acordo com a configuração do registro CONTROL.
O PSP armazena o contexto relacionado ao aplicativo do usuário em execução. Inclua especificamente o seguinte:
一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。
Program Counter(PC):指向下一条将要执行的指令。
Processor Status Register(PSR)的值:包含标志位状态。
Ponteiro de pilha: salva a localização do quadro de pilha anterior.
Normalmente, ao alternar tarefas (ou alternar contexto), essas informações serão salvas na pilha. Quando uma nova tarefa for iniciada, suas informações de contexto serão restauradas da pilha.
Deve-se observar que o conteúdo específico salvo varia de acordo com a estratégia de agendamento específica e o design do sistema operacional.
Determine o valor do ponteiro LR/PC
Primeiro precisamos determinar se o RTOS é usado. Nesse caso, nossas informações de travamento devem ser armazenadas no PSP.
Precisamos primeiro ler essas informações e, depois de conhecer os valores de LR e PC, podemos encontrar o ponto de travamento por meio de Debug no keil5 ou encontrar o ponto de travamento correspondente por meio do arquivo de mapa gerado durante o processo de compilação.
Clique com o botão direito na janela Desmontagem—