11

AVR-GCC 4.9.2 を使用していますが、AVR の ISR で早期復帰を行うとどうなるか知りたいですか?

ISR(USART_RXC_vect)
{
    ...
    if(idx == BUFSIZE)
        return;
    ...
 }

命令returnに変換されますか? retiそれとも、自分自身を含める必要がありreti()ますか?

舞台裏で何が起こっているのかについての詳細な説明を探しています。

4

1 に答える 1

9


ISR(USART_RXC_vect)
文字通り
USART_INTERUPT_VECTOR:
アセンブラーだけではないのと同じように、

return;
文字通り、
ret
または
reti
アセンブラーではありません。

C/C++ の両方の命令は複数のアセンブラー ステートメントに変換され、どちらの場合もコンテキストに依存します。この場合のコンテキストISR(){}は非常に 1 つのトラックですが、いくつかのプッシュと SREG の保存も含まれる可能性が高くなります。ただし、スタックへのプッシュの回数は、関数で何が起こるかによって異なります。

したがってreturn;、コンテキストで解釈されます。実際にサブルーチンに組み込まれる通常のサブルーチンの最後に (使用が制限された多くのサブルーチンは、コード効率の理由からコンパイラーによって「インライン化」されます)、それはret命令になります (必要な POP やその他の低レベルのサブルーチンを処理した後)。掃除)。割り込みの最後に、実際には「前にプッシュしたものをすべてポップし (さらに SREG を復元し)、次にreti」という意味になります。

ret命令を含める前に、プラットフォームのシステムを介してその値を転送するようにコンパイルされる型を返す場合。非常return;に奇妙なことをしない限り、正しく解釈されると想定できる非常に文脈依存のステートメントです。しかし、これらの奇妙なことは、良いコンパイラ (AVR-GCC など) が少なくとも警告するものです。

于 2015-08-04T22:22:37.247 に答える