共用体がグローバルキュー構造体のメンバーであることを知っているのに、書き込み関数を使用して共用体メンバーに割り当てられた値を保持する方法を教えてもらえますか?
基本的に私がしたことは、キュー名、長さ、およびミューテックス(読み取り関数と書き込み関数の間の同期用)を使用して1つのデータキューバッファー構造体を定義することです。バッファデータは、さまざまなシステムのハウスキーピング構造体です。ユニオンを使用して、さまざまな構造体をすべてカプセル化しました。キュー構造体のさまざまなインスタンスがシステムごとに作成されました(eps_q、com_q..etc)。
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
typedef union qbuf{
eps_hk eps_buf[EPS_HK_SIZE];
odb_hk odb_buf[ODB_HK_SIZE];
com_hk com_buf[COM_HK_SIZE];
cam_hk cam_buf[CAM_HK_SIZE];
adcs_hk adcs_buf[ADCS_HK_SIZE];
}qbuf_t;
typedef struct {
qbuf_t qbuf;
int qwindex;
int qlength;
int qfull;
char *qname;
pthread_mutex_t *qmut;
pthread_cond_t *qFull;
}queue;
queue *odb_q;
queue *eps_q;
queue *com_q;
queue *cam_q;
queue *adcs_q;
/*************************************************/
/**** read and write functions in eps.c *****/
int eps_queueAdd (queue *q, eps_hk hk)
{
q->qbuf.eps_buf[q->qwindex] = hk;
printf(".... After queue add..... vbatt %u\n", q->qbuf.eps_buf[q->qwindex].vbatt);
q->qwindex++;
if (q->qwindex == q->qlength) {
q->qwindex = 0;
q->qfull=1;
}
return (q->qfull);
}
eps_hk eps_queueRead(queue *q) //read hk from local eps hk table, for hk handlers
{
eps_hk hk;
sleep (10);
hk = q->qbuf.eps_buf[q->qwindex];
printf(".... INSIDE queue read .....vbatt %u \n", q->qbuf.eps_buf[q->qwindex].vbatt);
return (hk);
}
書き込み関数(queueADD)は問題なく動作します。ここでの問題は、以前に(queueADD)を使用して書き込まれた値(たとえば10)を読み取ろうとすると、それが見つからないように見えることです(0を取得します)。
私の投稿を読むために時間を割いていただきありがとうございます=)
===編集============================================== ==================
キュー構造体でユニオンを使用する目的は、さまざまなデータ型の汎用キューを定義することです。もちろん、私はvoid *ポインターを使用することを考えましたが、メモリー割り当てとポインターの逆参照にはあまりにも面倒です。どう思いますか?
さて、書き込み関数では、インデックス(別名qwindex
)を更新/インクリメントし、読み取り関数では、読み取りに同じインデックスを使用します。したがって、read関数は、最後に書き込んだ要素(つまり、まだ書き込まれていない要素)の後にある要素を返します。
私は読み取り機能がどちらかになることを期待します
1)読みたい要素のインデックスを取得します
または
2)qwindex - 1
インデックスとして使用します(次に、インデックスをデクリメントしてスタックのような動作を取得します)。
または、最も古い要素が返されるように、書き込み用に1つのインデックスと読み取り用に別のインデックスが必要な場合があります(FIFOの動作)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加