训练营PLSR题目
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

2515 行
120 KiB

  1. /*
  2. ************************************************************************************************************************
  3. * uC/OS-III
  4. * The Real-Time Kernel
  5. *
  6. * (c) Copyright 2009-2014; Micrium, Inc.; Weston, FL
  7. * All rights reserved. Protected by international copyright laws.
  8. *
  9. * File : OS.H
  10. * By : JJL
  11. * Version : V3.04.04
  12. *
  13. * LICENSING TERMS:
  14. * ---------------
  15. * uC/OS-III is provided in source form for FREE short-term evaluation, for educational use or
  16. * for peaceful research. If you plan or intend to use uC/OS-III in a commercial application/
  17. * product then, you need to contact Micrium to properly license uC/OS-III for its use in your
  18. * application/product. We provide ALL the source code for your convenience and to help you
  19. * experience uC/OS-III. The fact that the source is provided does NOT mean that you can use
  20. * it commercially without paying a licensing fee.
  21. *
  22. * Knowledge of the source code may NOT be used to develop a similar product.
  23. *
  24. * Please help us continue to provide the embedded community with the finest software available.
  25. * Your honesty is greatly appreciated.
  26. *
  27. * You can find our product's user manual, API reference, release notes and
  28. * more information at https://doc.micrium.com.
  29. * You can contact us at www.micrium.com.
  30. ************************************************************************************************************************
  31. * Note(s) : (1) Assumes the following versions (or more recent) of software modules are included in the project build:
  32. *
  33. * (a) uC/LIB V1.36.01
  34. * (b) uC/CPU V1.29.00
  35. ************************************************************************************************************************
  36. */
  37. #ifndef OS_H
  38. #define OS_H
  39. /*
  40. ************************************************************************************************************************
  41. * uC/OS-III VERSION NUMBER
  42. ************************************************************************************************************************
  43. */
  44. #define OS_VERSION 30404u /* Version of uC/OS-III (Vx.yy.zz mult. by 10000) */
  45. /*
  46. ************************************************************************************************************************
  47. * INCLUDE HEADER FILES
  48. ************************************************************************************************************************
  49. */
  50. #include <os_cfg.h>
  51. #include <cpu_core.h>
  52. #include <lib_def.h>
  53. #include "os_type.h"
  54. #include <os_cpu.h>
  55. #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
  56. #include <trace_os.h>
  57. #endif
  58. /*
  59. ************************************************************************************************************************
  60. * CRITICAL SECTION HANDLING
  61. ************************************************************************************************************************
  62. */
  63. #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u && defined(CPU_CFG_INT_DIS_MEAS_EN)
  64. #define OS_SCHED_LOCK_TIME_MEAS_START() OS_SchedLockTimeMeasStart()
  65. #else
  66. #define OS_SCHED_LOCK_TIME_MEAS_START()
  67. #endif
  68. #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u && defined(CPU_CFG_INT_DIS_MEAS_EN)
  69. #define OS_SCHED_LOCK_TIME_MEAS_STOP() OS_SchedLockTimeMeasStop()
  70. #else
  71. #define OS_SCHED_LOCK_TIME_MEAS_STOP()
  72. #endif
  73. #if OS_CFG_ISR_POST_DEFERRED_EN > 0u /* Deferred ISR Posts ------------------------------ */
  74. /* Lock the scheduler */
  75. #define OS_CRITICAL_ENTER() \
  76. do { \
  77. CPU_CRITICAL_ENTER(); \
  78. OSSchedLockNestingCtr++; \
  79. if (OSSchedLockNestingCtr == 1u) { \
  80. OS_SCHED_LOCK_TIME_MEAS_START(); \
  81. } \
  82. CPU_CRITICAL_EXIT(); \
  83. } while (0)
  84. /* Lock the scheduler but re-enable interrupts */
  85. #define OS_CRITICAL_ENTER_CPU_EXIT() \
  86. do { \
  87. OSSchedLockNestingCtr++; \
  88. \
  89. if (OSSchedLockNestingCtr == 1u) { \
  90. OS_SCHED_LOCK_TIME_MEAS_START(); \
  91. } \
  92. CPU_CRITICAL_EXIT(); \
  93. } while (0)
  94. /* Scheduling occurs only if an interrupt occurs */
  95. #define OS_CRITICAL_EXIT() \
  96. do { \
  97. CPU_CRITICAL_ENTER(); \
  98. OSSchedLockNestingCtr--; \
  99. if (OSSchedLockNestingCtr == (OS_NESTING_CTR)0) { \
  100. OS_SCHED_LOCK_TIME_MEAS_STOP(); \
  101. if (OSIntQNbrEntries > (OS_OBJ_QTY)0) { \
  102. CPU_CRITICAL_EXIT(); \
  103. OS_Sched0(); \
  104. } else { \
  105. CPU_CRITICAL_EXIT(); \
  106. } \
  107. } else { \
  108. CPU_CRITICAL_EXIT(); \
  109. } \
  110. } while (0)
  111. #define OS_CRITICAL_EXIT_NO_SCHED() \
  112. do { \
  113. CPU_CRITICAL_ENTER(); \
  114. OSSchedLockNestingCtr--; \
  115. if (OSSchedLockNestingCtr == (OS_NESTING_CTR)0) { \
  116. OS_SCHED_LOCK_TIME_MEAS_STOP(); \
  117. } \
  118. CPU_CRITICAL_EXIT(); \
  119. } while (0)
  120. #else /* Direct ISR Posts -------------------------------- */
  121. #define OS_CRITICAL_ENTER() CPU_CRITICAL_ENTER()
  122. #define OS_CRITICAL_ENTER_CPU_EXIT()
  123. #define OS_CRITICAL_EXIT() CPU_CRITICAL_EXIT()
  124. #define OS_CRITICAL_EXIT_NO_SCHED() CPU_CRITICAL_EXIT()
  125. #endif
  126. /*
  127. ************************************************************************************************************************
  128. * MISCELLANEOUS
  129. ************************************************************************************************************************
  130. */
  131. #ifdef OS_GLOBALS
  132. #define OS_EXT
  133. #else
  134. #define OS_EXT extern
  135. #endif
  136. #define OS_PRIO_TBL_SIZE ((OS_CFG_PRIO_MAX - 1u) / (DEF_INT_CPU_NBR_BITS) + 1u)
  137. #define OS_MSG_EN (((OS_CFG_TASK_Q_EN > 0u) || (OS_CFG_Q_EN > 0u)) ? 1u : 0u)
  138. #define OS_OBJ_TYPE_REQ (((OS_CFG_DBG_EN > 0u) || (OS_CFG_OBJ_TYPE_CHK_EN > 0u) || (OS_CFG_PEND_MULTI_EN > 0u) \
  139. || (OS_CFG_ISR_POST_DEFERRED_EN > 0u)) ? 1u : 0u)
  140. /*
  141. ************************************************************************************************************************
  142. ************************************************************************************************************************
  143. * # D E F I N E S
  144. ************************************************************************************************************************
  145. ************************************************************************************************************************
  146. */
  147. /*
  148. ========================================================================================================================
  149. * TASK STATUS
  150. ========================================================================================================================
  151. */
  152. #define OS_STATE_OS_STOPPED (OS_STATE)(0u)
  153. #define OS_STATE_OS_RUNNING (OS_STATE)(1u)
  154. #define OS_STATE_NOT_RDY (CPU_BOOLEAN)(0u)
  155. #define OS_STATE_RDY (CPU_BOOLEAN)(1u)
  156. /* ------------------- TASK STATES ------------------ */
  157. #define OS_TASK_STATE_BIT_DLY (OS_STATE)(0x01u) /* /-------- SUSPENDED bit */
  158. /* | */
  159. #define OS_TASK_STATE_BIT_PEND (OS_STATE)(0x02u) /* | /----- PEND bit */
  160. /* | | */
  161. #define OS_TASK_STATE_BIT_SUSPENDED (OS_STATE)(0x04u) /* | | /--- Delayed/Timeout bit */
  162. /* | | | */
  163. /* V V V */
  164. #define OS_TASK_STATE_RDY (OS_STATE)( 0u) /* 0 0 0 Ready */
  165. #define OS_TASK_STATE_DLY (OS_STATE)( 1u) /* 0 0 1 Delayed or Timeout */
  166. #define OS_TASK_STATE_PEND (OS_STATE)( 2u) /* 0 1 0 Pend */
  167. #define OS_TASK_STATE_PEND_TIMEOUT (OS_STATE)( 3u) /* 0 1 1 Pend + Timeout */
  168. #define OS_TASK_STATE_SUSPENDED (OS_STATE)( 4u) /* 1 0 0 Suspended */
  169. #define OS_TASK_STATE_DLY_SUSPENDED (OS_STATE)( 5u) /* 1 0 1 Suspended + Delayed or Timeout */
  170. #define OS_TASK_STATE_PEND_SUSPENDED (OS_STATE)( 6u) /* 1 1 0 Suspended + Pend */
  171. #define OS_TASK_STATE_PEND_TIMEOUT_SUSPENDED (OS_STATE)( 7u) /* 1 1 1 Suspended + Pend + Timeout */
  172. #define OS_TASK_STATE_DEL (OS_STATE)(255u)
  173. /* ----------------- PENDING ON ... ----------------- */
  174. #define OS_TASK_PEND_ON_NOTHING (OS_STATE)( 0u) /* Pending on nothing */
  175. #define OS_TASK_PEND_ON_FLAG (OS_STATE)( 1u) /* Pending on event flag group */
  176. #define OS_TASK_PEND_ON_TASK_Q (OS_STATE)( 2u) /* Pending on message to be sent to task */
  177. #define OS_TASK_PEND_ON_MULTI (OS_STATE)( 3u) /* Pending on multiple semaphores and/or queues */
  178. #define OS_TASK_PEND_ON_MUTEX (OS_STATE)( 4u) /* Pending on mutual exclusion semaphore */
  179. #define OS_TASK_PEND_ON_Q (OS_STATE)( 5u) /* Pending on queue */
  180. #define OS_TASK_PEND_ON_SEM (OS_STATE)( 6u) /* Pending on semaphore */
  181. #define OS_TASK_PEND_ON_TASK_SEM (OS_STATE)( 7u) /* Pending on signal to be sent to task */
  182. /*
  183. ------------------------------------------------------------------------------------------------------------------------
  184. * TASK PEND STATUS
  185. * (Status codes for OS_TCBs field .PendStatus)
  186. ------------------------------------------------------------------------------------------------------------------------
  187. */
  188. #define OS_STATUS_PEND_OK (OS_STATUS)( 0u) /* Pending status OK, !pending, or pending complete */
  189. #define OS_STATUS_PEND_ABORT (OS_STATUS)( 1u) /* Pending aborted */
  190. #define OS_STATUS_PEND_DEL (OS_STATUS)( 2u) /* Pending object deleted */
  191. #define OS_STATUS_PEND_TIMEOUT (OS_STATUS)( 3u) /* Pending timed out */
  192. /*
  193. ========================================================================================================================
  194. * OS OBJECT TYPES
  195. *
  196. * Note(s) : (1) OS_OBJ_TYPE_&&& #define values specifically chosen as ASCII representations of the kernel
  197. * object types. Memory displays of kernel objects will display the kernel object TYPEs with
  198. * their chosen ASCII names.
  199. ========================================================================================================================
  200. */
  201. #define OS_OBJ_TYPE_NONE (OS_OBJ_TYPE)CPU_TYPE_CREATE('N', 'O', 'N', 'E')
  202. #define OS_OBJ_TYPE_FLAG (OS_OBJ_TYPE)CPU_TYPE_CREATE('F', 'L', 'A', 'G')
  203. #define OS_OBJ_TYPE_MEM (OS_OBJ_TYPE)CPU_TYPE_CREATE('M', 'E', 'M', ' ')
  204. #define OS_OBJ_TYPE_MUTEX (OS_OBJ_TYPE)CPU_TYPE_CREATE('M', 'U', 'T', 'X')
  205. #define OS_OBJ_TYPE_Q (OS_OBJ_TYPE)CPU_TYPE_CREATE('Q', 'U', 'E', 'U')
  206. #define OS_OBJ_TYPE_SEM (OS_OBJ_TYPE)CPU_TYPE_CREATE('S', 'E', 'M', 'A')
  207. #define OS_OBJ_TYPE_TASK_MSG (OS_OBJ_TYPE)CPU_TYPE_CREATE('T', 'M', 'S', 'G')
  208. #define OS_OBJ_TYPE_TASK_RESUME (OS_OBJ_TYPE)CPU_TYPE_CREATE('T', 'R', 'E', 'S')
  209. #define OS_OBJ_TYPE_TASK_SIGNAL (OS_OBJ_TYPE)CPU_TYPE_CREATE('T', 'S', 'I', 'G')
  210. #define OS_OBJ_TYPE_TASK_SUSPEND (OS_OBJ_TYPE)CPU_TYPE_CREATE('T', 'S', 'U', 'S')
  211. #define OS_OBJ_TYPE_TICK (OS_OBJ_TYPE)CPU_TYPE_CREATE('T', 'I', 'C', 'K')
  212. #define OS_OBJ_TYPE_TMR (OS_OBJ_TYPE)CPU_TYPE_CREATE('T', 'M', 'R', ' ')
  213. /*
  214. ========================================================================================================================
  215. * Possible values for 'opt' argument
  216. ========================================================================================================================
  217. */
  218. #define OS_OPT_NONE (OS_OPT)(0x0000u)
  219. /*
  220. ------------------------------------------------------------------------------------------------------------------------
  221. * DELETE OPTIONS
  222. ------------------------------------------------------------------------------------------------------------------------
  223. */
  224. #define OS_OPT_DEL_NO_PEND (OS_OPT)(0x0000u)
  225. #define OS_OPT_DEL_ALWAYS (OS_OPT)(0x0001u)
  226. /*
  227. ------------------------------------------------------------------------------------------------------------------------
  228. * PEND OPTIONS
  229. ------------------------------------------------------------------------------------------------------------------------
  230. */
  231. #define OS_OPT_PEND_FLAG_MASK (OS_OPT)(0x000Fu)
  232. #define OS_OPT_PEND_FLAG_CLR_ALL (OS_OPT)(0x0001u) /* Wait for ALL the bits specified to be CLR */
  233. #define OS_OPT_PEND_FLAG_CLR_AND (OS_OPT)(0x0001u)
  234. #define OS_OPT_PEND_FLAG_CLR_ANY (OS_OPT)(0x0002u) /* Wait for ANY of the bits specified to be CLR */
  235. #define OS_OPT_PEND_FLAG_CLR_OR (OS_OPT)(0x0002u)
  236. #define OS_OPT_PEND_FLAG_SET_ALL (OS_OPT)(0x0004u) /* Wait for ALL the bits specified to be SET */
  237. #define OS_OPT_PEND_FLAG_SET_AND (OS_OPT)(0x0004u)
  238. #define OS_OPT_PEND_FLAG_SET_ANY (OS_OPT)(0x0008u) /* Wait for ANY of the bits specified to be SET */
  239. #define OS_OPT_PEND_FLAG_SET_OR (OS_OPT)(0x0008u)
  240. #define OS_OPT_PEND_FLAG_CONSUME (OS_OPT)(0x0100u) /* Consume the flags if condition(s) satisfied */
  241. #define OS_OPT_PEND_BLOCKING (OS_OPT)(0x0000u)
  242. #define OS_OPT_PEND_NON_BLOCKING (OS_OPT)(0x8000u)
  243. /*
  244. ------------------------------------------------------------------------------------------------------------------------
  245. * PEND ABORT OPTIONS
  246. ------------------------------------------------------------------------------------------------------------------------
  247. */
  248. #define OS_OPT_PEND_ABORT_1 (OS_OPT)(0x0000u) /* Pend abort a single waiting task */
  249. #define OS_OPT_PEND_ABORT_ALL (OS_OPT)(0x0100u) /* Pend abort ALL tasks waiting */
  250. /*
  251. ------------------------------------------------------------------------------------------------------------------------
  252. * POST OPTIONS
  253. ------------------------------------------------------------------------------------------------------------------------
  254. */
  255. #define OS_OPT_POST_NONE (OS_OPT)(0x0000u)
  256. #define OS_OPT_POST_FLAG_SET (OS_OPT)(0x0000u)
  257. #define OS_OPT_POST_FLAG_CLR (OS_OPT)(0x0001u)
  258. #define OS_OPT_POST_FIFO (OS_OPT)(0x0000u) /* Default is to post FIFO */
  259. #define OS_OPT_POST_LIFO (OS_OPT)(0x0010u) /* Post to highest priority task waiting */
  260. #define OS_OPT_POST_1 (OS_OPT)(0x0000u) /* Post message to highest priority task waiting */
  261. #define OS_OPT_POST_ALL (OS_OPT)(0x0200u) /* Broadcast message to ALL tasks waiting */
  262. #define OS_OPT_POST_NO_SCHED (OS_OPT)(0x8000u) /* Do not call the scheduler if this is selected */
  263. /*
  264. ------------------------------------------------------------------------------------------------------------------------
  265. * TASK OPTIONS
  266. ------------------------------------------------------------------------------------------------------------------------
  267. */
  268. #define OS_OPT_TASK_NONE (OS_OPT)(0x0000u) /* No option selected */
  269. #define OS_OPT_TASK_STK_CHK (OS_OPT)(0x0001u) /* Enable stack checking for the task */
  270. #define OS_OPT_TASK_STK_CLR (OS_OPT)(0x0002u) /* Clear the stack when the task is create */
  271. #define OS_OPT_TASK_SAVE_FP (OS_OPT)(0x0004u) /* Save the contents of any floating-point registers */
  272. #define OS_OPT_TASK_NO_TLS (OS_OPT)(0x0008u) /* Specifies the task DOES NOT require TLS support */
  273. /*
  274. ------------------------------------------------------------------------------------------------------------------------
  275. * TIME OPTIONS
  276. ------------------------------------------------------------------------------------------------------------------------
  277. */
  278. #define OS_OPT_TIME_DLY DEF_BIT_NONE
  279. #define OS_OPT_TIME_TIMEOUT ((OS_OPT)DEF_BIT_01)
  280. #define OS_OPT_TIME_MATCH ((OS_OPT)DEF_BIT_02)
  281. #define OS_OPT_TIME_PERIODIC ((OS_OPT)DEF_BIT_03)
  282. #define OS_OPT_TIME_HMSM_STRICT ((OS_OPT)DEF_BIT_NONE)
  283. #define OS_OPT_TIME_HMSM_NON_STRICT ((OS_OPT)DEF_BIT_04)
  284. #define OS_OPT_TIME_MASK ((OS_OPT)(OS_OPT_TIME_DLY | \
  285. OS_OPT_TIME_TIMEOUT | \
  286. OS_OPT_TIME_PERIODIC | \
  287. OS_OPT_TIME_MATCH))
  288. #define OS_OPT_TIME_OPTS_MASK (OS_OPT_TIME_DLY | \
  289. OS_OPT_TIME_TIMEOUT | \
  290. OS_OPT_TIME_PERIODIC | \
  291. OS_OPT_TIME_MATCH | \
  292. OS_OPT_TIME_HMSM_NON_STRICT)
  293. /*
  294. ------------------------------------------------------------------------------------------------------------------------
  295. * TIMER OPTIONS
  296. ------------------------------------------------------------------------------------------------------------------------
  297. */
  298. #define OS_OPT_TMR_NONE (OS_OPT)(0u) /* No option selected */
  299. #define OS_OPT_TMR_ONE_SHOT (OS_OPT)(1u) /* Timer will not auto restart when it expires */
  300. #define OS_OPT_TMR_PERIODIC (OS_OPT)(2u) /* Timer will auto restart when it expires */
  301. #define OS_OPT_TMR_CALLBACK (OS_OPT)(3u) /* OSTmrStop() option to call 'callback' w/ timer arg */
  302. #define OS_OPT_TMR_CALLBACK_ARG (OS_OPT)(4u) /* OSTmrStop() option to call 'callback' w/ new arg */
  303. /*
  304. ------------------------------------------------------------------------------------------------------------------------
  305. * TIMER STATES
  306. ------------------------------------------------------------------------------------------------------------------------
  307. */
  308. #define OS_TMR_STATE_UNUSED (OS_STATE)(0u)
  309. #define OS_TMR_STATE_STOPPED (OS_STATE)(1u)
  310. #define OS_TMR_STATE_RUNNING (OS_STATE)(2u)
  311. #define OS_TMR_STATE_COMPLETED (OS_STATE)(3u)
  312. /*
  313. ------------------------------------------------------------------------------------------------------------------------
  314. * PRIORITY
  315. ------------------------------------------------------------------------------------------------------------------------
  316. */
  317. /* Dflt prio to init task TCB */
  318. #define OS_PRIO_INIT (OS_PRIO)(OS_CFG_PRIO_MAX)
  319. /*
  320. ------------------------------------------------------------------------------------------------------------------------
  321. * TIMER TICK THRESHOLDS
  322. ------------------------------------------------------------------------------------------------------------------------
  323. */
  324. /* Threshold to init previous tick time */
  325. #define OS_TICK_TH_INIT (OS_TICK)(DEF_BIT ((sizeof(OS_TICK) * DEF_OCTET_NBR_BITS) - 1u))
  326. /* Threshold to check if tick time already ready */
  327. #define OS_TICK_TH_RDY (OS_TICK)(DEF_BIT_FIELD(((sizeof(OS_TICK) * DEF_OCTET_NBR_BITS) / 2u), \
  328. ((sizeof(OS_TICK) * DEF_OCTET_NBR_BITS) / 2u)))
  329. /*
  330. ************************************************************************************************************************
  331. ************************************************************************************************************************
  332. * E N U M E R A T I O N S
  333. ************************************************************************************************************************
  334. ************************************************************************************************************************
  335. */
  336. /*
  337. ------------------------------------------------------------------------------------------------------------------------
  338. * ERROR CODES
  339. ------------------------------------------------------------------------------------------------------------------------
  340. */
  341. typedef enum os_err {
  342. OS_ERR_NONE = 0u,
  343. OS_ERR_A = 10000u,
  344. OS_ERR_ACCEPT_ISR = 10001u,
  345. OS_ERR_B = 11000u,
  346. OS_ERR_C = 12000u,
  347. OS_ERR_CREATE_ISR = 12001u,
  348. OS_ERR_D = 13000u,
  349. OS_ERR_DEL_ISR = 13001u,
  350. OS_ERR_E = 14000u,
  351. OS_ERR_F = 15000u,
  352. OS_ERR_FATAL_RETURN = 15001u,
  353. OS_ERR_FLAG_GRP_DEPLETED = 15101u,
  354. OS_ERR_FLAG_NOT_RDY = 15102u,
  355. OS_ERR_FLAG_PEND_OPT = 15103u,
  356. OS_ERR_FLUSH_ISR = 15104u,
  357. OS_ERR_G = 16000u,
  358. OS_ERR_H = 17000u,
  359. OS_ERR_I = 18000u,
  360. OS_ERR_ILLEGAL_CREATE_RUN_TIME = 18001u,
  361. OS_ERR_INT_Q = 18002u,
  362. OS_ERR_INT_Q_FULL = 18003u,
  363. OS_ERR_INT_Q_SIZE = 18004u,
  364. OS_ERR_INT_Q_STK_INVALID = 18005u,
  365. OS_ERR_INT_Q_STK_SIZE_INVALID = 18006u,
  366. OS_ERR_J = 19000u,
  367. OS_ERR_K = 20000u,
  368. OS_ERR_L = 21000u,
  369. OS_ERR_LOCK_NESTING_OVF = 21001u,
  370. OS_ERR_M = 22000u,
  371. OS_ERR_MEM_CREATE_ISR = 22201u,
  372. OS_ERR_MEM_FULL = 22202u,
  373. OS_ERR_MEM_INVALID_P_ADDR = 22203u,
  374. OS_ERR_MEM_INVALID_BLKS = 22204u,
  375. OS_ERR_MEM_INVALID_PART = 22205u,
  376. OS_ERR_MEM_INVALID_P_BLK = 22206u,
  377. OS_ERR_MEM_INVALID_P_MEM = 22207u,
  378. OS_ERR_MEM_INVALID_P_DATA = 22208u,
  379. OS_ERR_MEM_INVALID_SIZE = 22209u,
  380. OS_ERR_MEM_NO_FREE_BLKS = 22210u,
  381. OS_ERR_MSG_POOL_EMPTY = 22301u,
  382. OS_ERR_MSG_POOL_NULL_PTR = 22302u,
  383. OS_ERR_MUTEX_NOT_OWNER = 22401u,
  384. OS_ERR_MUTEX_OWNER = 22402u,
  385. OS_ERR_MUTEX_NESTING = 22403u,
  386. OS_ERR_N = 23000u,
  387. OS_ERR_NAME = 23001u,
  388. OS_ERR_NO_MORE_ID_AVAIL = 23002u,
  389. OS_ERR_O = 24000u,
  390. OS_ERR_OBJ_CREATED = 24001u,
  391. OS_ERR_OBJ_DEL = 24002u,
  392. OS_ERR_OBJ_PTR_NULL = 24003u,
  393. OS_ERR_OBJ_TYPE = 24004u,
  394. OS_ERR_OPT_INVALID = 24101u,
  395. OS_ERR_OS_NOT_RUNNING = 24201u,
  396. OS_ERR_OS_RUNNING = 24202u,
  397. OS_ERR_P = 25000u,
  398. OS_ERR_PEND_ABORT = 25001u,
  399. OS_ERR_PEND_ABORT_ISR = 25002u,
  400. OS_ERR_PEND_ABORT_NONE = 25003u,
  401. OS_ERR_PEND_ABORT_SELF = 25004u,
  402. OS_ERR_PEND_DEL = 25005u,
  403. OS_ERR_PEND_ISR = 25006u,
  404. OS_ERR_PEND_LOCKED = 25007u,
  405. OS_ERR_PEND_WOULD_BLOCK = 25008u,
  406. OS_ERR_POST_NULL_PTR = 25101u,
  407. OS_ERR_POST_ISR = 25102u,
  408. OS_ERR_PRIO_EXIST = 25201u,
  409. OS_ERR_PRIO = 25202u,
  410. OS_ERR_PRIO_INVALID = 25203u,
  411. OS_ERR_PTR_INVALID = 25301u,
  412. OS_ERR_Q = 26000u,
  413. OS_ERR_Q_FULL = 26001u,
  414. OS_ERR_Q_EMPTY = 26002u,
  415. OS_ERR_Q_MAX = 26003u,
  416. OS_ERR_Q_SIZE = 26004u,
  417. OS_ERR_R = 27000u,
  418. OS_ERR_REG_ID_INVALID = 27001u,
  419. OS_ERR_ROUND_ROBIN_1 = 27002u,
  420. OS_ERR_ROUND_ROBIN_DISABLED = 27003u,
  421. OS_ERR_S = 28000u,
  422. OS_ERR_SCHED_INVALID_TIME_SLICE = 28001u,
  423. OS_ERR_SCHED_LOCK_ISR = 28002u,
  424. OS_ERR_SCHED_LOCKED = 28003u,
  425. OS_ERR_SCHED_NOT_LOCKED = 28004u,
  426. OS_ERR_SCHED_UNLOCK_ISR = 28005u,
  427. OS_ERR_SEM_OVF = 28101u,
  428. OS_ERR_SET_ISR = 28102u,
  429. OS_ERR_STAT_RESET_ISR = 28201u,
  430. OS_ERR_STAT_PRIO_INVALID = 28202u,
  431. OS_ERR_STAT_STK_INVALID = 28203u,
  432. OS_ERR_STAT_STK_SIZE_INVALID = 28204u,
  433. OS_ERR_STATE_INVALID = 28205u,
  434. OS_ERR_STATUS_INVALID = 28206u,
  435. OS_ERR_STK_INVALID = 28207u,
  436. OS_ERR_STK_SIZE_INVALID = 28208u,
  437. OS_ERR_STK_LIMIT_INVALID = 28209u,
  438. OS_ERR_T = 29000u,
  439. OS_ERR_TASK_CHANGE_PRIO_ISR = 29001u,
  440. OS_ERR_TASK_CREATE_ISR = 29002u,
  441. OS_ERR_TASK_DEL = 29003u,
  442. OS_ERR_TASK_DEL_IDLE = 29004u,
  443. OS_ERR_TASK_DEL_INVALID = 29005u,
  444. OS_ERR_TASK_DEL_ISR = 29006u,
  445. OS_ERR_TASK_INVALID = 29007u,
  446. OS_ERR_TASK_NO_MORE_TCB = 29008u,
  447. OS_ERR_TASK_NOT_DLY = 29009u,
  448. OS_ERR_TASK_NOT_EXIST = 29010u,
  449. OS_ERR_TASK_NOT_SUSPENDED = 29011u,
  450. OS_ERR_TASK_OPT = 29012u,
  451. OS_ERR_TASK_RESUME_ISR = 29013u,
  452. OS_ERR_TASK_RESUME_PRIO = 29014u,
  453. OS_ERR_TASK_RESUME_SELF = 29015u,
  454. OS_ERR_TASK_RUNNING = 29016u,
  455. OS_ERR_TASK_STK_CHK_ISR = 29017u,
  456. OS_ERR_TASK_SUSPENDED = 29018u,
  457. OS_ERR_TASK_SUSPEND_IDLE = 29019u,
  458. OS_ERR_TASK_SUSPEND_INT_HANDLER = 29020u,
  459. OS_ERR_TASK_SUSPEND_ISR = 29021u,
  460. OS_ERR_TASK_SUSPEND_PRIO = 29022u,
  461. OS_ERR_TASK_WAITING = 29023u,
  462. OS_ERR_TCB_INVALID = 29101u,
  463. OS_ERR_TLS_ID_INVALID = 29120u,
  464. OS_ERR_TLS_ISR = 29121u,
  465. OS_ERR_TLS_NO_MORE_AVAIL = 29122u,
  466. OS_ERR_TLS_NOT_EN = 29123u,
  467. OS_ERR_TLS_DESTRUCT_ASSIGNED = 29124u,
  468. OS_ERR_TICK_PRIO_INVALID = 29201u,
  469. OS_ERR_TICK_STK_INVALID = 29202u,
  470. OS_ERR_TICK_STK_SIZE_INVALID = 29203u,
  471. OS_ERR_TICK_WHEEL_SIZE = 29204u,
  472. OS_ERR_TIME_DLY_ISR = 29301u,
  473. OS_ERR_TIME_DLY_RESUME_ISR = 29302u,
  474. OS_ERR_TIME_GET_ISR = 29303u,
  475. OS_ERR_TIME_INVALID_HOURS = 29304u,
  476. OS_ERR_TIME_INVALID_MINUTES = 29305u,
  477. OS_ERR_TIME_INVALID_SECONDS = 29306u,
  478. OS_ERR_TIME_INVALID_MILLISECONDS = 29307u,
  479. OS_ERR_TIME_NOT_DLY = 29308u,
  480. OS_ERR_TIME_SET_ISR = 29309u,
  481. OS_ERR_TIME_ZERO_DLY = 29310u,
  482. OS_ERR_TIMEOUT = 29401u,
  483. OS_ERR_TMR_INACTIVE = 29501u,
  484. OS_ERR_TMR_INVALID_DEST = 29502u,
  485. OS_ERR_TMR_INVALID_DLY = 29503u,
  486. OS_ERR_TMR_INVALID_PERIOD = 29504u,
  487. OS_ERR_TMR_INVALID_STATE = 29505u,
  488. OS_ERR_TMR_INVALID = 29506u,
  489. OS_ERR_TMR_ISR = 29507u,
  490. OS_ERR_TMR_NO_CALLBACK = 29508u,
  491. OS_ERR_TMR_NON_AVAIL = 29509u,
  492. OS_ERR_TMR_PRIO_INVALID = 29510u,
  493. OS_ERR_TMR_STK_INVALID = 29511u,
  494. OS_ERR_TMR_STK_SIZE_INVALID = 29512u,
  495. OS_ERR_TMR_STOPPED = 29513u,
  496. OS_ERR_U = 30000u,
  497. OS_ERR_V = 31000u,
  498. OS_ERR_W = 32000u,
  499. OS_ERR_X = 33000u,
  500. OS_ERR_Y = 34000u,
  501. OS_ERR_YIELD_ISR = 34001u,
  502. OS_ERR_Z = 35000u
  503. } OS_ERR;
  504. /*
  505. ************************************************************************************************************************
  506. ************************************************************************************************************************
  507. * D A T A T Y P E S
  508. ************************************************************************************************************************
  509. ************************************************************************************************************************
  510. */
  511. typedef struct os_flag_grp OS_FLAG_GRP;
  512. typedef struct os_mem OS_MEM;
  513. typedef struct os_msg OS_MSG;
  514. typedef struct os_msg_pool OS_MSG_POOL;
  515. typedef struct os_msg_q OS_MSG_Q;
  516. typedef struct os_mutex OS_MUTEX;
  517. typedef struct os_int_q OS_INT_Q;
  518. typedef struct os_q OS_Q;
  519. typedef struct os_sem OS_SEM;
  520. typedef void (*OS_TASK_PTR)(void *p_arg);
  521. typedef struct os_tcb OS_TCB;
  522. #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
  523. typedef void *OS_TLS;
  524. typedef CPU_DATA OS_TLS_ID;
  525. typedef void (*OS_TLS_DESTRUCT_PTR)(OS_TCB *p_tcb,
  526. OS_TLS_ID id,
  527. OS_TLS value);
  528. #endif
  529. typedef struct os_rdy_list OS_RDY_LIST;
  530. typedef struct os_tick_list OS_TICK_LIST;
  531. typedef void (*OS_TMR_CALLBACK_PTR)(void *p_tmr, void *p_arg);
  532. typedef struct os_tmr OS_TMR;
  533. typedef struct os_pend_data OS_PEND_DATA;
  534. typedef struct os_pend_list OS_PEND_LIST;
  535. typedef struct os_pend_obj OS_PEND_OBJ;
  536. #if OS_CFG_APP_HOOKS_EN > 0u
  537. typedef void (*OS_APP_HOOK_VOID)(void);
  538. typedef void (*OS_APP_HOOK_TCB)(OS_TCB *p_tcb);
  539. #endif
  540. /*
  541. ************************************************************************************************************************
  542. ************************************************************************************************************************
  543. * D A T A S T R U C T U R E S
  544. ************************************************************************************************************************
  545. ************************************************************************************************************************
  546. */
  547. /*
  548. ------------------------------------------------------------------------------------------------------------------------
  549. * ISR POST DATA
  550. ------------------------------------------------------------------------------------------------------------------------
  551. */
  552. #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
  553. struct os_int_q {
  554. OS_OBJ_TYPE Type; /* Type of object placed in the circular list */
  555. OS_INT_Q *NextPtr; /* Pointer to next OS_INT_Q in circular list */
  556. void *ObjPtr; /* Pointer to object placed in the queue */
  557. void *MsgPtr; /* Pointer to message if posting to a message queue */
  558. OS_MSG_SIZE MsgSize; /* Message Size if posting to a message queue */
  559. OS_FLAGS Flags; /* Value of flags if posting to an event flag group */
  560. OS_OPT Opt; /* Post Options */
  561. CPU_TS TS; /* Timestamp */
  562. };
  563. #endif
  564. /*
  565. ------------------------------------------------------------------------------------------------------------------------
  566. * READY LIST
  567. ------------------------------------------------------------------------------------------------------------------------
  568. */
  569. struct os_rdy_list {
  570. OS_TCB *HeadPtr; /* Pointer to task that will run at selected priority */
  571. OS_TCB *TailPtr; /* Pointer to last task at selected priority */
  572. OS_OBJ_QTY NbrEntries; /* Number of entries at selected priority */
  573. };
  574. /*
  575. ------------------------------------------------------------------------------------------------------------------------
  576. * PEND DATA and PEND LIST
  577. ------------------------------------------------------------------------------------------------------------------------
  578. */
  579. struct os_pend_data {
  580. OS_PEND_DATA *PrevPtr;
  581. OS_PEND_DATA *NextPtr;
  582. OS_TCB *TCBPtr;
  583. OS_PEND_OBJ *PendObjPtr;
  584. OS_PEND_OBJ *RdyObjPtr;
  585. void *RdyMsgPtr;
  586. OS_MSG_SIZE RdyMsgSize;
  587. CPU_TS RdyTS;
  588. };
  589. struct os_pend_list {
  590. OS_PEND_DATA *HeadPtr;
  591. OS_PEND_DATA *TailPtr;
  592. OS_OBJ_QTY NbrEntries;
  593. };
  594. /*
  595. ------------------------------------------------------------------------------------------------------------------------
  596. * PEND OBJ
  597. *
  598. * Note(s) : (1) The 'os_pend_obj' structure data type is a template/subset for specific kernel objects' data types:
  599. * 'os_flag_grp', 'os_mutex', 'os_q', and 'os_sem'. Each specific kernel object data type MUST define
  600. * ALL generic OS pend object parameters, synchronized in both the sequential order & data type of each
  601. * parameter.
  602. *
  603. * Thus, ANY modification to the sequential order or data types of OS pend object parameters MUST be
  604. * appropriately synchronized between the generic OS pend object data type & ALL specific kernel objects'
  605. * data types.
  606. ------------------------------------------------------------------------------------------------------------------------
  607. */
  608. struct os_pend_obj {
  609. #if OS_OBJ_TYPE_REQ > 0u
  610. OS_OBJ_TYPE Type;
  611. #endif
  612. #if OS_CFG_DBG_EN > 0u
  613. CPU_CHAR *NamePtr;
  614. #endif
  615. OS_PEND_LIST PendList; /* List of tasks pending on object */
  616. #if OS_CFG_DBG_EN > 0u
  617. void *DbgPrevPtr;
  618. void *DbgNextPtr;
  619. CPU_CHAR *DbgNamePtr;
  620. #endif
  621. };
  622. /*
  623. ------------------------------------------------------------------------------------------------------------------------
  624. * EVENT FLAGS
  625. *
  626. * Note(s) : See PEND OBJ Note #1'.
  627. ------------------------------------------------------------------------------------------------------------------------
  628. */
  629. struct os_flag_grp { /* Event Flag Group */
  630. /* ------------------ GENERIC MEMBERS ------------------ */
  631. #if OS_OBJ_TYPE_REQ > 0u
  632. OS_OBJ_TYPE Type; /* Should be set to OS_OBJ_TYPE_FLAG */
  633. #endif
  634. #if OS_CFG_DBG_EN > 0u
  635. CPU_CHAR *NamePtr; /* Pointer to Event Flag Name (NUL terminated ASCII) */
  636. #endif
  637. OS_PEND_LIST PendList; /* List of tasks waiting on event flag group */
  638. #if OS_CFG_DBG_EN > 0u
  639. OS_FLAG_GRP *DbgPrevPtr;
  640. OS_FLAG_GRP *DbgNextPtr;
  641. CPU_CHAR *DbgNamePtr;
  642. #endif
  643. /* ------------------ SPECIFIC MEMBERS ------------------ */
  644. OS_FLAGS Flags; /* 8, 16 or 32 bit flags */
  645. CPU_TS TS; /* Timestamp of when last post occurred */
  646. #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
  647. CPU_INT32U FlagID; /* Unique ID for third-party debuggers and tracers. */
  648. #endif
  649. };
  650. /*
  651. ------------------------------------------------------------------------------------------------------------------------
  652. * MEMORY PARTITIONS
  653. ------------------------------------------------------------------------------------------------------------------------
  654. */
  655. struct os_mem { /* MEMORY CONTROL BLOCK */
  656. #if OS_OBJ_TYPE_REQ > 0u
  657. OS_OBJ_TYPE Type; /* Should be set to OS_OBJ_TYPE_MEM */
  658. #endif
  659. void *AddrPtr; /* Pointer to beginning of memory partition */
  660. #if OS_CFG_DBG_EN > 0u
  661. CPU_CHAR *NamePtr;
  662. #endif
  663. void *FreeListPtr; /* Pointer to list of free memory blocks */
  664. OS_MEM_SIZE BlkSize; /* Size (in bytes) of each block of memory */
  665. OS_MEM_QTY NbrMax; /* Total number of blocks in this partition */
  666. OS_MEM_QTY NbrFree; /* Number of memory blocks remaining in this partition */
  667. #if OS_CFG_DBG_EN > 0u
  668. OS_MEM *DbgPrevPtr;
  669. OS_MEM *DbgNextPtr;
  670. #endif
  671. #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
  672. CPU_INT32U MemID; /* Unique ID for third-party debuggers and tracers. */
  673. #endif
  674. };
  675. /*
  676. ------------------------------------------------------------------------------------------------------------------------
  677. * MESSAGES
  678. ------------------------------------------------------------------------------------------------------------------------
  679. */
  680. struct os_msg { /* MESSAGE CONTROL BLOCK */
  681. OS_MSG *NextPtr; /* Pointer to next message */
  682. void *MsgPtr; /* Actual message */
  683. OS_MSG_SIZE MsgSize; /* Size of the message (in # bytes) */
  684. CPU_TS MsgTS; /* Time stamp of when message was sent */
  685. };
  686. struct os_msg_pool { /* OS_MSG POOL */
  687. OS_MSG *NextPtr; /* Pointer to next message */
  688. OS_MSG_QTY NbrFree; /* Number of messages available from this pool */
  689. OS_MSG_QTY NbrUsed; /* Current number of messages used */
  690. #if OS_CFG_DBG_EN > 0u
  691. OS_MSG_QTY NbrUsedMax; /* Peak number of messages used */
  692. #endif
  693. };
  694. struct os_msg_q { /* OS_MSG_Q */
  695. OS_MSG *InPtr; /* Pointer to next OS_MSG to be inserted in the queue */
  696. OS_MSG *OutPtr; /* Pointer to next OS_MSG to be extracted from the queue */
  697. OS_MSG_QTY NbrEntriesSize; /* Maximum allowable number of entries in the queue */
  698. OS_MSG_QTY NbrEntries; /* Current number of entries in the queue */
  699. #if OS_CFG_DBG_EN > 0u
  700. OS_MSG_QTY NbrEntriesMax; /* Peak number of entries in the queue */
  701. #endif
  702. #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
  703. CPU_INT32U MsgQID; /* Unique ID for third-party debuggers and tracers. */
  704. #endif
  705. };
  706. /*
  707. ------------------------------------------------------------------------------------------------------------------------
  708. * MUTUAL EXCLUSION SEMAPHORES
  709. *
  710. * Note(s) : See PEND OBJ Note #1'.
  711. ------------------------------------------------------------------------------------------------------------------------
  712. */
  713. struct os_mutex { /* Mutual Exclusion Semaphore */
  714. /* ------------------ GENERIC MEMBERS ------------------ */
  715. #if OS_OBJ_TYPE_REQ > 0u
  716. OS_OBJ_TYPE Type; /* Should be set to OS_OBJ_TYPE_MUTEX */
  717. #endif
  718. #if OS_CFG_DBG_EN > 0u
  719. CPU_CHAR *NamePtr; /* Pointer to Mutex Name (NUL terminated ASCII) */
  720. #endif
  721. OS_PEND_LIST PendList; /* List of tasks waiting on mutex */
  722. #if OS_CFG_DBG_EN > 0u
  723. OS_MUTEX *DbgPrevPtr;
  724. OS_MUTEX *DbgNextPtr;
  725. CPU_CHAR *DbgNamePtr;
  726. #endif
  727. /* ------------------ SPECIFIC MEMBERS ------------------ */
  728. OS_MUTEX *MutexGrpNextPtr;
  729. OS_TCB *OwnerTCBPtr;
  730. OS_NESTING_CTR OwnerNestingCtr; /* Mutex is available when the counter is 0 */
  731. CPU_TS TS;
  732. #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
  733. CPU_INT08U MutexID; /* Unique ID for third-party debuggers and tracers. */
  734. #endif
  735. };
  736. /*
  737. ------------------------------------------------------------------------------------------------------------------------
  738. * MESSAGE QUEUES
  739. *
  740. * Note(s) : See PEND OBJ Note #1'.
  741. ------------------------------------------------------------------------------------------------------------------------
  742. */
  743. struct os_q { /* Message Queue */
  744. /* ------------------ GENERIC MEMBERS ------------------ */
  745. #if OS_OBJ_TYPE_REQ > 0u
  746. OS_OBJ_TYPE Type; /* Should be set to OS_OBJ_TYPE_Q */
  747. #endif
  748. #if OS_CFG_DBG_EN > 0u
  749. CPU_CHAR *NamePtr; /* Pointer to Message Queue Name (NUL terminated ASCII) */
  750. #endif
  751. OS_PEND_LIST PendList; /* List of tasks waiting on message queue */
  752. #if OS_CFG_DBG_EN > 0u
  753. OS_Q *DbgPrevPtr;
  754. OS_Q *DbgNextPtr;
  755. CPU_CHAR *DbgNamePtr;
  756. #endif
  757. /* ------------------ SPECIFIC MEMBERS ------------------ */
  758. OS_MSG_Q MsgQ; /* List of messages */
  759. #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
  760. CPU_INT08U MsgQID; /* Unique ID for third-party debuggers and tracers. */
  761. #endif
  762. };
  763. /*
  764. ------------------------------------------------------------------------------------------------------------------------
  765. * SEMAPHORES
  766. *
  767. * Note(s) : See PEND OBJ Note #1'.
  768. ------------------------------------------------------------------------------------------------------------------------
  769. */
  770. struct os_sem { /* Semaphore */
  771. /* ------------------ GENERIC MEMBERS ------------------ */
  772. #if OS_OBJ_TYPE_REQ > 0u
  773. OS_OBJ_TYPE Type; /* Should be set to OS_OBJ_TYPE_SEM */
  774. #endif
  775. #if OS_CFG_DBG_EN > 0u
  776. CPU_CHAR *NamePtr; /* Pointer to Semaphore Name (NUL terminated ASCII) */
  777. #endif
  778. OS_PEND_LIST PendList; /* List of tasks waiting on semaphore */
  779. #if OS_CFG_DBG_EN > 0u
  780. OS_SEM *DbgPrevPtr;
  781. OS_SEM *DbgNextPtr;
  782. CPU_CHAR *DbgNamePtr;
  783. #endif
  784. /* ------------------ SPECIFIC MEMBERS ------------------ */
  785. OS_SEM_CTR Ctr;
  786. CPU_TS TS;
  787. #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
  788. CPU_INT08U SemID; /* Unique ID for third-party debuggers and tracers. */
  789. #endif
  790. };
  791. /*
  792. ------------------------------------------------------------------------------------------------------------------------
  793. * TASK CONTROL BLOCK
  794. ------------------------------------------------------------------------------------------------------------------------
  795. */
  796. struct os_tcb {
  797. CPU_STK *StkPtr; /* Pointer to current top of stack */
  798. void *ExtPtr; /* Pointer to user definable data for TCB extension */
  799. #if ((OS_CFG_DBG_EN > 0u) || (OS_CFG_STAT_TASK_STK_CHK_EN > 0u))
  800. CPU_STK *StkLimitPtr; /* Pointer used to set stack 'watermark' limit */
  801. #endif
  802. OS_TCB *NextPtr; /* Pointer to next TCB in the TCB list */
  803. OS_TCB *PrevPtr; /* Pointer to previous TCB in the TCB list */
  804. OS_TCB *TickNextPtr;
  805. OS_TCB *TickPrevPtr;
  806. OS_TICK_LIST *TickListPtr; /* Pointer to tick list if task is in a tick list */
  807. #if OS_CFG_DBG_EN > 0u
  808. CPU_CHAR *NamePtr; /* Pointer to task name */
  809. #endif
  810. #if ((OS_CFG_DBG_EN > 0u) || (OS_CFG_STAT_TASK_STK_CHK_EN > 0u))
  811. CPU_STK *StkBasePtr; /* Pointer to base address of stack */
  812. #endif
  813. #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
  814. OS_TLS TLS_Tbl[OS_CFG_TLS_TBL_SIZE];
  815. #endif
  816. #if OS_CFG_DBG_EN > 0u
  817. OS_TASK_PTR TaskEntryAddr; /* Pointer to task entry point address */
  818. void *TaskEntryArg; /* Argument passed to task when it was created */
  819. #endif
  820. OS_PEND_DATA *PendDataTblPtr; /* Pointer to list containing objects pended on */
  821. OS_STATE PendOn; /* Indicates what task is pending on */
  822. OS_STATUS PendStatus; /* Pend status */
  823. OS_STATE TaskState; /* See OS_TASK_STATE_xxx */
  824. OS_PRIO Prio; /* Task priority (0 == highest) */
  825. #if OS_CFG_MUTEX_EN > 0u
  826. OS_PRIO BasePrio; /* Base priority (Not inherited) */
  827. OS_MUTEX *MutexGrpHeadPtr; /* Owned mutex group head pointer */
  828. #endif
  829. #if ((OS_CFG_DBG_EN > 0u) || (OS_CFG_STAT_TASK_STK_CHK_EN > 0u))
  830. CPU_STK_SIZE StkSize; /* Size of task stack (in number of stack elements) */
  831. #endif
  832. OS_OPT Opt; /* Task options as passed by OSTaskCreate() */
  833. OS_OBJ_QTY PendDataTblEntries; /* Size of array of objects to pend on */
  834. CPU_TS TS; /* Timestamp */
  835. #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
  836. CPU_INT08U SemID; /* Unique ID for third-party debuggers and tracers. */
  837. #endif
  838. OS_SEM_CTR SemCtr; /* Task specific semaphore counter */
  839. /* DELAY / TIMEOUT */
  840. OS_TICK TickRemain; /* Number of ticks remaining (updated at by OS_TickTask() */
  841. OS_TICK TickCtrPrev; /* Used by OSTimeDlyXX() in PERIODIC mode */
  842. #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
  843. OS_TICK TimeQuanta;
  844. OS_TICK TimeQuantaCtr;
  845. #endif
  846. #if OS_MSG_EN > 0u
  847. void *MsgPtr; /* Message received */
  848. OS_MSG_SIZE MsgSize;
  849. #endif
  850. #if OS_CFG_TASK_Q_EN > 0u
  851. OS_MSG_Q MsgQ; /* Message queue associated with task */
  852. #if OS_CFG_TASK_PROFILE_EN > 0u
  853. CPU_TS MsgQPendTime; /* Time it took for signal to be received */
  854. CPU_TS MsgQPendTimeMax; /* Max amount of time it took for signal to be received */
  855. #endif
  856. #endif
  857. #if OS_CFG_TASK_REG_TBL_SIZE > 0u
  858. OS_REG RegTbl[OS_CFG_TASK_REG_TBL_SIZE]; /* Task specific registers */
  859. #endif
  860. #if OS_CFG_FLAG_EN > 0u
  861. OS_FLAGS FlagsPend; /* Event flag(s) to wait on */
  862. OS_FLAGS FlagsRdy; /* Event flags that made task ready to run */
  863. OS_OPT FlagsOpt; /* Options (See OS_OPT_FLAG_xxx) */
  864. #endif
  865. #if OS_CFG_TASK_SUSPEND_EN > 0u
  866. OS_NESTING_CTR SuspendCtr; /* Nesting counter for OSTaskSuspend() */
  867. #endif
  868. #if OS_CFG_TASK_PROFILE_EN > 0u
  869. OS_CPU_USAGE CPUUsage; /* CPU Usage of task (0.00-100.00%) */
  870. OS_CPU_USAGE CPUUsageMax; /* CPU Usage of task (0.00-100.00%) - Peak */
  871. OS_CTX_SW_CTR CtxSwCtr; /* Number of time the task was switched in */
  872. CPU_TS CyclesDelta; /* value of OS_TS_GET() - .CyclesStart */
  873. CPU_TS CyclesStart; /* Snapshot of cycle counter at start of task resumption */
  874. OS_CYCLES CyclesTotal; /* Total number of # of cycles the task has been running */
  875. OS_CYCLES CyclesTotalPrev; /* Snapshot of previous # of cycles */
  876. CPU_TS SemPendTime; /* Time it took for signal to be received */
  877. CPU_TS SemPendTimeMax; /* Max amount of time it took for signal to be received */
  878. #endif
  879. #if OS_CFG_STAT_TASK_STK_CHK_EN > 0u
  880. CPU_STK_SIZE StkUsed; /* Number of stack elements used from the stack */
  881. CPU_STK_SIZE StkFree; /* Number of stack elements free on the stack */
  882. #endif
  883. #ifdef CPU_CFG_INT_DIS_MEAS_EN
  884. CPU_TS IntDisTimeMax; /* Maximum interrupt disable time */
  885. #endif
  886. #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
  887. CPU_TS SchedLockTimeMax; /* Maximum scheduler lock time */
  888. #endif
  889. #if OS_CFG_DBG_EN > 0u
  890. OS_TCB *DbgPrevPtr;
  891. OS_TCB *DbgNextPtr;
  892. CPU_CHAR *DbgNamePtr;
  893. #endif
  894. #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
  895. CPU_INT08U TaskID; /* Unique ID for third-party debuggers and tracers. */
  896. #endif
  897. };
  898. /*
  899. ------------------------------------------------------------------------------------------------------------------------
  900. * TICK DATA TYPE
  901. ------------------------------------------------------------------------------------------------------------------------
  902. */
  903. struct os_tick_list {
  904. OS_TCB *TCB_Ptr; /* Pointer to list of tasks in tick list */
  905. #if OS_CFG_DBG_EN > 0u
  906. OS_OBJ_QTY NbrEntries; /* Current number of entries in the tick list */
  907. OS_OBJ_QTY NbrUpdated; /* Number of entries updated */
  908. #endif
  909. };
  910. /*
  911. ------------------------------------------------------------------------------------------------------------------------
  912. * TIMER DATA TYPES
  913. ------------------------------------------------------------------------------------------------------------------------
  914. */
  915. struct os_tmr {
  916. #if OS_OBJ_TYPE_REQ > 0u
  917. OS_OBJ_TYPE Type;
  918. #endif
  919. #if OS_CFG_DBG_EN > 0u
  920. CPU_CHAR *NamePtr; /* Name to give the timer */
  921. #endif
  922. OS_TMR_CALLBACK_PTR CallbackPtr; /* Function to call when timer expires */
  923. void *CallbackPtrArg; /* Argument to pass to function when timer expires */
  924. OS_TMR *NextPtr; /* Double link list pointers */
  925. OS_TMR *PrevPtr;
  926. OS_TICK Remain; /* Amount of time remaining before timer expires */
  927. OS_TICK Dly; /* Delay before start of repeat */
  928. OS_TICK Period; /* Period to repeat timer */
  929. OS_OPT Opt; /* Options (see OS_OPT_TMR_xxx) */
  930. OS_STATE State;
  931. #if OS_CFG_DBG_EN > 0u
  932. OS_TMR *DbgPrevPtr;
  933. OS_TMR *DbgNextPtr;
  934. #endif
  935. };
  936. /*
  937. ************************************************************************************************************************
  938. ************************************************************************************************************************
  939. * G L O B A L V A R I A B L E S
  940. ************************************************************************************************************************
  941. ************************************************************************************************************************
  942. */
  943. #if OS_CFG_APP_HOOKS_EN > 0u
  944. OS_EXT OS_APP_HOOK_TCB OS_AppTaskCreateHookPtr; /* Application hooks */
  945. OS_EXT OS_APP_HOOK_TCB OS_AppTaskDelHookPtr;
  946. OS_EXT OS_APP_HOOK_TCB OS_AppTaskReturnHookPtr;
  947. OS_EXT OS_APP_HOOK_VOID OS_AppIdleTaskHookPtr;
  948. OS_EXT OS_APP_HOOK_VOID OS_AppStatTaskHookPtr;
  949. OS_EXT OS_APP_HOOK_VOID OS_AppTaskSwHookPtr;
  950. OS_EXT OS_APP_HOOK_VOID OS_AppTimeTickHookPtr;
  951. #endif
  952. /* IDLE TASK -------------------------------- */
  953. OS_EXT OS_IDLE_CTR OSIdleTaskCtr;
  954. OS_EXT OS_TCB OSIdleTaskTCB;
  955. /* MISCELLANEOUS ---------------------------- */
  956. OS_EXT OS_NESTING_CTR OSIntNestingCtr; /* Interrupt nesting level */
  957. #ifdef CPU_CFG_INT_DIS_MEAS_EN
  958. OS_EXT CPU_TS OSIntDisTimeMax; /* Overall interrupt disable time */
  959. #endif
  960. OS_EXT OS_STATE OSRunning; /* Flag indicating that kernel is running */
  961. /* ISR HANDLER TASK ------------------------- */
  962. #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
  963. OS_EXT OS_INT_Q *OSIntQInPtr;
  964. OS_EXT OS_INT_Q *OSIntQOutPtr;
  965. OS_EXT OS_OBJ_QTY OSIntQNbrEntries;
  966. OS_EXT OS_OBJ_QTY OSIntQNbrEntriesMax;
  967. OS_EXT OS_OBJ_QTY OSIntQOvfCtr;
  968. OS_EXT OS_TCB OSIntQTaskTCB;
  969. OS_EXT CPU_TS OSIntQTaskTimeMax;
  970. #endif
  971. /* FLAGS ------------------------------------ */
  972. #if OS_CFG_FLAG_EN > 0u
  973. #if OS_CFG_DBG_EN > 0u
  974. OS_EXT OS_FLAG_GRP *OSFlagDbgListPtr;
  975. #endif
  976. OS_EXT OS_OBJ_QTY OSFlagQty;
  977. #endif
  978. /* MEMORY MANAGEMENT ------------------------ */
  979. #if OS_CFG_MEM_EN > 0u
  980. #if OS_CFG_DBG_EN > 0u
  981. OS_EXT OS_MEM *OSMemDbgListPtr;
  982. #endif
  983. OS_EXT OS_OBJ_QTY OSMemQty; /* Number of memory partitions created */
  984. #endif
  985. /* OS_MSG POOL ------------------------------ */
  986. #if OS_MSG_EN > 0u
  987. OS_EXT OS_MSG_POOL OSMsgPool; /* Pool of OS_MSG */
  988. #endif
  989. /* MUTEX MANAGEMENT ------------------------- */
  990. #if OS_CFG_MUTEX_EN > 0u
  991. #if OS_CFG_DBG_EN > 0u
  992. OS_EXT OS_MUTEX *OSMutexDbgListPtr;
  993. #endif
  994. OS_EXT OS_OBJ_QTY OSMutexQty; /* Number of mutexes created */
  995. #endif
  996. /* PRIORITIES ------------------------------- */
  997. OS_EXT OS_PRIO OSPrioCur; /* Priority of current task */
  998. OS_EXT OS_PRIO OSPrioHighRdy; /* Priority of highest priority task */
  999. OS_EXT OS_PRIO OSPrioSaved; /* Saved priority level when Post Deferred */
  1000. extern CPU_DATA OSPrioTbl[OS_PRIO_TBL_SIZE];
  1001. /* QUEUES ----------------------------------- */
  1002. #if OS_CFG_Q_EN > 0u
  1003. #if OS_CFG_DBG_EN > 0u
  1004. OS_EXT OS_Q *OSQDbgListPtr;
  1005. #endif
  1006. OS_EXT OS_OBJ_QTY OSQQty; /* Number of message queues created */
  1007. #endif
  1008. /* READY LIST ------------------------------- */
  1009. OS_EXT OS_RDY_LIST OSRdyList[OS_CFG_PRIO_MAX]; /* Table of tasks ready to run */
  1010. #ifdef OS_SAFETY_CRITICAL_IEC61508
  1011. OS_EXT CPU_BOOLEAN OSSafetyCriticalStartFlag; /* Flag indicating that all init. done */
  1012. #endif
  1013. /* SCHEDULER -------------------------------- */
  1014. #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
  1015. OS_EXT CPU_TS_TMR OSSchedLockTimeBegin; /* Scheduler lock time measurement */
  1016. OS_EXT CPU_TS_TMR OSSchedLockTimeMax;
  1017. OS_EXT CPU_TS_TMR OSSchedLockTimeMaxCur;
  1018. #endif
  1019. OS_EXT OS_NESTING_CTR OSSchedLockNestingCtr; /* Lock nesting level */
  1020. #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
  1021. OS_EXT OS_TICK OSSchedRoundRobinDfltTimeQuanta;
  1022. OS_EXT CPU_BOOLEAN OSSchedRoundRobinEn; /* Enable/Disable round-robin scheduling */
  1023. #endif
  1024. /* SEMAPHORES ------------------------------- */
  1025. #if OS_CFG_SEM_EN > 0u
  1026. #if OS_CFG_DBG_EN > 0u
  1027. OS_EXT OS_SEM *OSSemDbgListPtr;
  1028. #endif
  1029. OS_EXT OS_OBJ_QTY OSSemQty; /* Number of semaphores created */
  1030. #endif
  1031. /* STATISTICS ------------------------------- */
  1032. #if OS_CFG_STAT_TASK_EN > 0u
  1033. OS_EXT CPU_BOOLEAN OSStatResetFlag; /* Force the reset of the computed statistics */
  1034. OS_EXT OS_CPU_USAGE OSStatTaskCPUUsage; /* CPU Usage in % */
  1035. OS_EXT OS_CPU_USAGE OSStatTaskCPUUsageMax; /* CPU Usage in % (Peak) */
  1036. OS_EXT OS_TICK OSStatTaskCtr;
  1037. OS_EXT OS_TICK OSStatTaskCtrMax;
  1038. OS_EXT OS_TICK OSStatTaskCtrRun;
  1039. OS_EXT CPU_BOOLEAN OSStatTaskRdy;
  1040. OS_EXT OS_TCB OSStatTaskTCB;
  1041. OS_EXT CPU_TS OSStatTaskTimeMax;
  1042. #endif
  1043. /* TASKS ------------------------------------ */
  1044. OS_EXT OS_CTX_SW_CTR OSTaskCtxSwCtr; /* Number of context switches */
  1045. #if OS_CFG_DBG_EN > 0u
  1046. OS_EXT OS_TCB *OSTaskDbgListPtr;
  1047. #endif
  1048. OS_EXT OS_OBJ_QTY OSTaskQty; /* Number of tasks created */
  1049. #if OS_CFG_TASK_REG_TBL_SIZE > 0u
  1050. OS_EXT OS_REG_ID OSTaskRegNextAvailID; /* Next available Task Register ID */
  1051. #endif
  1052. /* TICK TASK -------------------------------- */
  1053. OS_EXT OS_TICK OSTickCtr; /* Cnts the #ticks since startup or last set */
  1054. OS_EXT OS_TCB OSTickTaskTCB;
  1055. OS_EXT CPU_TS OSTickTaskTimeMax;
  1056. OS_EXT OS_TICK_LIST OSTickListDly;
  1057. OS_EXT OS_TICK_LIST OSTickListTimeout;
  1058. #if OS_CFG_TMR_EN > 0u /* TIMERS ----------------------------------- */
  1059. #if OS_CFG_DBG_EN > 0u
  1060. OS_EXT OS_TMR *OSTmrDbgListPtr;
  1061. #endif
  1062. OS_EXT OS_OBJ_QTY OSTmrListEntries; /* Doubly-linked list of timers */
  1063. OS_EXT OS_TMR *OSTmrListPtr;
  1064. #if OS_CFG_MUTEX_EN > 0u /* Use a Mutex (if available) to protect tmrs */
  1065. OS_EXT OS_MUTEX OSTmrMutex;
  1066. #endif
  1067. OS_EXT OS_OBJ_QTY OSTmrQty; /* Number of timers created */
  1068. OS_EXT OS_TCB OSTmrTaskTCB; /* TCB of timer task */
  1069. OS_EXT CPU_TS OSTmrTaskTimeMax;
  1070. OS_EXT OS_TICK OSTmrTickCtr; /* Current time for the timers */
  1071. OS_EXT OS_CTR OSTmrUpdateCnt; /* Counter for updating timers */
  1072. OS_EXT OS_CTR OSTmrUpdateCtr;
  1073. #endif
  1074. /* TCBs ------------------------------------- */
  1075. OS_EXT OS_TCB *OSTCBCurPtr; /* Pointer to currently running TCB */
  1076. OS_EXT OS_TCB *OSTCBHighRdyPtr; /* Pointer to highest priority TCB */
  1077. /*
  1078. ************************************************************************************************************************
  1079. ************************************************************************************************************************
  1080. * E X T E R N A L S
  1081. ************************************************************************************************************************
  1082. ************************************************************************************************************************
  1083. */
  1084. extern CPU_STK * const OSCfg_IdleTaskStkBasePtr;
  1085. extern CPU_STK_SIZE const OSCfg_IdleTaskStkLimit;
  1086. extern CPU_STK_SIZE const OSCfg_IdleTaskStkSize;
  1087. extern CPU_INT32U const OSCfg_IdleTaskStkSizeRAM;
  1088. extern OS_INT_Q * const OSCfg_IntQBasePtr;
  1089. extern OS_OBJ_QTY const OSCfg_IntQSize;
  1090. extern CPU_INT32U const OSCfg_IntQSizeRAM;
  1091. extern CPU_STK * const OSCfg_IntQTaskStkBasePtr;
  1092. extern CPU_STK_SIZE const OSCfg_IntQTaskStkLimit;
  1093. extern CPU_STK_SIZE const OSCfg_IntQTaskStkSize;
  1094. extern CPU_INT32U const OSCfg_IntQTaskStkSizeRAM;
  1095. extern CPU_STK * const OSCfg_ISRStkBasePtr;
  1096. extern CPU_STK_SIZE const OSCfg_ISRStkSize;
  1097. extern CPU_INT32U const OSCfg_ISRStkSizeRAM;
  1098. extern OS_MSG_SIZE const OSCfg_MsgPoolSize;
  1099. extern CPU_INT32U const OSCfg_MsgPoolSizeRAM;
  1100. extern OS_MSG * const OSCfg_MsgPoolBasePtr;
  1101. extern OS_PRIO const OSCfg_StatTaskPrio;
  1102. extern OS_RATE_HZ const OSCfg_StatTaskRate_Hz;
  1103. extern CPU_STK * const OSCfg_StatTaskStkBasePtr;
  1104. extern CPU_STK_SIZE const OSCfg_StatTaskStkLimit;
  1105. extern CPU_STK_SIZE const OSCfg_StatTaskStkSize;
  1106. extern CPU_INT32U const OSCfg_StatTaskStkSizeRAM;
  1107. extern CPU_STK_SIZE const OSCfg_StkSizeMin;
  1108. extern OS_RATE_HZ const OSCfg_TickRate_Hz;
  1109. extern OS_PRIO const OSCfg_TickTaskPrio;
  1110. extern CPU_STK * const OSCfg_TickTaskStkBasePtr;
  1111. extern CPU_STK_SIZE const OSCfg_TickTaskStkLimit;
  1112. extern CPU_STK_SIZE const OSCfg_TickTaskStkSize;
  1113. extern CPU_INT32U const OSCfg_TickTaskStkSizeRAM;
  1114. extern OS_PRIO const OSCfg_TmrTaskPrio;
  1115. extern OS_RATE_HZ const OSCfg_TmrTaskRate_Hz;
  1116. extern CPU_STK * const OSCfg_TmrTaskStkBasePtr;
  1117. extern CPU_STK_SIZE const OSCfg_TmrTaskStkLimit;
  1118. extern CPU_STK_SIZE const OSCfg_TmrTaskStkSize;
  1119. extern CPU_INT32U const OSCfg_TmrTaskStkSizeRAM;
  1120. extern CPU_STK OSCfg_IdleTaskStk[];
  1121. #if (OS_CFG_ISR_POST_DEFERRED_EN > 0u)
  1122. extern CPU_STK OSCfg_IntQTaskStk[];
  1123. extern OS_INT_Q OSCfg_IntQ[];
  1124. #endif
  1125. extern CPU_STK OSCfg_ISRStk[];
  1126. #if (OS_MSG_EN > 0u)
  1127. extern OS_MSG OSCfg_MsgPool[];
  1128. #endif
  1129. #if (OS_CFG_STAT_TASK_EN > 0u)
  1130. extern CPU_STK OSCfg_StatTaskStk[];
  1131. #endif
  1132. extern CPU_STK OSCfg_TickTaskStk[];
  1133. #if (OS_CFG_TMR_EN > 0u)
  1134. extern CPU_STK OSCfg_TmrTaskStk[];
  1135. #endif
  1136. /*
  1137. ************************************************************************************************************************
  1138. ************************************************************************************************************************
  1139. * F U N C T I O N P R O T O T Y P E S
  1140. ************************************************************************************************************************
  1141. ************************************************************************************************************************
  1142. */
  1143. /* ================================================================================================================== */
  1144. /* EVENT FLAGS */
  1145. /* ================================================================================================================== */
  1146. #if OS_CFG_FLAG_EN > 0u
  1147. void OSFlagCreate (OS_FLAG_GRP *p_grp,
  1148. CPU_CHAR *p_name,
  1149. OS_FLAGS flags,
  1150. OS_ERR *p_err);
  1151. #if OS_CFG_FLAG_DEL_EN > 0u
  1152. OS_OBJ_QTY OSFlagDel (OS_FLAG_GRP *p_grp,
  1153. OS_OPT opt,
  1154. OS_ERR *p_err);
  1155. #endif
  1156. OS_FLAGS OSFlagPend (OS_FLAG_GRP *p_grp,
  1157. OS_FLAGS flags,
  1158. OS_TICK timeout,
  1159. OS_OPT opt,
  1160. CPU_TS *p_ts,
  1161. OS_ERR *p_err);
  1162. #if OS_CFG_FLAG_PEND_ABORT_EN > 0u
  1163. OS_OBJ_QTY OSFlagPendAbort (OS_FLAG_GRP *p_grp,
  1164. OS_OPT opt,
  1165. OS_ERR *p_err);
  1166. #endif
  1167. OS_FLAGS OSFlagPendGetFlagsRdy (OS_ERR *p_err);
  1168. OS_FLAGS OSFlagPost (OS_FLAG_GRP *p_grp,
  1169. OS_FLAGS flags,
  1170. OS_OPT opt,
  1171. OS_ERR *p_err);
  1172. /* ------------------------------------------------ INTERNAL FUNCTIONS ---------------------------------------------- */
  1173. void OS_FlagClr (OS_FLAG_GRP *p_grp);
  1174. void OS_FlagBlock (OS_PEND_DATA *p_pend_data,
  1175. OS_FLAG_GRP *p_grp,
  1176. OS_FLAGS flags,
  1177. OS_OPT opt,
  1178. OS_TICK timeout);
  1179. #if OS_CFG_DBG_EN > 0u
  1180. void OS_FlagDbgListAdd (OS_FLAG_GRP *p_grp);
  1181. void OS_FlagDbgListRemove (OS_FLAG_GRP *p_grp);
  1182. #endif
  1183. void OS_FlagInit (OS_ERR *p_err);
  1184. OS_FLAGS OS_FlagPost (OS_FLAG_GRP *p_grp,
  1185. OS_FLAGS flags,
  1186. OS_OPT opt,
  1187. CPU_TS ts,
  1188. OS_ERR *p_err);
  1189. void OS_FlagTaskRdy (OS_TCB *p_tcb,
  1190. OS_FLAGS flags_rdy,
  1191. CPU_TS ts);
  1192. #endif
  1193. /* ================================================================================================================== */
  1194. /* FIXED SIZE MEMORY BLOCK MANAGEMENT */
  1195. /* ================================================================================================================== */
  1196. #if OS_CFG_MEM_EN > 0u
  1197. void OSMemCreate (OS_MEM *p_mem,
  1198. CPU_CHAR *p_name,
  1199. void *p_addr,
  1200. OS_MEM_QTY n_blks,
  1201. OS_MEM_SIZE blk_size,
  1202. OS_ERR *p_err);
  1203. void *OSMemGet (OS_MEM *p_mem,
  1204. OS_ERR *p_err);
  1205. void OSMemPut (OS_MEM *p_mem,
  1206. void *p_blk,
  1207. OS_ERR *p_err);
  1208. /* ------------------------------------------------ INTERNAL FUNCTIONS ---------------------------------------------- */
  1209. #if OS_CFG_DBG_EN > 0u
  1210. void OS_MemDbgListAdd (OS_MEM *p_mem);
  1211. #endif
  1212. void OS_MemInit (OS_ERR *p_err);
  1213. #endif
  1214. /* ================================================================================================================== */
  1215. /* MUTUAL EXCLUSION SEMAPHORES */
  1216. /* ================================================================================================================== */
  1217. #if OS_CFG_MUTEX_EN > 0u
  1218. void OSMutexCreate (OS_MUTEX *p_mutex,
  1219. CPU_CHAR *p_name,
  1220. OS_ERR *p_err);
  1221. #if OS_CFG_MUTEX_DEL_EN > 0u
  1222. OS_OBJ_QTY OSMutexDel (OS_MUTEX *p_mutex,
  1223. OS_OPT opt,
  1224. OS_ERR *p_err);
  1225. #endif
  1226. void OSMutexPend (OS_MUTEX *p_mutex,
  1227. OS_TICK timeout,
  1228. OS_OPT opt,
  1229. CPU_TS *p_ts,
  1230. OS_ERR *p_err);
  1231. #if OS_CFG_MUTEX_PEND_ABORT_EN > 0u
  1232. OS_OBJ_QTY OSMutexPendAbort (OS_MUTEX *p_mutex,
  1233. OS_OPT opt,
  1234. OS_ERR *p_err);
  1235. #endif
  1236. void OSMutexPost (OS_MUTEX *p_mutex,
  1237. OS_OPT opt,
  1238. OS_ERR *p_err);
  1239. /* ------------------------------------------------ INTERNAL FUNCTIONS ---------------------------------------------- */
  1240. void OS_MutexClr (OS_MUTEX *p_mutex);
  1241. #if OS_CFG_DBG_EN > 0u
  1242. void OS_MutexDbgListAdd (OS_MUTEX *p_mutex);
  1243. void OS_MutexDbgListRemove (OS_MUTEX *p_mutex);
  1244. #endif
  1245. void OS_MutexInit (OS_ERR *p_err);
  1246. #endif
  1247. void OS_MutexGrpAdd (OS_TCB *p_tcb,
  1248. OS_MUTEX *p_mutex);
  1249. void OS_MutexGrpRemove (OS_TCB *p_tcb,
  1250. OS_MUTEX *p_mutex);
  1251. OS_PRIO OS_MutexGrpPrioFindHighest(OS_TCB *p_tcb);
  1252. void OS_MutexGrpPostAll (OS_TCB *p_tcb);
  1253. /* ================================================================================================================== */
  1254. /* MULTI PEND */
  1255. /* ================================================================================================================== */
  1256. #if OS_CFG_PEND_MULTI_EN > 0u
  1257. OS_OBJ_QTY OSPendMulti (OS_PEND_DATA *p_pend_data_tbl,
  1258. OS_OBJ_QTY tbl_size,
  1259. OS_TICK timeout,
  1260. OS_OPT opt,
  1261. OS_ERR *p_err);
  1262. /* ------------------------------------------------ INTERNAL FUNCTIONS ---------------------------------------------- */
  1263. OS_OBJ_QTY OS_PendMultiGetRdy (OS_PEND_DATA *p_pend_data_tbl,
  1264. OS_OBJ_QTY tbl_size);
  1265. CPU_BOOLEAN OS_PendMultiValidate (OS_PEND_DATA *p_pend_data_tbl,
  1266. OS_OBJ_QTY tbl_size);
  1267. void OS_PendMultiWait (OS_PEND_DATA *p_pend_data_tbl,
  1268. OS_OBJ_QTY tbl_size,
  1269. OS_TICK timeout);
  1270. #endif
  1271. /* ================================================================================================================== */
  1272. /* MESSAGE QUEUES */
  1273. /* ================================================================================================================== */
  1274. #if OS_CFG_Q_EN > 0u
  1275. void OSQCreate (OS_Q *p_q,
  1276. CPU_CHAR *p_name,
  1277. OS_MSG_QTY max_qty,
  1278. OS_ERR *p_err);
  1279. #if OS_CFG_Q_DEL_EN > 0u
  1280. OS_OBJ_QTY OSQDel (OS_Q *p_q,
  1281. OS_OPT opt,
  1282. OS_ERR *p_err);
  1283. #endif
  1284. #if OS_CFG_Q_FLUSH_EN > 0u
  1285. OS_MSG_QTY OSQFlush (OS_Q *p_q,
  1286. OS_ERR *p_err);
  1287. #endif
  1288. void *OSQPend (OS_Q *p_q,
  1289. OS_TICK timeout,
  1290. OS_OPT opt,
  1291. OS_MSG_SIZE *p_msg_size,
  1292. CPU_TS *p_ts,
  1293. OS_ERR *p_err);
  1294. #if OS_CFG_Q_PEND_ABORT_EN > 0u
  1295. OS_OBJ_QTY OSQPendAbort (OS_Q *p_q,
  1296. OS_OPT opt,
  1297. OS_ERR *p_err);
  1298. #endif
  1299. void OSQPost (OS_Q *p_q,
  1300. void *p_void,
  1301. OS_MSG_SIZE msg_size,
  1302. OS_OPT opt,
  1303. OS_ERR *p_err);
  1304. /* ------------------------------------------------ INTERNAL FUNCTIONS ---------------------------------------------- */
  1305. void OS_QClr (OS_Q *p_q);
  1306. #if OS_CFG_DBG_EN > 0u
  1307. void OS_QDbgListAdd (OS_Q *p_q);
  1308. void OS_QDbgListRemove (OS_Q *p_q);
  1309. #endif
  1310. void OS_QInit (OS_ERR *p_err);
  1311. void OS_QPost (OS_Q *p_q,
  1312. void *p_void,
  1313. OS_MSG_SIZE msg_size,
  1314. OS_OPT opt,
  1315. CPU_TS ts,
  1316. OS_ERR *p_err);
  1317. #endif
  1318. /* ================================================================================================================== */
  1319. /* SEMAPHORES */
  1320. /* ================================================================================================================== */
  1321. #if OS_CFG_SEM_EN > 0u
  1322. void OSSemCreate (OS_SEM *p_sem,
  1323. CPU_CHAR *p_name,
  1324. OS_SEM_CTR cnt,
  1325. OS_ERR *p_err);
  1326. #if OS_CFG_SEM_DEL_EN > 0u
  1327. OS_OBJ_QTY OSSemDel (OS_SEM *p_sem,
  1328. OS_OPT opt,
  1329. OS_ERR *p_err);
  1330. #endif
  1331. OS_SEM_CTR OSSemPend (OS_SEM *p_sem,
  1332. OS_TICK timeout,
  1333. OS_OPT opt,
  1334. CPU_TS *p_ts,
  1335. OS_ERR *p_err);
  1336. #if OS_CFG_SEM_PEND_ABORT_EN > 0u
  1337. OS_OBJ_QTY OSSemPendAbort (OS_SEM *p_sem,
  1338. OS_OPT opt,
  1339. OS_ERR *p_err);
  1340. #endif
  1341. OS_SEM_CTR OSSemPost (OS_SEM *p_sem,
  1342. OS_OPT opt,
  1343. OS_ERR *p_err);
  1344. #if OS_CFG_SEM_SET_EN > 0u
  1345. void OSSemSet (OS_SEM *p_sem,
  1346. OS_SEM_CTR cnt,
  1347. OS_ERR *p_err);
  1348. #endif
  1349. /* ------------------------------------------------ INTERNAL FUNCTIONS ---------------------------------------------- */
  1350. void OS_SemClr (OS_SEM *p_sem);
  1351. #if OS_CFG_DBG_EN > 0u
  1352. void OS_SemDbgListAdd (OS_SEM *p_sem);
  1353. void OS_SemDbgListRemove (OS_SEM *p_sem);
  1354. #endif
  1355. void OS_SemInit (OS_ERR *p_err);
  1356. OS_SEM_CTR OS_SemPost (OS_SEM *p_sem,
  1357. OS_OPT opt,
  1358. CPU_TS ts,
  1359. OS_ERR *p_err);
  1360. #endif
  1361. /* ================================================================================================================== */
  1362. /* TASK MANAGEMENT */
  1363. /* ================================================================================================================== */
  1364. #if OS_CFG_TASK_CHANGE_PRIO_EN > 0u
  1365. void OSTaskChangePrio (OS_TCB *p_tcb,
  1366. OS_PRIO prio_new,
  1367. OS_ERR *p_err);
  1368. #endif
  1369. void OSTaskCreate (OS_TCB *p_tcb,
  1370. CPU_CHAR *p_name,
  1371. OS_TASK_PTR p_task,
  1372. void *p_arg,
  1373. OS_PRIO prio,
  1374. CPU_STK *p_stk_base,
  1375. CPU_STK_SIZE stk_limit,
  1376. CPU_STK_SIZE stk_size,
  1377. OS_MSG_QTY q_size,
  1378. OS_TICK time_quanta,
  1379. void *p_ext,
  1380. OS_OPT opt,
  1381. OS_ERR *p_err);
  1382. #if OS_CFG_TASK_DEL_EN > 0u
  1383. void OSTaskDel (OS_TCB *p_tcb,
  1384. OS_ERR *p_err);
  1385. #endif
  1386. #if OS_CFG_TASK_Q_EN > 0u
  1387. OS_MSG_QTY OSTaskQFlush (OS_TCB *p_tcb,
  1388. OS_ERR *p_err);
  1389. void *OSTaskQPend (OS_TICK timeout,
  1390. OS_OPT opt,
  1391. OS_MSG_SIZE *p_msg_size,
  1392. CPU_TS *p_ts,
  1393. OS_ERR *p_err);
  1394. CPU_BOOLEAN OSTaskQPendAbort (OS_TCB *p_tcb,
  1395. OS_OPT opt,
  1396. OS_ERR *p_err);
  1397. void OSTaskQPost (OS_TCB *p_tcb,
  1398. void *p_void,
  1399. OS_MSG_SIZE msg_size,
  1400. OS_OPT opt,
  1401. OS_ERR *p_err);
  1402. #endif
  1403. #if OS_CFG_TASK_REG_TBL_SIZE > 0u
  1404. OS_REG OSTaskRegGet (OS_TCB *p_tcb,
  1405. OS_REG_ID id,
  1406. OS_ERR *p_err);
  1407. OS_REG_ID OSTaskRegGetID (OS_ERR *p_err);
  1408. void OSTaskRegSet (OS_TCB *p_tcb,
  1409. OS_REG_ID id,
  1410. OS_REG value,
  1411. OS_ERR *p_err);
  1412. #endif
  1413. #if OS_CFG_TASK_SUSPEND_EN > 0u
  1414. void OSTaskResume (OS_TCB *p_tcb,
  1415. OS_ERR *p_err);
  1416. void OSTaskSuspend (OS_TCB *p_tcb,
  1417. OS_ERR *p_err);
  1418. #endif
  1419. OS_SEM_CTR OSTaskSemPend (OS_TICK timeout,
  1420. OS_OPT opt,
  1421. CPU_TS *p_ts,
  1422. OS_ERR *p_err);
  1423. #if (OS_CFG_TASK_SEM_PEND_ABORT_EN > 0u)
  1424. CPU_BOOLEAN OSTaskSemPendAbort (OS_TCB *p_tcb,
  1425. OS_OPT opt,
  1426. OS_ERR *p_err);
  1427. #endif
  1428. OS_SEM_CTR OSTaskSemPost (OS_TCB *p_tcb,
  1429. OS_OPT opt,
  1430. OS_ERR *p_err);
  1431. OS_SEM_CTR OSTaskSemSet (OS_TCB *p_tcb,
  1432. OS_SEM_CTR cnt,
  1433. OS_ERR *p_err);
  1434. #if OS_CFG_STAT_TASK_STK_CHK_EN > 0u
  1435. void OSTaskStkChk (OS_TCB *p_tcb,
  1436. CPU_STK_SIZE *p_free,
  1437. CPU_STK_SIZE *p_used,
  1438. OS_ERR *p_err);
  1439. #endif
  1440. #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
  1441. void OSTaskTimeQuantaSet (OS_TCB *p_tcb,
  1442. OS_TICK time_quanta,
  1443. OS_ERR *p_err);
  1444. #endif
  1445. /* ------------------------------------------------ INTERNAL FUNCTIONS ---------------------------------------------- */
  1446. void OS_TaskBlock (OS_TCB *p_tcb,
  1447. OS_TICK timeout);
  1448. #if OS_CFG_DBG_EN > 0u
  1449. void OS_TaskDbgListAdd (OS_TCB *p_tcb);
  1450. void OS_TaskDbgListRemove (OS_TCB *p_tcb);
  1451. #endif
  1452. void OS_TaskInit (OS_ERR *p_err);
  1453. void OS_TaskInitTCB (OS_TCB *p_tcb);
  1454. void OS_TaskQPost (OS_TCB *p_tcb,
  1455. void *p_void,
  1456. OS_MSG_SIZE msg_size,
  1457. OS_OPT opt,
  1458. CPU_TS ts,
  1459. OS_ERR *p_err);
  1460. #if OS_CFG_TASK_SUSPEND_EN > 0u
  1461. void OS_TaskResume (OS_TCB *p_tcb,
  1462. OS_ERR *p_err);
  1463. #endif
  1464. void OS_TaskReturn (void);
  1465. OS_SEM_CTR OS_TaskSemPost (OS_TCB *p_tcb,
  1466. OS_OPT opt,
  1467. CPU_TS ts,
  1468. OS_ERR *p_err);
  1469. #if OS_CFG_TASK_SUSPEND_EN > 0u
  1470. void OS_TaskSuspend (OS_TCB *p_tcb,
  1471. OS_ERR *p_err);
  1472. #endif
  1473. void OS_TaskChangePrio( OS_TCB *p_tcb,
  1474. OS_PRIO prio_new);
  1475. /* ================================================================================================================== */
  1476. /* TASK LOCAL STORAGE (TLS) SUPPORT */
  1477. /* ================================================================================================================== */
  1478. #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
  1479. OS_TLS_ID OS_TLS_GetID (OS_ERR *p_err);
  1480. OS_TLS OS_TLS_GetValue (OS_TCB *p_tcb,
  1481. OS_TLS_ID id,
  1482. OS_ERR *p_err);
  1483. void OS_TLS_Init (OS_ERR *p_err);
  1484. void OS_TLS_SetValue (OS_TCB *p_tcb,
  1485. OS_TLS_ID id,
  1486. OS_TLS value,
  1487. OS_ERR *p_err);
  1488. void OS_TLS_SetDestruct (OS_TLS_ID id,
  1489. OS_TLS_DESTRUCT_PTR p_destruct,
  1490. OS_ERR *p_err);
  1491. void OS_TLS_TaskCreate (OS_TCB *p_tcb);
  1492. void OS_TLS_TaskDel (OS_TCB *p_tcb);
  1493. void OS_TLS_TaskSw (void);
  1494. #endif
  1495. /* ================================================================================================================== */
  1496. /* TIME MANAGEMENT */
  1497. /* ================================================================================================================== */
  1498. void OSTimeDly (OS_TICK dly,
  1499. OS_OPT opt,
  1500. OS_ERR *p_err);
  1501. #if OS_CFG_TIME_DLY_HMSM_EN > 0u
  1502. void OSTimeDlyHMSM (CPU_INT16U hours,
  1503. CPU_INT16U minutes,
  1504. CPU_INT16U seconds,
  1505. CPU_INT32U milli,
  1506. OS_OPT opt,
  1507. OS_ERR *p_err);
  1508. #endif
  1509. #if OS_CFG_TIME_DLY_RESUME_EN > 0u
  1510. void OSTimeDlyResume (OS_TCB *p_tcb,
  1511. OS_ERR *p_err);
  1512. #endif
  1513. OS_TICK OSTimeGet (OS_ERR *p_err);
  1514. void OSTimeSet (OS_TICK ticks,
  1515. OS_ERR *p_err);
  1516. void OSTimeTick (void);
  1517. /* ================================================================================================================== */
  1518. /* TIMER MANAGEMENT */
  1519. /* ================================================================================================================== */
  1520. #if OS_CFG_TMR_EN > 0u
  1521. void OSTmrCreate (OS_TMR *p_tmr,
  1522. CPU_CHAR *p_name,
  1523. OS_TICK dly,
  1524. OS_TICK period,
  1525. OS_OPT opt,
  1526. OS_TMR_CALLBACK_PTR p_callback,
  1527. void *p_callback_arg,
  1528. OS_ERR *p_err);
  1529. CPU_BOOLEAN OSTmrDel (OS_TMR *p_tmr,
  1530. OS_ERR *p_err);
  1531. OS_TICK OSTmrRemainGet (OS_TMR *p_tmr,
  1532. OS_ERR *p_err);
  1533. CPU_BOOLEAN OSTmrStart (OS_TMR *p_tmr,
  1534. OS_ERR *p_err);
  1535. OS_STATE OSTmrStateGet (OS_TMR *p_tmr,
  1536. OS_ERR *p_err);
  1537. CPU_BOOLEAN OSTmrStop (OS_TMR *p_tmr,
  1538. OS_OPT opt,
  1539. void *p_callback_arg,
  1540. OS_ERR *p_err);
  1541. /* ------------------------------------------------ INTERNAL FUNCTIONS ---------------------------------------------- */
  1542. void OS_TmrClr (OS_TMR *p_tmr);
  1543. #if OS_CFG_DBG_EN > 0u
  1544. void OS_TmrDbgListAdd (OS_TMR *p_tmr);
  1545. void OS_TmrDbgListRemove (OS_TMR *p_tmr);
  1546. #endif
  1547. void OS_TmrInit (OS_ERR *p_err);
  1548. void OS_TmrLink (OS_TMR *p_tmr,
  1549. OS_OPT opt);
  1550. void OS_TmrResetPeak (void);
  1551. void OS_TmrUnlink (OS_TMR *p_tmr);
  1552. void OS_TmrTask (void *p_arg);
  1553. #endif
  1554. /* ================================================================================================================== */
  1555. /* MISCELLANEOUS */
  1556. /* ================================================================================================================== */
  1557. void OSInit (OS_ERR *p_err);
  1558. void OSIntEnter (void);
  1559. void OSIntExit (void);
  1560. #ifdef OS_SAFETY_CRITICAL_IEC61508
  1561. void OSSafetyCriticalStart (void);
  1562. #endif
  1563. #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
  1564. void OSSchedRoundRobinCfg (CPU_BOOLEAN en,
  1565. OS_TICK dflt_time_quanta,
  1566. OS_ERR *p_err);
  1567. void OSSchedRoundRobinYield (OS_ERR *p_err);
  1568. #endif
  1569. void OSSched (void);
  1570. void OSSchedLock (OS_ERR *p_err);
  1571. void OSSchedUnlock (OS_ERR *p_err);
  1572. void OSStart (OS_ERR *p_err);
  1573. #if OS_CFG_STAT_TASK_EN > 0u
  1574. void OSStatReset (OS_ERR *p_err);
  1575. void OSStatTaskCPUUsageInit (OS_ERR *p_err);
  1576. #endif
  1577. CPU_INT16U OSVersion (OS_ERR *p_err);
  1578. /* ------------------------------------------------ INTERNAL FUNCTIONS ---------------------------------------------- */
  1579. void OS_IdleTask (void *p_arg);
  1580. void OS_IdleTaskInit (OS_ERR *p_err);
  1581. #if OS_CFG_STAT_TASK_EN > 0u
  1582. void OS_StatTask (void *p_arg);
  1583. #endif
  1584. void OS_StatTaskInit (OS_ERR *p_err);
  1585. void OS_TickTask (void *p_arg);
  1586. void OS_TickTaskInit (OS_ERR *p_err);
  1587. /*
  1588. ************************************************************************************************************************
  1589. ************************************************************************************************************************
  1590. * T A R G E T S P E C I F I C F U N C T I O N S
  1591. ************************************************************************************************************************
  1592. ************************************************************************************************************************
  1593. */
  1594. #ifdef __cplusplus
  1595. extern "C" {
  1596. #endif
  1597. void OSInitHook (void);
  1598. void OSTaskCreateHook (OS_TCB *p_tcb);
  1599. void OSTaskDelHook (OS_TCB *p_tcb);
  1600. void OSIdleTaskHook (void);
  1601. void OSTaskReturnHook (OS_TCB *p_tcb);
  1602. void OSStatTaskHook (void);
  1603. CPU_STK *OSTaskStkInit (OS_TASK_PTR p_task,
  1604. void *p_arg,
  1605. CPU_STK *p_stk_base,
  1606. CPU_STK *p_stk_limit,
  1607. CPU_STK_SIZE stk_size,
  1608. OS_OPT opt);
  1609. void OSTaskSwHook (void);
  1610. void OSTimeTickHook (void);
  1611. #ifdef __cplusplus
  1612. }
  1613. #endif
  1614. /*
  1615. ************************************************************************************************************************
  1616. ************************************************************************************************************************
  1617. * u C / O S - I I I I N T E R N A L F U N C T I O N P R O T O T Y P E S
  1618. ************************************************************************************************************************
  1619. ************************************************************************************************************************
  1620. */
  1621. void OSCfg_Init (void);
  1622. #if OS_CFG_DBG_EN > 0u
  1623. void OS_Dbg_Init (void);
  1624. #endif
  1625. #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
  1626. void OS_IntQTaskInit (OS_ERR *p_err);
  1627. void OS_IntQPost (OS_OBJ_TYPE type,
  1628. void *p_obj,
  1629. void *p_void,
  1630. OS_MSG_SIZE msg_size,
  1631. OS_FLAGS flags,
  1632. OS_OPT opt,
  1633. CPU_TS ts,
  1634. OS_ERR *p_err);
  1635. void OS_IntQRePost (void);
  1636. void OS_IntQTask (void *p_arg);
  1637. #endif
  1638. /* ----------------------------------------------- MESSAGE MANAGEMENT ----------------------------------------------- */
  1639. void OS_MsgPoolInit (OS_ERR *p_err);
  1640. OS_MSG_QTY OS_MsgQFreeAll (OS_MSG_Q *p_msg_q);
  1641. void *OS_MsgQGet (OS_MSG_Q *p_msg_q,
  1642. OS_MSG_SIZE *p_msg_size,
  1643. CPU_TS *p_ts,
  1644. OS_ERR *p_err);
  1645. void OS_MsgQInit (OS_MSG_Q *p_msg_q,
  1646. OS_MSG_QTY size);
  1647. void OS_MsgQPut (OS_MSG_Q *p_msg_q,
  1648. void *p_void,
  1649. OS_MSG_SIZE msg_size,
  1650. OS_OPT opt,
  1651. CPU_TS ts,
  1652. OS_ERR *p_err);
  1653. /* ---------------------------------------------- PEND/POST MANAGEMENT ---------------------------------------------- */
  1654. void OS_Pend (OS_PEND_DATA *p_pend_data,
  1655. OS_PEND_OBJ *p_obj,
  1656. OS_STATE pending_on,
  1657. OS_TICK timeout);
  1658. void OS_PendAbort (OS_PEND_OBJ *p_obj,
  1659. OS_TCB *p_tcb,
  1660. CPU_TS ts);
  1661. void OS_PendAbort1 (OS_PEND_OBJ *p_obj,
  1662. OS_TCB *p_tcb,
  1663. CPU_TS ts);
  1664. void OS_PendObjDel (OS_PEND_OBJ *p_obj,
  1665. OS_TCB *p_tcb,
  1666. CPU_TS ts);
  1667. void OS_PendObjDel1 (OS_PEND_OBJ *p_obj,
  1668. OS_TCB *p_tcb,
  1669. CPU_TS ts);
  1670. void OS_Post (OS_PEND_OBJ *p_obj,
  1671. OS_TCB *p_tcb,
  1672. void *p_void,
  1673. OS_MSG_SIZE msg_size,
  1674. CPU_TS ts);
  1675. void OS_Post1 (OS_PEND_OBJ *p_obj,
  1676. OS_TCB *p_tcb,
  1677. void *p_void,
  1678. OS_MSG_SIZE msg_size,
  1679. CPU_TS ts);
  1680. /* ----------------------------------------------- PRIORITY MANAGEMENT ---------------------------------------------- */
  1681. void OS_PrioInit (void);
  1682. void OS_PrioInsert (OS_PRIO prio);
  1683. void OS_PrioRemove (OS_PRIO prio);
  1684. OS_PRIO OS_PrioGetHighest (void);
  1685. /* --------------------------------------------------- SCHEDULING --------------------------------------------------- */
  1686. #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
  1687. void OS_Sched0 (void);
  1688. #endif
  1689. #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
  1690. void OS_SchedLockTimeMeasStart (void);
  1691. void OS_SchedLockTimeMeasStop (void);
  1692. #endif
  1693. #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
  1694. void OS_SchedRoundRobin (OS_RDY_LIST *p_rdy_list);
  1695. #endif
  1696. /* --------------------------------------------- READY LIST MANAGEMENT ---------------------------------------------- */
  1697. void OS_RdyListInit (void);
  1698. void OS_RdyListInsert (OS_TCB *p_tcb);
  1699. void OS_RdyListInsertHead (OS_TCB *p_tcb);
  1700. void OS_RdyListInsertTail (OS_TCB *p_tcb);
  1701. void OS_RdyListMoveHeadToTail (OS_RDY_LIST *p_rdy_list);
  1702. void OS_RdyListRemove (OS_TCB *p_tcb);
  1703. /* ---------------------------------------------- PEND LIST MANAGEMENT ---------------------------------------------- */
  1704. void OS_PendDataInit (OS_TCB *p_tcb,
  1705. OS_PEND_DATA *p_pend_data_tbl,
  1706. OS_OBJ_QTY tbl_size);
  1707. #if OS_CFG_DBG_EN > 0u
  1708. void OS_PendDbgNameAdd (OS_PEND_OBJ *p_obj,
  1709. OS_TCB *p_tcb);
  1710. void OS_PendDbgNameRemove (OS_PEND_OBJ *p_obj,
  1711. OS_TCB *p_tcb);
  1712. #endif
  1713. OS_PEND_LIST *OS_PendListGetPtr (OS_PEND_OBJ *p_obj);
  1714. void OS_PendListInit (OS_PEND_LIST *p_pend_list);
  1715. void OS_PendListInsertHead (OS_PEND_LIST *p_pend_list,
  1716. OS_PEND_DATA *p_pend_data);
  1717. void OS_PendListInsertPrio (OS_PEND_LIST *p_pend_list,
  1718. OS_PEND_DATA *p_pend_data);
  1719. void OS_PendListChangePrio (OS_TCB *p_tcb);
  1720. void OS_PendListRemove (OS_TCB *p_tcb);
  1721. void OS_PendListRemove1 (OS_PEND_LIST *p_pend_list,
  1722. OS_PEND_DATA *p_pend_data);
  1723. /* ---------------------------------------------- TICK LIST MANAGEMENT ---------------------------------------------- */
  1724. void OS_TickListInsert (OS_TICK_LIST *p_list,
  1725. OS_TCB *p_tcb,
  1726. OS_TICK time);
  1727. void OS_TickListInsertDly (OS_TCB *p_tcb,
  1728. OS_TICK time,
  1729. OS_OPT opt,
  1730. OS_ERR *p_err);
  1731. void OS_TickListRemove (OS_TCB *p_tcb);
  1732. void OS_TickListResetPeak (void);
  1733. /*
  1734. ************************************************************************************************************************
  1735. * LOOK FOR MISSING #define CONSTANTS
  1736. *
  1737. * This section is used to generate ERROR messages at compile time if certain #define constants are
  1738. * MISSING in OS_CFG.H. This allows you to quickly determine the source of the error.
  1739. *
  1740. * You SHOULD NOT change this section UNLESS you would like to add more comments as to the source of the
  1741. * compile time error.
  1742. ************************************************************************************************************************
  1743. */
  1744. /*
  1745. ************************************************************************************************************************
  1746. * MISCELLANEOUS
  1747. ************************************************************************************************************************
  1748. */
  1749. #ifndef OS_CFG_APP_HOOKS_EN
  1750. #error "OS_CFG.H, Missing OS_CFG_APP_HOOKS_EN: Enable (1) or Disable (0) application specific hook functions"
  1751. #endif
  1752. #ifndef OS_CFG_ARG_CHK_EN
  1753. #error "OS_CFG.H, Missing OS_CFG_ARG_CHK_EN: Enable (1) or Disable (0) argument checking"
  1754. #endif
  1755. #ifndef OS_CFG_DBG_EN
  1756. #error "OS_CFG.H, Missing OS_CFG_DBG_EN: Allows you to include variables for debugging or not"
  1757. #endif
  1758. #ifndef OS_CFG_CALLED_FROM_ISR_CHK_EN
  1759. #error "OS_CFG.H, Missing OS_CFG_CALLED_FROM_ISR_CHK_EN: Enable (1) or Disable (0) checking whether in an ISR in kernel services"
  1760. #endif
  1761. #ifndef OS_CFG_OBJ_TYPE_CHK_EN
  1762. #error "OS_CFG.H, Missing OS_CFG_OBJ_TYPE_CHK_EN: Enable (1) or Disable (0) checking for proper object types in kernel services"
  1763. #endif
  1764. #ifndef OS_CFG_PEND_MULTI_EN
  1765. #error "OS_CFG.H, Missing OS_CFG_PEND_MULTI_EN: Enable (1) or Disable (0) multi-pend feature"
  1766. #endif
  1767. #if OS_CFG_PRIO_MAX < 8u
  1768. #error "OS_CFG.H, OS_CFG_PRIO_MAX must be >= 8"
  1769. #endif
  1770. #ifndef OS_CFG_SCHED_LOCK_TIME_MEAS_EN
  1771. #error "OS_CFG.H, Missing OS_CFG_SCHED_LOCK_TIME_MEAS_EN: Include code to measure scheduler lock time"
  1772. #else
  1773. #if (OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u) && \
  1774. (OS_CFG_TS_EN < 1u)
  1775. #error "OS_CFG.H, OS_CFG_TS_EN must be Enabled (1) to measure scheduler lock time"
  1776. #endif
  1777. #endif
  1778. #ifndef OS_CFG_SCHED_ROUND_ROBIN_EN
  1779. #error "OS_CFG.H, Missing OS_CFG_SCHED_ROUND_ROBIN_EN: Include code for Round Robin Scheduling"
  1780. #endif
  1781. #ifndef OS_CFG_STK_SIZE_MIN
  1782. #error "OS_CFG.H, Missing OS_CFG_STK_SIZE_MIN: Determines the minimum size for a task stack"
  1783. #endif
  1784. #ifndef OS_CFG_TS_EN
  1785. #error "OS_CFG.H, Missing OS_CFG_TS_EN: Determines whether time stamping is enabled"
  1786. #else
  1787. #if (OS_CFG_TS_EN > 0u) && \
  1788. (CPU_CFG_TS_EN == DEF_DISABLED)
  1789. #error "CPU_CFG.H, CPU_CFG_TS_32_EN must be Enabled (1) to use time stamp feature"
  1790. #endif
  1791. #endif
  1792. /*
  1793. ************************************************************************************************************************
  1794. * EVENT FLAGS
  1795. ************************************************************************************************************************
  1796. */
  1797. #ifndef OS_CFG_FLAG_EN
  1798. #error "OS_CFG.H, Missing OS_CFG_FLAG_EN: Enable (1) or Disable (0) code generation for Event Flags"
  1799. #else
  1800. #ifndef OS_CFG_FLAG_DEL_EN
  1801. #error "OS_CFG.H, Missing OS_CFG_FLAG_DEL_EN: Include code for OSFlagDel()"
  1802. #endif
  1803. #ifndef OS_CFG_FLAG_MODE_CLR_EN
  1804. #error "OS_CFG.H, Missing OS_CFG_FLAG_MODE_CLR_EN: Include code for Wait on Clear EVENT FLAGS"
  1805. #endif
  1806. #ifndef OS_CFG_FLAG_PEND_ABORT_EN
  1807. #error "OS_CFG.H, Missing OS_CFG_FLAG_PEND_ABORT_EN: Include code for aborting pends from another task"
  1808. #endif
  1809. #endif
  1810. /*
  1811. ************************************************************************************************************************
  1812. * MEMORY MANAGEMENT
  1813. ************************************************************************************************************************
  1814. */
  1815. #ifndef OS_CFG_MEM_EN
  1816. #error "OS_CFG.H, Missing OS_CFG_MEM_EN: Enable (1) or Disable (0) code generation for MEMORY MANAGER"
  1817. #endif
  1818. /*
  1819. ************************************************************************************************************************
  1820. * MUTUAL EXCLUSION SEMAPHORES
  1821. ************************************************************************************************************************
  1822. */
  1823. #ifndef OS_CFG_MUTEX_EN
  1824. #error "OS_CFG.H, Missing OS_CFG_MUTEX_EN: Enable (1) or Disable (0) code generation for MUTEX"
  1825. #else
  1826. #ifndef OS_CFG_MUTEX_DEL_EN
  1827. #error "OS_CFG.H, Missing OS_CFG_MUTEX_DEL_EN: Include code for OSMutexDel()"
  1828. #endif
  1829. #ifndef OS_CFG_MUTEX_PEND_ABORT_EN
  1830. #error "OS_CFG.H, Missing OS_CFG_MUTEX_PEND_ABORT_EN: Include code for OSMutexPendAbort()"
  1831. #endif
  1832. #endif
  1833. /*
  1834. ************************************************************************************************************************
  1835. * MESSAGE QUEUES
  1836. ************************************************************************************************************************
  1837. */
  1838. #ifndef OS_CFG_Q_EN
  1839. #error "OS_CFG.H, Missing OS_CFG_Q_EN: Enable (1) or Disable (0) code generation for QUEUES"
  1840. #else
  1841. #ifndef OS_CFG_Q_DEL_EN
  1842. #error "OS_CFG.H, Missing OS_CFG_Q_DEL_EN: Include code for OSQDel()"
  1843. #endif
  1844. #ifndef OS_CFG_Q_FLUSH_EN
  1845. #error "OS_CFG.H, Missing OS_CFG_Q_FLUSH_EN: Include code for OSQFlush()"
  1846. #endif
  1847. #ifndef OS_CFG_Q_PEND_ABORT_EN
  1848. #error "OS_CFG.H, Missing OS_CFG_Q_PEND_ABORT_EN: Include code for OSQPendAbort()"
  1849. #endif
  1850. #endif
  1851. /*
  1852. ************************************************************************************************************************
  1853. * SEMAPHORES
  1854. ************************************************************************************************************************
  1855. */
  1856. #ifndef OS_CFG_SEM_EN
  1857. #error "OS_CFG.H, Missing OS_CFG_SEM_EN: Enable (1) or Disable (0) code generation for SEMAPHORES"
  1858. #else
  1859. #ifndef OS_CFG_SEM_DEL_EN
  1860. #error "OS_CFG.H, Missing OS_CFG_SEM_DEL_EN: Include code for OSSemDel()"
  1861. #endif
  1862. #ifndef OS_CFG_SEM_PEND_ABORT_EN
  1863. #error "OS_CFG.H, Missing OS_CFG_SEM_PEND_ABORT_EN: Include code for OSSemPendAbort()"
  1864. #endif
  1865. #ifndef OS_CFG_SEM_SET_EN
  1866. #error "OS_CFG.H, Missing OS_CFG_SEM_SET_EN: Include code for OSSemSet()"
  1867. #endif
  1868. #endif
  1869. /*
  1870. ************************************************************************************************************************
  1871. * TASK MANAGEMENT
  1872. ************************************************************************************************************************
  1873. */
  1874. #ifndef OS_CFG_STAT_TASK_EN
  1875. #error "OS_CFG.H, Missing OS_CFG_STAT_TASK_EN: Enable (1) or Disable(0) the statistics task"
  1876. #endif
  1877. #ifndef OS_CFG_STAT_TASK_STK_CHK_EN
  1878. #error "OS_CFG.H, Missing OS_CFG_STAT_TASK_STK_CHK_EN: Check task stacks from statistics task"
  1879. #endif
  1880. #ifndef OS_CFG_TASK_CHANGE_PRIO_EN
  1881. #error "OS_CFG.H, Missing OS_CFG_TASK_CHANGE_PRIO_EN: Include code for OSTaskChangePrio()"
  1882. #endif
  1883. #ifndef OS_CFG_TASK_DEL_EN
  1884. #error "OS_CFG.H, Missing OS_CFG_TASK_DEL_EN: Include code for OSTaskDel()"
  1885. #endif
  1886. #ifndef OS_CFG_TASK_Q_EN
  1887. #error "OS_CFG.H, Missing OS_CFG_TASK_Q_EN: Include code for OSTaskQxxx()"
  1888. #endif
  1889. #ifndef OS_CFG_TASK_Q_PEND_ABORT_EN
  1890. #error "OS_CFG.H, Missing OS_CFG_TASK_Q_PEND_ABORT_EN: Include code for OSTaskQPendAbort()"
  1891. #endif
  1892. #ifndef OS_CFG_TASK_PROFILE_EN
  1893. #error "OS_CFG.H, Missing OS_CFG_TASK_PROFILE_EN: Include code for task profiling"
  1894. #endif
  1895. #ifndef OS_CFG_TASK_REG_TBL_SIZE
  1896. #error "OS_CFG.H, Missing OS_CFG_TASK_REG_TBL_SIZE: Include support for task specific registers"
  1897. #endif
  1898. #ifndef OS_CFG_TASK_SEM_PEND_ABORT_EN
  1899. #error "OS_CFG.H, Missing OS_CFG_TASK_SEM_PEND_ABORT_EN: Include code for OSTaskSemPendAbort()"
  1900. #endif
  1901. #ifndef OS_CFG_TASK_SUSPEND_EN
  1902. #error "OS_CFG.H, Missing OS_CFG_TASK_SUSPEND_EN: Include code for OSTaskSuspend() and OSTaskResume()"
  1903. #endif
  1904. /*
  1905. ************************************************************************************************************************
  1906. * TIME MANAGEMENT
  1907. ************************************************************************************************************************
  1908. */
  1909. #ifndef OS_CFG_TIME_DLY_HMSM_EN
  1910. #error "OS_CFG.H, Missing OS_CFG_TIME_DLY_HMSM_EN: Include code for OSTimeDlyHMSM()"
  1911. #endif
  1912. #ifndef OS_CFG_TIME_DLY_RESUME_EN
  1913. #error "OS_CFG.H, Missing OS_CFG_TIME_DLY_RESUME_EN: Include code for OSTimeDlyResume()"
  1914. #endif
  1915. /*
  1916. ************************************************************************************************************************
  1917. * TIMER MANAGEMENT
  1918. ************************************************************************************************************************
  1919. */
  1920. #ifndef OS_CFG_TMR_EN
  1921. #error "OS_CFG.H, Missing OS_CFG_TMR_EN: When (1) enables code generation for Timer Management"
  1922. #else
  1923. #ifndef OS_CFG_TMR_DEL_EN
  1924. #error "OS_CFG.H, Missing OS_CFG_TMR_DEL_EN: Enables (1) or Disables (0) code for OSTmrDel()"
  1925. #endif
  1926. #endif
  1927. /*
  1928. ************************************************************************************************************************
  1929. * LIBRARY CONFIGURATION ERRORS
  1930. ************************************************************************************************************************
  1931. */
  1932. /* See 'os.h Note #1a'. */
  1933. #if LIB_VERSION < 126u
  1934. #error "lib_def.h, LIB_VERSION SHOULD be >= V1.26"
  1935. #endif
  1936. /* See 'os.h Note #1b'. */
  1937. #if CPU_CORE_VERSION < 125u
  1938. #error "cpu_core.h, CPU_CORE_VERSION SHOULD be >= V1.25"
  1939. #endif
  1940. /*
  1941. ************************************************************************************************************************
  1942. * uC/OS-III MODULE END
  1943. ************************************************************************************************************************
  1944. */
  1945. #endif