osp.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:9k
源码类别:

DVD

开发平台:

C/C++

  1. #include <osp.h>
  2. #include <task.h>
  3. #include <message.h>
  4. #include <ostime.h>
  5. #include <string.h>
  6. #include <stddefs.h>
  7. #include "stcommon.h"
  8. /*
  9. #ifdef ST_OS21
  10. #define MS_TO_TICKS(X) ((X)*(time_ticks_per_sec()/1000))
  11. #else
  12. #define MS_TO_TICKS(X) ((X)*(ST_GetClocksPerSecond()/1000))
  13. #endif
  14. */
  15. static OSP_TaskInfo *taskLink = NULL;
  16. static T_OSP_QueueInfo *queueLink = NULL;
  17. static void KD_InserTaskNode(OSP_TaskInfo *node)
  18. {
  19. if(node != NULL)
  20. {
  21. node->pNext = taskLink;
  22. taskLink = node;
  23. }
  24. }
  25. static OSP_TaskInfo* KD_RemoveTaskNode(task_t *taskId)
  26. {
  27. OSP_TaskInfo *cur, *prv;
  28. cur = taskLink;
  29. prv = NULL;
  30. while((cur != NULL) && (cur->pTask != taskId))
  31. {
  32. prv = cur;
  33. cur = cur->pNext;
  34. }
  35. if(cur != NULL)
  36. {
  37. if(cur == taskLink)
  38. {
  39. taskLink = taskLink->pNext;
  40. cur->pNext = NULL;
  41. }
  42. else
  43. {
  44. prv->pNext = cur->pNext;
  45. cur->pNext = NULL;
  46. }
  47. }
  48. return cur;
  49. }
  50. //modified by whale 07/06/03
  51. //static void InserQueueNode(T_OSP_QueueInfo *node)
  52. void InserQueueNode(T_OSP_QueueInfo *node)
  53. {
  54. if(node != NULL)
  55. {
  56. node->pNext = queueLink;
  57. queueLink = node;
  58. }
  59. }
  60. static T_OSP_QueueInfo* RemoveQueueNode(message_queue_t *queueId)
  61. {
  62. T_OSP_QueueInfo *cur, *prv;
  63. cur = queueLink;
  64. prv = NULL;
  65. while((cur != NULL) && (cur->pQueueId != queueId))
  66. {
  67. prv = cur;
  68. cur = cur->pNext;
  69. }
  70. if(cur != NULL)
  71. {
  72. if(cur == queueLink)
  73. {
  74. queueLink = queueLink->pNext;
  75. cur->pNext = NULL;
  76. }
  77. else
  78. {
  79. prv->pNext = cur->pNext;
  80. cur->pNext = NULL;
  81. }
  82. }
  83. return cur;
  84. }
  85. KB_OSPRet KB_OSPInit(void)
  86. {
  87. return Ret_OK;
  88. }
  89. KB_OSPRet KB_OSPTaskInit
  90. (
  91. const char* pName, 
  92. UINT32 dStackSize, 
  93. void (*entryPoint)(void*),
  94. INT32 dPriority, 
  95. void *pPara, 
  96. UINT32 *pTaskId
  97. )
  98. {
  99. OSP_TaskInfo *pTaskInfo;
  100. int Error;
  101. pTaskInfo = (OSP_TaskInfo*)KB_OSPMalloc(sizeof(OSP_TaskInfo));
  102. if(pTaskInfo == NULL)
  103. {
  104. return Ret_Fail;
  105. }
  106. pTaskInfo->pTaskStack = (UINT8 *)KB_OSPMalloc(dStackSize);
  107. pTaskInfo->pTaskDesc = (tdesc_t *)KB_OSPMalloc(sizeof(tdesc_t));
  108. pTaskInfo->pTask = (task_t *)KB_OSPMalloc(sizeof(task_t));
  109. if( (pTaskInfo->pTaskStack == NULL) || (pTaskInfo->pTaskDesc == NULL) 
  110.    || (pTaskInfo->pTask == NULL) )
  111. {
  112. KB_OSPFree((void*)pTaskInfo->pTaskStack);
  113. KB_OSPFree((void*)pTaskInfo->pTaskDesc);
  114. KB_OSPFree((void*)pTaskInfo->pTask);
  115. KB_OSPFree((void*)pTaskInfo);
  116. return Ret_Fail;
  117. }
  118. Error = task_init((void (*)(void *))entryPoint, (void *)pPara,
  119.              (void *)pTaskInfo->pTaskStack, (size_t)dStackSize,
  120.              pTaskInfo->pTask, pTaskInfo->pTaskDesc,
  121.             (int)(dPriority * OS20_PRIORITY_LEVELS / 256),
  122.             pName, 0);
  123. if(Error != 0)
  124. {
  125. KB_OSPFree((void*)pTaskInfo->pTaskStack);
  126. KB_OSPFree((void*)pTaskInfo->pTaskDesc);
  127. KB_OSPFree((void*)pTaskInfo->pTask);
  128. KB_OSPFree((void*)pTaskInfo);
  129. return Ret_Fail;
  130. }
  131. *pTaskId = (UINT32)pTaskInfo->pTask;
  132. KD_InserTaskNode(pTaskInfo);
  133. return Ret_OK;
  134. }
  135. KB_OSPRet KB_OSPTaskSetPri(UINT32 dTaskId, INT32 dPriority)
  136. {
  137. task_priority_set((task_t*)dTaskId, (int)(dPriority * OS20_PRIORITY_LEVELS / 256));
  138. return Ret_OK;
  139. }
  140. UINT32 KB_OSPTaskGetID(void)
  141. {
  142. return (UINT32)task_id();
  143. }
  144. KB_OSPRet KB_OSPTaskDelay(UINT32 dMilliSeconds)
  145. {
  146.     task_delay((clock_t)MS_TO_TICKS(dMilliSeconds));
  147. return Ret_OK;
  148. }
  149. KB_OSPRet KB_OSPTaskSus(UINT32 dTaskId)
  150. {
  151. if(task_suspend((task_t*)dTaskId)==0)
  152. return Ret_OK;
  153. else
  154. return Ret_Fail;
  155. }
  156. KB_OSPRet KB_OSPTaskRes(UINT32 dTaskId)
  157. {
  158. if(task_resume((task_t*)dTaskId) == 0)
  159. return Ret_OK;
  160. else
  161. return Ret_Fail;
  162. }
  163. KB_OSPRet KB_OSPTaskDel(UINT32 dTaskId)
  164. {
  165. OSP_TaskInfo *pTaskInfo;
  166. task_t* task = (task_t*)dTaskId;
  167. pTaskInfo = KD_RemoveTaskNode(task);
  168. task_kill(task, 0, 0);
  169.     task_wait(&task, 1, TIMEOUT_IMMEDIATE);
  170.     
  171. task_delete(task);
  172. if(pTaskInfo != NULL)
  173. {
  174. KB_OSPFree((void*)pTaskInfo->pTaskStack);
  175. KB_OSPFree((void*)pTaskInfo->pTaskDesc);
  176. KB_OSPFree((void*)pTaskInfo->pTask);
  177. KB_OSPFree((void*)pTaskInfo);
  178. }
  179. return Ret_OK;
  180. }
  181. KB_OSPRet KB_OSPQueInit
  182. (
  183. const char* pName, 
  184. UINT32 dMaxMessages, 
  185. UINT32 *pQueueId
  186. )
  187. {
  188. T_OSP_QueueInfo *pQueueInfo;
  189. if((pQueueId == NULL) || (dMaxMessages == 0))
  190. return Ret_ParErr;
  191. pQueueInfo = (T_OSP_QueueInfo*)KB_OSPMalloc(sizeof(T_OSP_QueueInfo));
  192. if(pQueueInfo == NULL)
  193. {
  194. return Ret_Fail;
  195. }
  196. pQueueInfo->pQueueId = (message_queue_t*)KB_OSPMalloc(sizeof(message_queue_t));
  197. pQueueInfo->pQueueBuf = (void*)KB_OSPMalloc(MESSAGE_MEMSIZE_QUEUE(sizeof(KB_OSPMsgNode), dMaxMessages));
  198. if( (pQueueInfo->pQueueId == NULL)
  199. || (pQueueInfo->pQueueBuf == NULL) )
  200. {
  201. KB_OSPFree((void*)pQueueInfo->pQueueId);
  202. KB_OSPFree((void*)pQueueInfo->pQueueBuf);
  203. KB_OSPFree((void*)pQueueInfo);
  204. return Ret_Fail;
  205. }
  206. message_init_queue_timeout(pQueueInfo->pQueueId, pQueueInfo->pQueueBuf, sizeof(KB_OSPMsgNode),
  207.    (unsigned int)dMaxMessages);
  208. *pQueueId = (UINT32)pQueueInfo->pQueueId;
  209. InserQueueNode(pQueueInfo);
  210. return Ret_OK;
  211. }
  212. KB_OSPRet KB_OSPQueDel(UINT32 nQueID)
  213. {
  214. T_OSP_QueueInfo *pQueueInfo;
  215. pQueueInfo = RemoveQueueNode((message_queue_t*)nQueID);
  216. message_delete_queue((message_queue_t*)nQueID);
  217. if(pQueueInfo != NULL)
  218. {
  219. /* 回收已分配的内存 */
  220. KB_OSPFree((void*)pQueueInfo->pQueueId);
  221. KB_OSPFree((void*)pQueueInfo->pQueueBuf);
  222. KB_OSPFree((void*)pQueueInfo);
  223. }
  224. return Ret_OK;
  225. }
  226. KB_OSPRet KB_OSPMsgSend
  227. (
  228. UINT32 nQueID,
  229. KB_OSPMsgNode *pMsgNode
  230. )
  231. {
  232. KB_OSPMsgNode * PtMessage;
  233. if(pMsgNode == NULL) return Ret_ParErr;
  234.     PtMessage = (KB_OSPMsgNode *)message_claim_timeout((message_queue_t*)nQueID, (clock_t*)TIMEOUT_IMMEDIATE);
  235. if(PtMessage == NULL) return Ret_Fail;
  236.     memcpy(PtMessage, pMsgNode, sizeof(KB_OSPMsgNode));
  237. message_send((message_queue_t*)nQueID, (void*)PtMessage);
  238. return Ret_OK;
  239. }
  240. KB_OSPRet KB_OSPMsgGet
  241. (
  242. UINT32 nQueID,
  243. KB_OSPWaitMode nWaitMode,
  244. UINT32 nTime,
  245. KB_OSPMsgNode *pMsgNode
  246. )
  247. {
  248. INT32  dReturnType;
  249. void*  pMessageReceived;
  250. clock_t *dWaitTime;
  251. clock_t  time;
  252. if(pMsgNode == NULL) return Ret_ParErr;
  253. if(nWaitMode == KD_NoWait)
  254. {
  255. dWaitTime = (clock_t*)TIMEOUT_IMMEDIATE;
  256. }
  257. else if(nWaitMode == KB_Wait)
  258. {
  259. if(nTime == 0)
  260. {
  261. dWaitTime = (clock_t*)TIMEOUT_INFINITY;
  262. }
  263. else
  264. {
  265. time = time_plus(time_now(), (clock_t)MS_TO_TICKS(nTime));
  266. dWaitTime = &time;
  267. }
  268. }
  269. else
  270. {
  271. return Ret_ParErr;
  272. }
  273. pMessageReceived = message_receive_timeout((message_queue_t*)nQueID, dWaitTime);
  274. if(pMessageReceived != NULL)
  275. {
  276. memcpy(pMsgNode, pMessageReceived, sizeof(KB_OSPMsgNode));
  277. message_release((message_queue_t*)nQueID, pMessageReceived);
  278. dReturnType = Ret_OK;
  279. }
  280. else
  281. {
  282. dReturnType = Ret_Fail;
  283. }
  284. return dReturnType;
  285. }
  286. KB_OSPRet KB_OSPSemInit
  287. (
  288. const char* pName, 
  289. UINT32 nSemMax, 
  290. KB_OSPQueMode nQueMode,
  291. UINT32 *pSemID
  292. )
  293. {
  294. semaphore_t *pSemaphoreCreated;
  295. if( (nQueMode != J_OSP_WAIT_FIFO)
  296. && (nQueMode != J_OSP_WAIT_PRIO) )
  297. {
  298. return Ret_ParErr;
  299. }
  300. pSemaphoreCreated = KB_OSPMalloc(sizeof(semaphore_t));
  301. if(pSemaphoreCreated == NULL) return Ret_Fail;
  302. if(nQueMode == J_OSP_WAIT_FIFO)
  303. {
  304. semaphore_init_fifo_timeout(pSemaphoreCreated, (int)nSemMax);
  305. }
  306. else if(nQueMode == J_OSP_WAIT_PRIO)
  307. {
  308. semaphore_init_priority_timeout(pSemaphoreCreated, (int)nSemMax);
  309. }
  310. *pSemID = (UINT32)pSemaphoreCreated;
  311. return Ret_OK;
  312. }
  313. KB_OSPRet KB_OSPSemDel(UINT32 nSemId)
  314. {
  315. semaphore_delete((semaphore_t*)nSemId);
  316. KB_OSPFree((void *)nSemId);
  317. return Ret_OK;
  318. }
  319. KB_OSPRet KB_OSPSemGet
  320. (
  321. UINT32 nSemId,
  322. KB_OSPWaitMode nWaitMode,
  323. UINT32 nTime
  324. )
  325. {
  326. INT32 dReturnType;
  327. clock_t *dWaitTime;
  328. clock_t  time;
  329. if(nWaitMode == KD_NoWait)
  330. {
  331. dWaitTime = (clock_t*)TIMEOUT_IMMEDIATE;
  332. }
  333. else if(nWaitMode == KB_Wait)
  334. {
  335. if(nTime == 0)
  336. {
  337. dWaitTime = (clock_t*)TIMEOUT_INFINITY;
  338. }
  339. else
  340. {
  341. time = time_plus(time_now(), (clock_t)MS_TO_TICKS(nTime));
  342. dWaitTime = &time;
  343. }
  344. }
  345. else
  346. {
  347. return Ret_ParErr;
  348. }
  349. if(0 == semaphore_wait_timeout((semaphore_t*)nSemId, dWaitTime))
  350. {
  351. dReturnType = Ret_OK;
  352. }
  353. else
  354. {
  355. dReturnType = Ret_Timeout;
  356. }
  357. return dReturnType;
  358. }
  359. KB_OSPRet KB_OSPSemSet(UINT32 nSemId)
  360. {
  361. semaphore_signal((semaphore_t*)nSemId);
  362. return Ret_OK;
  363. }
  364. extern partition_t *SystemPartition;
  365. extern void SRCHK_RecordMemoryStatus(void);
  366. extern void SRCHK_ShowMemoryStatus(void);
  367. void* KB_OSPMalloc(UINT32 dSize)
  368. {
  369. void*p=NULL;
  370. //add byshriek
  371. if(dSize<=0)
  372. return NULL;
  373. //shriek end
  374. p = memory_allocate(SystemPartition,(size_t)dSize);
  375. if(p==NULL)
  376. printf("nmemory_allocate null size[%ld]",dSize);
  377. return p; 
  378. }
  379. KB_OSPRet KB_OSPFree(void *pFree)
  380. {
  381. if(pFree == NULL) return Ret_Fail;
  382. memory_deallocate(SystemPartition, pFree);
  383. return Ret_OK;
  384. }
  385. /* EOF */