📄 dvb_job.c
字号:
/******************************************************************************
(C)Copyright CHEERTEK Inc. 2007, K000 all rights reserved.
Product : CT216 Firmware
Date : 2007.09.12
Purpose : Provide dvb job api
******************************************************************************/
#include <stdio.h>
#include <string.h>
#include "ct_type.h"
#include "ct_os.h"
#include "dvb_job.h"
#include "dvb_sys.h"
#include "task_cfg.h"
/*******************************************************************************************/
//#define DVB_JOB_DEBUG
/*******************************************************************************************/
#define JOB_MSG(p) printf p
#ifdef DVB_JOB_DEBUG
#define JOB_DBG(p) printf p
#else //DVB_JOB_DEBUG
#define JOB_DBG(p)
#endif //DVB_JOB_DEBUG
/*******************************************************************************************/
typedef struct _ST_DVB_JOB_HANDLE_T
{
DVB_JOB_FN fpJobFunPtr;
u32 u32Param0;
u32 u32Param1;
u32 u32Param2;
u32 u32Param3;
u32 u32Param4;
u32 u32Param5;
}ST_DVB_JOB_HANDLE_T;
/*******************************************************************************************/
static bool8 b8DvbJobInit = FALSE;
static bool8 b8DvbJobAccessSemaphoreInit = FALSE;
static bool8 b8DvbJobNotifySemaphoreInit = FALSE;
static bool8 b8DvbJobTaskInit = FALSE;
static u32 u32DvbJobReadSlot = 0;
static u32 u32DvbJobWriteSlot = 0;
u8 au8DvbJobTaskStack[DVB_JOB_TASK_STACK_SIZE];
ST_DVB_JOB_HANDLE_T astDvbJobHandle[DVB_JOB_MAX_JOB_NUM];
CTOS_SEMAPHORE stDvbJobAccessSemaphore;
CTOS_SEMAPHORE stDvbJobNotifySemaphore;
CTOS_TASK stDvbJobTask;
/*******************************************************************************************/
void DVB_JOB_Task (u32 argc, void *argv)
{
u32 u32HandleSlot = 0;
u32 u32Count = 0;
while(1)
{
if (CT_OS_WaitOnSemaphore(&stDvbJobNotifySemaphore, CTOS_WAIT) == EN_CTOS_SUCCESS)
{
if (u32DvbJobReadSlot==u32DvbJobWriteSlot)
{
// No Job
continue;
}
if (u32DvbJobReadSlot>u32DvbJobWriteSlot)
{
// must u32DvbJobReadSlot <= u32DvbJobWriteSlot ,
// this status is Fail, reset all job
CT_OS_WaitOnSemaphore(&stDvbJobAccessSemaphore, CTOS_WAIT);
for (u32Count=0; u32Count< (u32)DVB_JOB_MAX_JOB_NUM; u32Count++)
{
astDvbJobHandle[u32Count].fpJobFunPtr = NULL;
astDvbJobHandle[u32Count].u32Param0 = 0;
astDvbJobHandle[u32Count].u32Param1 = 0;
astDvbJobHandle[u32Count].u32Param2 = 0;
astDvbJobHandle[u32Count].u32Param3 = 0;
astDvbJobHandle[u32Count].u32Param4 = 0;
astDvbJobHandle[u32Count].u32Param5 = 0;
}
u32DvbJobReadSlot = 0;
u32DvbJobWriteSlot = 0;
CT_OS_FreeSemaphore(&stDvbJobAccessSemaphore);
continue;
}
u32HandleSlot = u32DvbJobReadSlot%((u32)DVB_JOB_MAX_JOB_NUM);
if (astDvbJobHandle[u32HandleSlot].fpJobFunPtr != NULL)
{
astDvbJobHandle[u32HandleSlot].fpJobFunPtr( astDvbJobHandle[u32HandleSlot].u32Param0,
astDvbJobHandle[u32HandleSlot].u32Param1,
astDvbJobHandle[u32HandleSlot].u32Param2,
astDvbJobHandle[u32HandleSlot].u32Param3,
astDvbJobHandle[u32HandleSlot].u32Param4,
astDvbJobHandle[u32HandleSlot].u32Param5);
}
CT_OS_WaitOnSemaphore(&stDvbJobAccessSemaphore, CTOS_WAIT);
astDvbJobHandle[u32HandleSlot].fpJobFunPtr = NULL;
astDvbJobHandle[u32HandleSlot].u32Param0 = 0;
astDvbJobHandle[u32HandleSlot].u32Param1 = 0;
astDvbJobHandle[u32HandleSlot].u32Param2 = 0;
astDvbJobHandle[u32HandleSlot].u32Param3 = 0;
astDvbJobHandle[u32HandleSlot].u32Param4 = 0;
astDvbJobHandle[u32HandleSlot].u32Param5 = 0;
u32DvbJobReadSlot++;
if (u32DvbJobReadSlot==u32DvbJobWriteSlot)
{
u32DvbJobReadSlot = 0;
u32DvbJobWriteSlot = 0;
}
CT_OS_FreeSemaphore(&stDvbJobAccessSemaphore);
//JOB_MSG(("J"));
}
}
}
/*******************************************************************************************/
bool8 DVB_JOB_Init(void)
{
EN_CTOS_STATUS enStatus = EN_CTOS_SUCCESS;
u32 u32Count = 0;
if (b8DvbJobInit==FALSE)
{
if (b8DvbJobAccessSemaphoreInit==FALSE)
{
enStatus = CT_OS_CreateSemaphore (&stDvbJobAccessSemaphore, "DVBJOBA", 1, EN_CTOS_SUSPEND_FIFO);
if (enStatus != EN_CTOS_SUCCESS)
{
JOB_MSG(("Job Init Access Semaphore Fail [%ld]\n", (u32)enStatus));
return FALSE;
}
b8DvbJobAccessSemaphoreInit = TRUE;
}
if (b8DvbJobNotifySemaphoreInit==FALSE)
{
enStatus = CT_OS_CreateSemaphore (&stDvbJobNotifySemaphore, "DVBJOBN", 0, EN_CTOS_SUSPEND_FIFO);
if (enStatus != EN_CTOS_SUCCESS)
{
JOB_MSG(("Job Init Notify Semaphore Fail [%ld]\n", (u32)enStatus));
return FALSE;
}
b8DvbJobNotifySemaphoreInit = TRUE;
}
if (b8DvbJobTaskInit==FALSE)
{
enStatus = CT_OS_CreateTask(&stDvbJobTask,
"DVBJOB",
DVB_JOB_Task,
&au8DvbJobTaskStack[0],
DVB_JOB_TASK_STACK_SIZE,
DVB_JOB_TASK_PRIORITY,
DVB_JOB_TASK_TIME_SLICE);
if (enStatus != EN_CTOS_SUCCESS)
{
JOB_MSG(("Job Create Task Fail [%ld]\n", (u32)enStatus));
return FALSE;
}
b8DvbJobTaskInit = TRUE;
}
if (CT_OS_ResumeTask (&stDvbJobTask) != EN_CTOS_SUCCESS)
{
return FALSE;
}
CT_OS_WaitOnSemaphore(&stDvbJobAccessSemaphore, CTOS_WAIT);
for (u32Count=0; u32Count< (u32)DVB_JOB_MAX_JOB_NUM; u32Count++)
{
astDvbJobHandle[u32Count].fpJobFunPtr = NULL;
astDvbJobHandle[u32Count].u32Param0 = 0;
astDvbJobHandle[u32Count].u32Param1 = 0;
astDvbJobHandle[u32Count].u32Param2 = 0;
astDvbJobHandle[u32Count].u32Param3 = 0;
astDvbJobHandle[u32Count].u32Param4 = 0;
astDvbJobHandle[u32Count].u32Param5 = 0;
}
u32DvbJobReadSlot = 0;
u32DvbJobWriteSlot = 0;
CT_OS_FreeSemaphore(&stDvbJobAccessSemaphore);
b8DvbJobInit = TRUE;
}
return TRUE;
}
/*******************************************************************************************/
bool8 DVB_JOB_Add(DVB_JOB_FN fpJobFunPtr, u32* pu32JobID, u32 u32Param0, u32 u32Param1, u32 u32Param2, u32 u32Param3, u32 u32Param4, u32 u32Param5)
{
u32 u32HandleSlot = 0;
if ((fpJobFunPtr==NULL)||
(pu32JobID==NULL))
{
JOB_MSG(("\n>> DVB_JOB_Add() Fail, Job Function Pointer is NULL\n"));
return FALSE;
}
if ((u32DvbJobWriteSlot-u32DvbJobReadSlot)>=(u32)DVB_JOB_MAX_JOB_NUM)
{
JOB_MSG(("\n>> DVB_JOB_Add() Fail, Job Queue Full\n"));
return FALSE;
}
CT_OS_WaitOnSemaphore(&stDvbJobAccessSemaphore, CTOS_WAIT);
*pu32JobID = u32DvbJobWriteSlot;
u32HandleSlot = u32DvbJobWriteSlot%((u32)DVB_JOB_MAX_JOB_NUM);
astDvbJobHandle[u32HandleSlot].fpJobFunPtr = fpJobFunPtr;
astDvbJobHandle[u32HandleSlot].u32Param0 = u32Param0;
astDvbJobHandle[u32HandleSlot].u32Param1 = u32Param1;
astDvbJobHandle[u32HandleSlot].u32Param2 = u32Param2;
astDvbJobHandle[u32HandleSlot].u32Param3 = u32Param3;
astDvbJobHandle[u32HandleSlot].u32Param4 = u32Param4;
astDvbJobHandle[u32HandleSlot].u32Param5 = u32Param5;
u32DvbJobWriteSlot++;
CT_OS_FreeSemaphore(&stDvbJobAccessSemaphore);
CT_OS_FreeSemaphore(&stDvbJobNotifySemaphore);
return TRUE;
}
/*******************************************************************************************/
bool8 DVB_JOB_CheckExist(u32 u32JobID)
{
u32 u32HandleSlot = 0;
u32HandleSlot = u32JobID%((u32)DVB_JOB_MAX_JOB_NUM);
if (astDvbJobHandle[u32HandleSlot].fpJobFunPtr==NULL)
{
return FALSE;
}
return TRUE;
}
/*******************************************************************************************/
#ifdef DVB_JOB_DEBUG
void JOB_TestProcess(u32 u32Param0, u32 u32Param1, u32 u32Param2, u32 u32Param3, u32 u32Param4, u32 u32Param5)
{
u32 u32Count = 0;
for (u32Count=0; u32Count<10; u32Count++)
{
JOB_DBG(("\n>> JOB_TestProcess[%02ld:%02ld] : %ld\n", u32Param0, u32Param1, u32Count));
CT_OS_MS_Delay(1000);
}
}
#endif //DVB_JOB_DEBUG
/*******************************************************************************************/
#ifdef DVB_JOB_DEBUG
void DVB_JOB_Test(u32 u32Mode, u32 u32Param1, u32 u32Param2)
{
u32 u32Count = 0;
u32 u32JobID = 0;
JOB_DBG(("\n>> DVB_JOB Test Mode = %ld", u32Mode));
switch(u32Mode)
{
default:
case 0:
break;
case 1:
if (DVB_JOB_Init()!=TRUE)
{
JOB_DBG(("\n>> DVB_JOB_Init() Fail\n"));
}
else
{
JOB_DBG(("\n>> DVB_JOB_Init() Success\n"));
}
break;
case 2:
JOB_DBG(("\n>> u32DvbJobWriteSlot = %ld", u32DvbJobWriteSlot));
JOB_DBG(("\n>> u32DvbJobReadSlot = %ld\n", u32DvbJobReadSlot));
break;
case 3:
if (DVB_JOB_Add( (DVB_JOB_FN)JOB_TestProcess,
&u32JobID,
u32Param1,
u32Param2,
0,
0,
0,
0)!=TRUE)
{
JOB_DBG(("\n>> DVB_JOB_Add() Fail\n"));
}
else
{
JOB_DBG(("\n>> DVB_JOB_Add() Success, u32JobID = 0x%08lX\n", u32JobID));
while(1)
{
if (DVB_JOB_CheckExist(u32JobID)==FALSE)
{
JOB_DBG(("\n>> JOB_TestProcess , Process Finish\n"));
break;
}
JOB_DBG(("\n>> JOB_TestProcess, Wait ...\n"));
CT_OS_MS_Delay(500);
}
}
break;
case 4:
for (u32Count=0; u32Count< (u32)DVB_JOB_MAX_JOB_NUM; u32Count++)
{
if (DVB_JOB_Add( (DVB_JOB_FN)JOB_TestProcess,
&u32JobID,
u32Count,
u32Param2,
0,
0,
0,
0)!=TRUE)
{
JOB_DBG(("\n>> DVB_JOB_Add() Fail, %ld\n", u32Count));
}
else
{
JOB_DBG(("\n>> DVB_JOB_Add() Success, %ld\n", u32JobID));
}
}
break;
}
}
#endif //DVB_JOB_DEBUG
/*******************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -