Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /********************************************************
- * Copyright 2013 IWEDIA TECHNOLOGIES *
- *********************************************************
- *
- * MODULE NAME: DTV2-KURS VJEZBA_01
- *
- * FILE NAME: $URL$
- * $Date$
- * $Rev$
- *
- * DESCRIPTION
- *
- * Thread synchronization using TKEL
- *
- * minuend - subtrahend = difference
- *
- *********************************************************/
- /********************************************************/
- /* Includes */
- /********************************************************/
- #include <stdio.h>
- #include "tkel.h"
- #include "tbox.h"
- /********************************************************/
- /* Defines */
- /********************************************************/
- #define MAX_THREAD_COUNT 10
- #define MAX_QUEUE_SIZE 21
- #define ARRAY_SIZE 21
- /********************************************************/
- /* Macros */
- /********************************************************/
- #define TKEL_ASSERT(x) if(TKEL_NO_ERR != x) \
- { \
- mTBOX_TRACE((kTBOX_NIV_CRITICAL, "TKEL ASSERT: LINE %d ERROR %d\n", __LINE__, x)); \
- mTBOX_RETURN -1; \
- }
- /********************************************************/
- /* Typedefs */
- /********************************************************/
- typedef enum _ElementType
- {
- TYPE_MINUEND = 1,
- TYPE_SUBTRAHEND
- }ElementType;
- /********************************************************/
- /* Global Variables */
- /********************************************************/
- ////////////////////////////////////
- static TKEL_queue_id minuendQueId;
- static TKEL_queue_id subtrahendQueId;
- static TKEL_queue_id resultsQueId;
- static TKEL_qwidth msgSize;
- ////////////////////////////////
- static TKEL_qdepth maxNumber;
- static TKEL_int32 minuendIndex = 0;
- static TKEL_int32 subtrahendIndex = 0;
- static TKEL_int32 resultsIndex = 0;
- /////////////////////////////////
- // m u t e x i
- static TKEL_mutex_id minuendIndexMutex;
- static TKEL_mutex_id subtrahendIndexMutex;
- static TKEL_mutex_id resultsIndexMutex;
- ///////////////////////////////
- // t a s k o v i
- static TKEL_prio priority = 0;
- static TKEL_int16 stackSize = 2048;
- static TKEL_task_id readTask1[MAX_THREAD_COUNT];
- static TKEL_task_id readTask2[MAX_THREAD_COUNT];
- static TKEL_task_id calcTask[MAX_THREAD_COUNT];
- static char* taskNameRead = "readTask";
- static char* taskNameCalc = "calcTask";
- /********************************************************/
- /* Local Module Variables */
- /********************************************************/
- /********************************************************/
- /* Local File Variables (static) */
- /********************************************************/
- static int minuendArray[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
- static int subtrahendArray[] = {20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0};
- static int differenceArray[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- static TKEL_sema_id startSemaphore;
- static const int VJEZBA_01 = 0;
- /********************************************************/
- /* Local Functions Declarations (static)*/
- /********************************************************/
- static void readThreadFunc(void* arg); // za prvi red ili drugi red cita, paramenata
- // element type prvi il drugi
- static void calculateThreadFunc(void *arg);
- /********************************************************/
- /* Functions Definitions */
- /********************************************************/
- int main ( int argc, char *argv[] )
- {
- TKEL_err tkelErr;
- int readThreadNum;
- int calculateThreadNum;
- int i;
- int k;
- /* Use TBOX to init traces */
- mTBOX_SET_MODULE(VJEZBA_01);
- mTBOX_INIT_MOD_TRACE((VJEZBA_01, kTBOX_TRC_ALL));
- mTBOX_TRACE_ENABLED((TRUE));
- mTBOX_TRACE_SYNCHRONE((TRUE));
- mTBOX_FCT_ENTER("main");
- if(3 != argc)
- {
- mTBOX_TRACE((kTBOX_NIV_CRITICAL, "NOT ENOUGH OR TOO MANY INPUT ARGS\n"));
- mTBOX_RETURN -1;
- }
- /* Init TKEL */
- tkelErr = TKEL_Init();
- TKEL_ASSERT(tkelErr);
- /* Get input args */
- sscanf(argv[1], "%d", &readThreadNum);
- sscanf(argv[2], "%d", &calculateThreadNum);
- maxNumber = readThreadNum;
- if((readThreadNum <= 0 || readThreadNum > 10) || (calculateThreadNum <= 0 || calculateThreadNum > 10))
- {
- mTBOX_TRACE((kTBOX_NIV_CRITICAL, "\nBAD ARGS\n"));
- mTBOX_RETURN -1;
- }
- /* TO_DO */
- /* Create minuend and subtrahend queues */
- tkelErr = TKEL_CreateQueue(maxNumber,
- sizeof(int),
- &minuendQueId);
- TKEL_ASSERT(tkelErr);
- tkelErr = TKEL_CreateQueue(maxNumber,
- sizeof(int),
- &subtrahendQueId);
- TKEL_ASSERT(tkelErr);
- // TKEL_err TKEL_DeleteMutex(TKEL_mutex_id MutexID);
- // TKEL_DeleteQueue
- //
- /* TO_DO */
- /* Create mutexes and semaphores */
- tkelErr = TKEL_CreateSemaphore(MAX_THREAD_COUNT*3, &startSemaphore);
- TKEL_ASSERT(tkelErr);
- tkelErr = TKEL_CreateMutex(&minuendIndexMutex);
- TKEL_ASSERT(tkelErr);
- tkelErr = TKEL_CreateMutex(&subtrahendIndexMutex);
- TKEL_ASSERT(tkelErr);
- tkelErr = TKEL_CreateMutex(&resultsIndexMutex);
- TKEL_ASSERT(tkelErr);
- /* TO_DO */
- /* Create minuend, subtrahend and calculation threads using given functions*/
- for ( k = 0; k<readThreadNum; k++)
- {
- tkelErr = TKEL_CreateTask ( priority, taskNameRead, stackSize,
- readThreadFunc, (void*)TYPE_MINUEND, &readTask1[k]);
- TKEL_ASSERT(tkelErr);
- }
- for ( k = 0; k<readThreadNum; k++)
- {
- tkelErr = TKEL_CreateTask ( priority, taskNameRead, stackSize,
- readThreadFunc, (void*)TYPE_SUBTRAHEND, &readTask2[k]);
- TKEL_ASSERT(tkelErr);
- }
- for ( k = 0; k<calculateThreadNum; k++)
- {
- tkelErr = TKEL_CreateTask ( priority, taskNameCalc, stackSize,
- readThreadFunc, (void*)TYPE_SUBTRAHEND, &calcTask[k]);
- TKEL_ASSERT(tkelErr);
- }
- /* TO_DO */
- /* Trigger start semaphore for all threads */
- tkelErr = TKEL_SignalSemaphore(startSemaphore);
- TKEL_ASSERT(tkelErr);
- /* TO_DO */
- /* Wait for threads to finish */
- /* TO_DO */
- /* Deinit everything */
- for ( k = 0; k<readThreadNum; k++)
- {
- tkelErr = TKEL_DeleteTask(readTask1[k]);
- TKEL_ASSERT(tkelErr);
- }
- for ( k = 0; k<readThreadNum; k++)
- {
- tkelErr = TKEL_DeleteTask(readTask2[k]);
- TKEL_ASSERT(tkelErr);
- }
- for ( k = 0; k<calculateThreadNum; k++)
- {
- tkelErr = TKEL_DeleteTask(readTask2[k]);
- TKEL_ASSERT(tkelErr);
- }
- tkelErr = TKEL_DeleteSemaphore(startSemaphore);
- TKEL_ASSERT(tkelErr);
- tkelErr = TKEL_DeleteMutex(minuendIndexMutex);
- TKEL_ASSERT(tkelErr);
- tkelErr = TKEL_DeleteMutex(subtrahendIndexMutex);
- TKEL_ASSERT(tkelErr);
- tkelErr = TKEL_DeleteMutex(resultsIndexMutex);
- TKEL_ASSERT(tkelErr);
- tkelErr = TKEL_DeleteQueue(minuendQueId);
- TKEL_ASSERT(tkelErr);
- tkelErr = TKEL_DeleteQueue(subtrahendQueId);
- TKEL_ASSERT(tkelErr);
- /* Print result */
- printf("\nResult: ");
- for(i = 0; i < ARRAY_SIZE; i++)
- {
- printf("%d ", differenceArray[i]);
- }
- printf("\n");
- mTBOX_RETURN 0;
- }
- void readThreadFunc(void* arg)
- {
- ElementType threadType = (ElementType)arg;
- TKEL_err tkelErr;
- TKEL_WaitSemaphore(startSemaphore);
- while(1)
- {
- switch(threadType)
- {
- case TYPE_MINUEND:
- TKEL_LockMutex(minuendIndexMutex);
- if (minuendIndex == ARRAY_SIZE)
- {
- return;
- }
- minuendArray[minuendIndex];
- tkelErr = TKEL_Enqueue(minuendQueId,minuendArray[minuendIndex] );
- //TKEL_ASSERT(tkelErr);
- minuendIndex++;
- TKEL_UnlockMutex(minuendIndexMutex);
- break;
- case TYPE_SUBTRAHEND:
- TKEL_LockMutex(subtrahendIndexMutex);
- if (subtrahendIndex == ARRAY_SIZE)
- {
- return;
- }
- minuendArray[subtrahendQueId];
- tkelErr = TKEL_Enqueue(subtrahendQueId,subtrahendArray[subtrahendIndex] );
- //TKEL_ASSERT(tkelErr);
- subtrahendIndex++;
- TKEL_UnlockMutex(subtrahendIndexMutex);
- break;
- }
- }
- }
- void calculateThreadFunc(void *arg)
- {
- TKEL_WaitSemaphore(startSemaphore);
- /*
- TKEL_err TKEL_Dequeue(TKEL_queue_id queueID,
- void *message);
- */
- while(1)
- {
- // TO_DO
- TKEL_LockMutex(resultsIndexMutex);
- if (subtrahendIndex == ARRAY_SIZE)
- {
- return;
- }
- int minuend;
- int subtrahend;
- minuend = TKEL_Dequeue(minuendQueId, (void*) &minuend);
- subtrahend = TKEL_Dequeue(minuendQueId, (void*) &subtrahend);
- differenceArray[resultsIndex] = minuend - subtrahend;
- resultsIndexMutex++;
- TKEL_LockMutex(resultsIndexMutex);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement