سؤال

أحاول تشغيل محرك متدرج باستخدام معالج أرنب 4000.لدي قائمة انتظار تحتوي على بنيات، وقمت بإنشاء وظيفة لإنشاء تسلسل من البتات الثنائية اللازمة لتشغيل محرك السائر ذو الأربعة لفات.أحاول تمرير التسلسل من الوظيفة الموجودة بجانب البنية إلى المنتج الذي سيملأ قائمة الانتظار بها.المشكلة هي أنني لا أحصل على القيمة المتوقعة الموضوعة في قائمة الانتظار.هل أسيء فهم كيفية إرجاع البنية من دالة، أم أنني بحاجة إلى تعيين قيم الصفيف بشكل فردي؟الأجزاء ذات الصلة من التعليمات البرمجية هي:

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);
      }

}

إخراج الشاشة للبرنامج:

هلا المستهلك
هلا منتج
كسر وظيفة مع:1,0,0,0
القيم بعد استدعاء الوظيفة:235,0,24,23
المستلمة (1أ= 0:1ب= 1:2أ= 0:2ب= 0) 0
ضع 235,0,24,23
كسر وظيفة مع:0,0,1,0
القيم بعد استدعاء الوظيفة:236,41,237,0
المستلمة (1أ= 0:1ب= 0:2أ=0:2ب= 1) 1
ضع 236,41,237,0

مشكلتي تتعلق بالقيم من كسر الدالة إلى القيم بعد استدعاء الوظيفة ومن المتوقع أن تكون هي نفسها.

هل كانت مفيدة؟

المحلول

لك setDirStep() لا يُرجع قيمة، ومع ذلك فقد أعلنت أنها عائدة mQueueEntry_t.ستكون القيم التي قرأتها في هذه المهمة غير صالحة:

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

يجب أن يُظهر هذا تحذيرًا للمترجم، وأنا مندهش من عدم حدوث ذلك.

لإصلاح الخطأ، قم بإضافة بيان الإرجاع الضروري في setDirStep():

return entry;

في المستقبل، تأكد دائمًا من التجميع مع تشغيل التحذيرات.إذا كنت تستخدم دول مجلس التعاون الخليجي، كل ما تحتاجه هو -Wall.

بقية الكود تبدو جيدة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top