0

私はこの仕様を持っています:

タスク 0 は、整数 (1 から始まる) をタスク 1 に送信します。タスク 1 は、数値に -1 を掛けて、タスク 0 に送り返します。タスク 0 は、これらの数値をコンソールに出力します。タスク 0 とタスク 1 の間の通信には、単一のメモリ ロケーション sharedAddress が使用されます。つまり、タスク 0 とタスク 1 の両方がこのロケーションとの間で読み書きを行います。ファイルを SharedMemory.c として保存します。プログラムを実行すると、次の出力が得られます。送信:1 受信:-1 送信:2 受信:-2 ...

このプログラムを書きましたが、タスクが正しく同期されていません。セマフォまたはコンテキスト スイッチで何か問題が発生した可能性があります。

タスクが正しく同期されなかったために、数が時々カウントダウンされる代わりに、次の出力が得られます。

Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17
Sending : 16
Receiving -16
Sending : -17
Receiving 17

私が変更する必要があるプログラムは

#include <stdio.h>
#include "includes.h"
#include <string.h>

#define DEBUG 0

/* Definition of Task Stacks */
/* Stack grows from HIGH to LOW memory */
#define   TASK_STACKSIZE       2048
OS_STK    task1_stk[TASK_STACKSIZE];
OS_STK    task2_stk[TASK_STACKSIZE];
OS_STK    stat_stk[TASK_STACKSIZE];
OS_EVENT *aSemaphore;
/* Definition of Task Priorities */
#define TASK1_PRIORITY      6  // highest priority
#define TASK2_PRIORITY      7
#define TASK_STAT_PRIORITY 12  // lowest priority 
int number = 1;
void handle_button_interrupts(void* context, alt_u32 id) 
{ 
 volatile int* edge_capture_ptr = (volatile int*) context; 

 OSIntEnter(); 
 // Read the edge capture register on the button PIO 
 //*edge_capture_ptr = 
 //IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE); 

 OSIntExit(); 
} 


void printStackSize(INT8U prio)
{
    INT8U err;
    OS_STK_DATA stk_data;

    err = OSTaskStkChk(prio, &stk_data);
    if (err == OS_NO_ERR) 
    {
        if (DEBUG == 1)
           printf("Task Priority %d - Used: %d; Free: %d\n", 
                   prio, stk_data.OSFree, stk_data.OSUsed);
    }
    else
    {
        if (DEBUG == 1)
           printf("Stack Check Error!\n");    
    }
}

/* Producer */
void task1(void* pdata)
{
  INT8U err;

  while (1)
  { 
    char text1[] = "Sending : ";
    char text2[] = "Receiving : ";

    int i;
    OSSemPend(aSemaphore, 0, &err); // Trying to access the key

    for (i = 0; i < strlen(text1); i++)
        putchar(text1[i]);
    printf("%d", number); 
    putchar('\n');   


    OSSemPost(aSemaphore); // Releasing the key
    OSTimeDlyHMSM(0, 0, 0, 11); // Context Switch to next task

                               // Task will go to the ready state

                               // after the specified delay


    OSSemPend(aSemaphore, 0, &err); // Trying to access the key

    for (i = 0; i < strlen(text1); i++)
        putchar(text2[i]);
    printf("%d", number); 
    putchar('\n');   
    number=-number;
    number++; 
    OSSemPost(aSemaphore); // Releasing the key
    OSTimeDlyHMSM(0, 0, 0, 11); // Context Switch to next task

                               // Task will go to the ready state

                               // after the specified delay


  }
}

/* Consumer */
void task2(void* pdata)
{
  INT8U err;  
  while (1)
  { 
    OSSemPend(aSemaphore, 0, &err); // Trying to access the key
    number = -number;
    OSSemPost(aSemaphore); // Releasing the key
    OSTimeDlyHMSM(0, 0, 0, 4);
  }
}

