Pergunta

Eu estou escrevendo uma rotina de montador para tratar a exceção 0x500 externa / decrementer em um aplicativo PowerPC EABI incorporado.

Na minha rotina assembler chamado a partir do ponto vetor 0x500 Quero usar alguma memória para o contexto salvar registros antes de ramificar para a função de manipulador em 'C'.

Devido i) o modelo de exceção garante as instruções anteriores terá terminado no momento em que o manipulador de exceção é executado E ii) a convenção de chamada aparece para atualizar o ponteiro da pilha (R1) ao entrar em uma nova função, antes de usar o novo espaço de pilha liberado movendo-a (e mover a parte de trás ponteiro de pilha para onde ela foi passada no fim da função )

parece-me que eu possa usar com segurança r1 para me dar mais algum espaço na pilha normal na exceção processamento de rotinas, desde obviamente eu aderir à convenção de chamada e colocar a parte de trás da pilha como eu descobri-lo e certifique-se SRR0 e SRR1 são não modificada.

Eu não vou permitir exceções que usam a pilha na sua manipulação para aninhar (embora, na verdade, usando este método não estou certo de que seria um problema).

Você acha que esta é uma abordagem sábia, ou devo usar uma pilha separada para tratamento de exceção? -. Eu estou pensando que este pode trazer consigo os seus próprios problemas

Foi útil?

Solução

Sistemas embarcados fazer isso em ambos os sentidos. Se você está completamente confiante de que o ponteiro da pilha irá sempre apontar para um quadro válido e haverá espaço na pilha para o seu novo quadro, então vá em frente e usá-lo. Se há uma chance de que o ponteiro da pilha não será sempre válido, você deve salvar o ponteiro da pilha velha (tipicamente em uma SPRG) e criar o seu próprio.

Se você estiver indo para lidar com exceções de acesso de dados para detectar erros de software, você certamente vai querer configurar sua própria pilha de exceção porque o DACC pode ter sido causado por um ponteiro de pilha quebrado.

Outras dicas

A única desvantagem que eu posso ver a salvar contexto registo na pilha é que uma das exceções que você pode executar em é um estouro de pilha!

Tenho guardado o contexto atual para a pilha atual com quaisquer problemas.

Você precisa diferenciar entre exceções a partir do qual você gostaria de retornar de e exceções que são "falhas fatais" a partir do qual não há retorno ou aquela pilha não podem ser confiáveis. Se você não está indo para retornar você tem duas opções. Reinicie a pilha e tudo descarte ou se você tiver mais opção de RAM para uma pilha de exceção para a pilha regular pode ser impresso ou ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top