-1

発生するすべての割り込み呼び出しをキャッチすることを目的とした関数がありますが、アドレス04で開始する関数を取得できません。

注:割り込みタイプに固有の関数は使用したくありません。コードで生成されるオーバーヘッドは必要ありません。

私はSDCCで次のコードを試しましたが、あまり関係がないかもしれませんが、念のためここに置いておきます。

__code __at (4) void handler() {

void __at (4) handler() {

運が悪ければ、マニュアルはそれ以上説明しません。

4

4 に答える 4

1

関数の場所は、コンパイラーではなく、リンカー次第です。

于 2011-08-26T21:11:35.190 に答える
1

関数をアドレス4で開始したくない場合は、コンパイラーがその場所でisr関数へのジャンプを生成するようにします。

SDCCのドキュメントをざっと見ると、この構造がわかります。

void isr(void) interrupt n { /* your code goes here */ }

ここで、goto命令が必要な「n」ベクトルスロット。

他のコンパイラにも同様の機能があります。正確な呪文については、コンパイラのドキュメントを確認する必要があります。

たとえば、HiTechCを使用します。

void interrupt isr(void) { /* code */ }
于 2011-08-27T02:19:08.450 に答える
0

私はこれをメーリングリストで見つけました。

を使用してコンパイルしsdcc --codeseg SEGNAME -c file.c
、これを実行してリンクしますsdcc -Wl -bSEGNAME=0x7ff0 ...

于 2011-09-19T15:29:49.660 に答える
0

元の質問からかなり時間が経っていることはわかっていますが、同じ回答を探していて、SDCC 3.3.0での作業が確認されたこの役立つ情報を見つけました:(出典: http: //www.mail-archive.com/sdcc- user@lists.sourceforge.net/msg00411.html

関数を固定の既知のアドレスにリンクさせるには、関数を他の2つの関数で囲むことができます。以下の例を参照してください。注:すべての_はダブル_ _文字です!(コード全体でこれを複数回使用する場合は、上記の例のようにマクロを定義することもできます。

以下の関数の目的のアドレスで####を置き換えます。

test.c

void begin_absolute_code(void) __naked
{
    __asm
          .area ABSCODE (ABS,CODE)
          .org 0x####        // YOUR FUNCTION'S DESIRED ADDRESS HERE.
    __endasm;
}

void your_function(...)
{
     // Do stuff here. This code will be placed at the specified address.
}

void end_absolute_code(void) __naked
{
    __asm
        .area CSEG (REL,CODE)
    __endasm;
}

void other_functions_here(...)
    // These functions will return to relative positions determined by the linker.

これがお役に立てば幸いです。

于 2013-10-27T20:56:47.810 に答える