os.h 113 KB

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