/* Printing Statistics */
void statisticTask(void* pdata)
{
    while(1)
    {
        printStackSize(TASK1_PRIORITY);
        printStackSize(TASK2_PRIORITY);
        printStackSize(TASK_STAT_PRIORITY);
    }
}

/* The main function creates two task and starts multi-tasking */
int main(void)
{
  printf("Lab 3 - Handshake\n");
  aSemaphore = OSSemCreate(1); // binary semaphore (1 key)
  OSTaskCreateExt
    (task1,                        // Pointer to task code
     NULL,                         // Pointer to argument that is
                                   // passed to task
     &task1_stk[TASK_STACKSIZE-1], // Pointer to top of task stack
     TASK1_PRIORITY,               // Desired Task priority
     TASK1_PRIORITY,               // Task ID
     &task1_stk[0],                // Pointer to bottom of task stack
     TASK_STACKSIZE,               // Stacksize
     NULL,                         // Pointer to user supplied memory
                                   // (not needed here)
     OS_TASK_OPT_STK_CHK |         // Stack Checking enabled 
     OS_TASK_OPT_STK_CLR           // Stack Cleared                                 
    );

  OSTaskCreateExt
    (task2,                        // Pointer to task code
     NULL,                         // Pointer to argument that is
                                   // passed to task
     &task2_stk[TASK_STACKSIZE-1], // Pointer to top of task stack
     TASK2_PRIORITY,               // Desired Task priority
     TASK2_PRIORITY,               // Task ID
     &task2_stk[0],                // Pointer to bottom of task stack
     TASK_STACKSIZE,               // Stacksize
     NULL,                         // Pointer to user supplied memory
                                   // (not needed here)
     OS_TASK_OPT_STK_CHK |         // Stack Checking enabled 
     OS_TASK_OPT_STK_CLR           // Stack Cleared                       
    );  

  if (DEBUG == 1)
  {
    OSTaskCreateExt
      (statisticTask,                // Pointer to task code
       NULL,                         // Pointer to argument that is
                                     // passed to task
       &stat_stk[TASK_STACKSIZE-1],  // Pointer to top of task stack
       TASK_STAT_PRIORITY,           // Desired Task priority
       TASK_STAT_PRIORITY,           // Task ID
       &stat_stk[0],                 // Pointer to bottom of task stack
       TASK_STACKSIZE,               // Stacksize
       NULL,                         // Pointer to user supplied memory
                                     // (not needed here)
       OS_TASK_OPT_STK_CHK |         // Stack Checking enabled 
       OS_TASK_OPT_STK_CLR           // Stack Cleared                              
      );
  }  

  OSStart();
  return 0;
}

手伝って頂けますか?

4

2 に答える 2

2

もう一度考えてみてください: おそらく 2 つのセマフォが必要になるでしょう:

  • プロデューサからコンシューマに送信するための 1 つ (sem1)
  • コンシューマからプロデューサに送信するためのもの (sem2)

sem1 を 0 で、sem2 を 1 で初期化します。

  • タスク 1 はまず sem2 で保留を行い、次に sem1 でデータとポストを処理します。次のループ ステップでは、sem2 が task2 によって通知されるまで待機します。
  • タスク 2 は sem 1 で保留され (したがって最初のデータ入力を待機)、データを処理して sem2 に送信します
于 2013-10-14T10:59:46.910 に答える
0
#include <stdio.h>
#include "includes.h"
#include <string.h>

#define DEBUG 1

/* Definition of Task Stacks */
/* Stack grows from HIGH to LOW memory */
#define   TASK_STACKSIZE       2048
OS_STK    task1_stk[TASK_STACKSIZE];
OS_STK    task2_stk[TASK_STACKSIZE];
OS_STK    stat_stk[TASK_STACKSIZE];

/* Decaring the semaphone */
OS_EVENT *aSemaphore;
OS_EVENT *bSemaphore;
int number=0;

/* Definition of Task Priorities */
#define TASK1_PRIORITY      6  // highest priority
#define TASK2_PRIORITY      7
#define TASK_STAT_PRIORITY 12  // lowest priority 

