質問

ウサギ4000プロセッサでステッピングモーターを回転させようとしています。私は構造体を保持するキューを持っており、4つの巻線ステッピングモーターを実行する必要があるバイナリビットのシーケンスを作成する関数を作成しました。シーケンスを並べて並べ替えて、それをキューに埋めるプロデューサーに渡しようとしています。問題は私が期待値がキューに入れられていません。関数から構造体を返す方法を誤解するか、または配列値を個別に割り当てる必要がありますか?該当するコードの塊は次のとおりです。

typedef struct {
    char d[4];
    int  delayUs;
} mQueueEntry_t;


mQueueEntry_t setDirStep(int count0, int count1, int count2, int count3){

 mQueueEntry_t entry;

        entry.d[0] = (!((count0+1)%4));                 //1a
        entry.d[1] = (!((count1+1)%4));                 //1b
        entry.d[2] = (!((count2+1)%4));                 //2a
        entry.d[3] = (!((count3+1)%4));                 //2b

        entry.delayUs =10;
        printf("Breaking Funct with: %d,%d,%d,%d\n",entry.d[0], entry.d[1], entry.d[2], entry.d[3]);
}

// continually stuff a queue with a dedicated structure
void Producer(void* pdata){
    mQueueEntry_t entry;

    int count0 = 3;
    int count1=1;
    int count2=2;
    int count3=0;

    labQueue_t * q = (labQueue_t *) pdata;  // Note use of task data..
    printf("Hola Producer\n");
    while (1)
    {
        entry = setDirStep(count0, count1, count2, count3);
        printf("Values after funct call: %d,%d,%d,%d\n",entry.d[0], entry.d[1], entry.d[2], entry.d[3]);

        count0++;
        count1++;
        count2++;
        count3++;

        // send a copy of the element and
        switch ( labQueuePut( q, &entry) ){
        case LABQ_OK:
            printf("put %d,%d,%d,%d\n",entry.d[0], entry.d[1], entry.d[2], entry.d[3]);
            break;
        case LABQ_TIMEOUT:
            OSTimeDly(OS_TICKS_PER_SEC/10);
            break;
        case LABQ_FULL:
            OSTimeDly(OS_TICKS_PER_SEC/10);
            break;
        default:
            assert(0);
            break;
        }
        OSTimeDly(1);
      }

}
.

プログラムの画面出力:

HOLA Consumer
ホーラプロデューサー
Breaking Funct:1,0,0,0
FUNCTコール後の値:235,0,24,23
受信した(1A= 0:1B= 1:2A= 0:2B= 0)0
235,0,24,23
でのFUNCTを破る:0,0,1,0
Functの後の値:236,41,237,0
受信した(1A= 0:1B= 0:2A= 0:2B= 1)1
236,41,237,0

を入れる

私の問題は、Funct Callが同じであると予想される後に、Braking関数から値までの値があります。

役に立ちましたか?

解決

あなたのsetDirStep()が値を返さないのですが、それを参照するmQueueEntry_tと宣言しました。この割り当てで読み込んだ値は無効になります。

entry = setDirStep(count0, count1, count2, count3);
.

コンパイラの警告を表示するはずです、私はそれが驚かない。

エラーを修正するには、setDirStep()に必要なRETURNステートメントを追加します。

return entry;
.

将来的には、常に警告を入れてコンパイルしてください。GCCを使用している場合は、必要なのは-Wallです。

コードの残りはOK

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top