0

ザイリンクス SDK 2016.1 freeRTOS823_xlinx OS プラットフォーム

私のコードは、いくつかの freeRTOS 要素を導入するまでは正常に動作しているように見えました。私のコードの一般的な機能は次のとおりです。

  1. Interrupt サブルーチンでは、Zynq SoC の IP レジスタから読み取られる変数focusPositionに値を割り当てます。

    // separate file
    u32 focusPosition=0;
    
    static void ISR(void *CallbackRef)
    {
      focusPosition = XRb_focus_Get_position_o(CallbackRef);
    }
    
  2. 次に、メイン関数で値をコンソールに出力します。

    // separate file
    extern u32 focusPosition;
    main{
     ...
     while(1){
       sleep(1);
       xil_printf("%d\n",focusPosition);
     }
    }
    

コードは正しい値を出力しますが、コードに xTaskCreate() xEventGroupCreate() などの追加の行を実装しようとすると、何かがすべてのメモリを台無しにし、出力される値が一定のままになり、正しくありません。

変数とは関係のない単純なコードの追加が、その変数にどのように影響するのでしょうか? 私の知る限り、xTaskCreate() と xEventGroupCreate() はヒープ上に作成されます。Xil_DCacheDisable() が役立つかどうかを調べるのにうんざりしましたが、違います。何か案は?focusPosition 変数は適切に定義/宣言されていますか?

4

1 に答える 1

1

focusPosition を volatile として宣言する必要があります。そうしないと、コンパイラは while ループの外で変更されることを予期しないため、コードが最適化される可能性があります。余分なコードを追加すると、これが発生する可能性があります。割り込みで変更されたが他の場所で使用された変数は、volatile として宣言する必要があります。

于 2016-11-17T12:02:48.303 に答える