void printStackSize(INT8U prio)
{
    INT8U err;
    OS_STK_DATA stk_data;

    err = OSTaskStkChk(prio, &stk_data);
    if (err == OS_NO_ERR) 
    {
        if (DEBUG == 1)
           printf("Task Priority %d - Used: %d; Free: %d\n", 
                   prio, stk_data.OSFree, stk_data.OSUsed);
    }
    else
    {
        if (DEBUG == 1)
           printf("Stack Check Error!\n");    
    }
}

/* Prints a message and sleeps for given time interval */
void task1(void* pdata)
{
  INT8U err_bSemaphore;

  while (1)
  { 

  OSSemPend(bSemaphore,0,&err_bSemaphore);
  number*= -1;
  number++;
  printf("Sending: %d\n",number);
  OSSemPost(aSemaphore);
  }
}

/* Prints a message and sleeps for given time interval */
void task2(void* pdata)
{
  INT8U err_aSemaphore;

  while (1)
  {     
    OSSemPend(aSemaphore,0, &err_aSemaphore);
    number*= -1;
    printf("Receiving: %d\n", number);
    OSSemPost(bSemaphore);
 }
}

/* Printing Statistics */
void statisticTask(void* pdata)
{
    while(1)
    {
        printStackSize(TASK1_PRIORITY);
        printStackSize(TASK2_PRIORITY);
        printStackSize(TASK_STAT_PRIORITY);
    }
}

/* The main function creates two task and starts multi-tasking */
int main(void)
{
  printf("Lab 1 - Two Tasks using Handshake (Task 2.4)\n");

/* Declaring a binary semaphore */
  aSemaphore = OSSemCreate(1);    
  bSemaphore = OSSemCreate(1);

  OSTaskCreateExt
    (task1,                        // Pointer to task code
     NULL,                         // Pointer to argument that is
                                   // passed to task
     &task1_stk[TASK_STACKSIZE-1], // Pointer to top of task stack
     TASK1_PRIORITY,               // Desired Task priority
     TASK1_PRIORITY,               // Task ID
     &task1_stk[0],                // Pointer to bottom of task stack
     TASK_STACKSIZE,               // Stacksize
     NULL,                         // Pointer to user supplied memory
                                   // (not needed here)
     OS_TASK_OPT_STK_CHK |         // Stack Checking enabled 
     OS_TASK_OPT_STK_CLR           // Stack Cleared                                 
    );

  OSTaskCreateExt
    (task2,                        // Pointer to task code
     NULL,                         // Pointer to argument that is
                                   // passed to task
     &task2_stk[TASK_STACKSIZE-1], // Pointer to top of task stack
     TASK2_PRIORITY,               // Desired Task priority
     TASK2_PRIORITY,               // Task ID
     &task2_stk[0],                // Pointer to bottom of task stack
     TASK_STACKSIZE,               // Stacksize
     NULL,                         // Pointer to user supplied memory
                                   // (not needed here)
     OS_TASK_OPT_STK_CHK |         // Stack Checking enabled 
     OS_TASK_OPT_STK_CLR           // Stack Cleared                       
    );  

  if (DEBUG == 1)
  {
    OSTaskCreateExt
      (statisticTask,                // Pointer to task code
       NULL,                         // Pointer to argument that is
                                     // passed to task
       &stat_stk[TASK_STACKSIZE-1],  // Pointer to top of task stack
       TASK_STAT_PRIORITY,           // Desired Task priority
       TASK_STAT_PRIORITY,           // Task ID
       &stat_stk[0],                 // Pointer to bottom of task stack
       TASK_STACKSIZE,               // Stacksize
       NULL,                         // Pointer to user supplied memory
                                     // (not needed here)
       OS_TASK_OPT_STK_CHK |         // Stack Checking enabled 
       OS_TASK_OPT_STK_CLR           // Stack Cleared                              
      );`enter code here`
  }  

  OSStart();
  return 0;
}
于 2015-10-10T12:15:59.220 に答える