os_api.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:5k
源码类别:

uCOS

开发平台:

C/C++

  1. //*------------------------------------------------------------------------------------------------
  2. //* 文件名 : os_api.c
  3. //* 功能描述 : 基于uC/OS基本函数库开发的能够最大限度满足上层系统需求的API。
  4. //* 作者     : 焦海波
  5. //* 版本 : 0.1
  6. //* 建立日期、时间 : 2006/06/10 10:45
  7. //* 最近修改日期、时间 : 
  8. //* 修改原因 : 
  9. //*------------------------------------------------------------------------------------------------
  10. //*------------------------------------------ 头文件 -----------------------------------------------
  11. //#include "/uCOS_II/SOURCE/includes.h"
  12. #include "os_api.h"
  13. //*================================================================================================
  14. //* 函 数 区
  15. //*================================================================================================
  16. //*------------------------------------------------------------------------------------------------
  17. //* 函数名称 : OSAPISemWait
  18. //* 功能描述 : 在指定的时间内(单位为毫秒)等待指定的信号量可用
  19. //* 入口参数 :     <hSem>[in] 等待的信号量句柄
  20. //*  : <uwWaitMS>[in] 指定最长等待时间单位为毫秒,实际等待时间为内核调度间隔时间的整数倍,
  21. //*  :                0ms表示该函数将无限期等待下去直至信号量可用
  22. //* 出口参数 : - OS_NO_ERR         : 信号量可用
  23. //*  : - OS_TIMEOUT        : 时间溢出,信号量不可用
  24. //*  : - OS_ERR_EVENT_TYPE : hSem参数携带的事件类型并不是信号量而是其它类型
  25. //*  : - OS_ERR_PEND_ISR   : 不能在ISR中调用该函数
  26. //*  : - OS_ERR_PEVENT_NULL: hSem是一个空指针
  27. //*------------------------------------------------------------------------------------------------
  28. UBYTE OSAPISemWait(HANDLER hSem, UWORD uwWaitMS)
  29. {
  30. UWORD __uwDelayTicks;
  31. UBYTE __ubRtnVal;
  32. if(uwWaitMS != 0)
  33. {
  34. __uwDelayTicks = (uwWaitMS * OS_TICKS_PER_SEC)/1000;
  35. if(__uwDelayTicks < 1)
  36. __uwDelayTicks = 1;
  37. else if(__uwDelayTicks > 65535)
  38. __uwDelayTicks = 65535;
  39. else;
  40. }
  41. else
  42. __uwDelayTicks = 0;
  43. OSSemPend(hSem, __uwDelayTicks, &__ubRtnVal);
  44. return __ubRtnVal;
  45. }
  46. //*------------------------------------------------------------------------------------------------
  47. //* 函数名称 : OSAPISemFree
  48. //* 功能描述 : 删除指定的信号量,如果仍然有任务在等待指定的信号量,该函数不会删除这个信号量,不过它会不断尝
  49. //* : 试删除这个信号量直至没有任何任务等待该信号量时将其删除
  50. //* 入口参数 :      <hSem>[in] 指定删除的信号量句柄
  51. //* 出口参数 : 无
  52. //*------------------------------------------------------------------------------------------------
  53. void OSAPISemFree(HANDLER hSem)
  54. {
  55. UBYTE __ubErr;
  56. while(NULL != OSSemDel(hSem, OS_DEL_NO_PEND, &__ubErr))
  57. OSTimeDlyHMSM(0, 0, 0, 100);
  58. }
  59. //*------------------------------------------------------------------------------------------------
  60. //* 函数名称 : OSAPISemFreeExt
  61. //* 功能描述 : 删除指定的信号量,该函数相对于OSAPISemFree()函数,当出现仍然有任务在等待该信号量的情况时,所
  62. //* : 有等待该信号量的任务都将进入就绪态,每个任务都得到了该信号量。
  63. //* 入口参数 :      <hSem>[in] 指定删除的信号量句柄
  64. //* 出口参数 : 无
  65. //*------------------------------------------------------------------------------------------------
  66. void OSAPISemFreeExt(HANDLER hSem)
  67. {
  68. UBYTE __ubErr;
  69. while(NULL != OSSemDel(hSem, OS_DEL_ALWAYS, &__ubErr))
  70. OSTimeDlyHMSM(0, 0, 0, 100);
  71. }
  72. //*------------------------------------------------------------------------------------------------
  73. //* 函数名称 : OSAPIBlockNew
  74. //* 功能描述 : 建立一个新的阻塞信号
  75. //* 入口参数 : <ubPIP>[in] 指定在出现优先级反转时(高优先级的任务因为低优先级的任务占用同一个阻塞量而不得不
  76. //* :             暂时中断正常运行以等待该阻塞量被释放从而造成事实上的优先级降低的问题),正在占用
  77. //* :             该阻塞量的任务使用的较高优先级以便能够快速完成访问,释放该阻塞量 
  78. //* 出口参数 : 建立成功返回阻塞信号句柄,否则为NULL
  79. //*------------------------------------------------------------------------------------------------
  80. HANDLER OSAPIBlockNew(UBYTE ubPIP)
  81. {
  82. UBYTE __ubErr;
  83. return OSMutexCreate(ubPIP, &__ubErr);
  84. }
  85. //*------------------------------------------------------------------------------------------------
  86. //* 函数名称 : OSAPIBlockEnter
  87. //* 功能描述 : 进入阻塞资源,如果该资源仍然被其它任务占用,则会阻塞当前任务进程,直至指定的时间溢出或者资源
  88. //*         : 可用
  89. //* 入口参数 :   <hBlock>[in] 指定要使用的阻塞信号量
  90. //* : <uwWaitMS>[in] 指定被阻塞的最长时间,单位为毫秒 
  91. //* 出口参数 : - OS_NO_ERR         : 信号量可用
  92. //* : - OS_TIMEOUT        : 时间溢出,信号量不可用
  93. //* : - OS_ERR_EVENT_TYPE : hSem参数携带的事件类型并不是信号量而是其它类型
  94. //* : - OS_ERR_PEND_ISR   : 不能在ISR中调用该函数
  95. //* : - OS_ERR_PEVENT_NULL: hSem是一个空指针
  96. //*------------------------------------------------------------------------------------------------
  97. UBYTE OSAPIBlockEnter(HANDLER hBlock, UWORD uwWaitMS)
  98. {
  99. UWORD __uwDelayTicks;
  100. UBYTE __ubRtnVal;
  101. if(uwWaitMS != 0)
  102. {
  103. __uwDelayTicks = (uwWaitMS * OS_TICKS_PER_SEC)/1000;
  104. if(__uwDelayTicks < 1)
  105. __uwDelayTicks = 1;
  106. else if(__uwDelayTicks > 65535)
  107. __uwDelayTicks = 65535;
  108. else;
  109. }
  110. else
  111. __uwDelayTicks = 0;
  112. OSMutexPend(hBlock, __uwDelayTicks, &__ubRtnVal);
  113. return __ubRtnVal;
  114. }