os_prio.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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. * PRIORITY MANAGEMENT
  19. *
  20. * File : os_prio.c
  21. * Version : V3.08.02
  22. *********************************************************************************************************
  23. */
  24. #define MICRIUM_SOURCE
  25. #include "os.h"
  26. #ifdef VSC_INCLUDE_SOURCE_FILE_NAMES
  27. const CPU_CHAR *os_prio__c = "$Id: $";
  28. #endif
  29. /*
  30. ************************************************************************************************************************
  31. * INITIALIZE THE PRIORITY LIST
  32. *
  33. * Description: This function is called by uC/OS-III to initialize the list of ready priorities.
  34. *
  35. * Arguments : none
  36. *
  37. * Returns : none
  38. *
  39. * Note : This function is INTERNAL to uC/OS-III and your application should not call it.
  40. ************************************************************************************************************************
  41. */
  42. void OS_PrioInit (void)
  43. {
  44. CPU_DATA i;
  45. /* Clear the bitmap table ... no task is ready */
  46. for (i = 0u; i < OS_PRIO_TBL_SIZE; i++) {
  47. OSPrioTbl[i] = 0u;
  48. }
  49. #if (OS_CFG_TASK_IDLE_EN == 0u)
  50. OS_PrioInsert ((OS_PRIO)(OS_CFG_PRIO_MAX - 1u)); /* Insert what would be the idle task */
  51. #endif
  52. }
  53. /*
  54. ************************************************************************************************************************
  55. * GET HIGHEST PRIORITY TASK WAITING
  56. *
  57. * Description: This function is called by other uC/OS-III services to determine the highest priority task
  58. * waiting on the event.
  59. *
  60. * Arguments : none
  61. *
  62. * Returns : The priority of the Highest Priority Task (HPT) waiting for the event
  63. *
  64. * Note(s) : 1) This function is INTERNAL to uC/OS-III and your application MUST NOT call it.
  65. ************************************************************************************************************************
  66. */
  67. OS_PRIO OS_PrioGetHighest (void)
  68. {
  69. #if (OS_CFG_PRIO_MAX <= (CPU_CFG_DATA_SIZE * 8u)) /* Optimize for less than word size nbr of priorities */
  70. return ((OS_PRIO)CPU_CntLeadZeros(OSPrioTbl[0]));
  71. #elif (OS_CFG_PRIO_MAX <= (2u * (CPU_CFG_DATA_SIZE * 8u))) /* Optimize for 2x the word size nbr of priorities */
  72. if (OSPrioTbl[0] == 0u) {
  73. return ((OS_PRIO)((OS_PRIO)CPU_CntLeadZeros(OSPrioTbl[1]) + (CPU_CFG_DATA_SIZE * 8u)));
  74. } else {
  75. return ((OS_PRIO)((OS_PRIO)CPU_CntLeadZeros(OSPrioTbl[0])));
  76. }
  77. #else
  78. CPU_DATA *p_tbl;
  79. OS_PRIO prio;
  80. prio = 0u;
  81. p_tbl = &OSPrioTbl[0];
  82. while (*p_tbl == 0u) { /* Search the bitmap table for the highest priority */
  83. prio = (OS_PRIO)(prio + (CPU_CFG_DATA_SIZE * 8u)); /* Compute the step of each CPU_DATA entry */
  84. p_tbl++;
  85. }
  86. prio += (OS_PRIO)CPU_CntLeadZeros(*p_tbl); /* Find the position of the first bit set at the entry */
  87. return (prio);
  88. #endif
  89. }
  90. /*
  91. ************************************************************************************************************************
  92. * INSERT PRIORITY
  93. *
  94. * Description: This function is called to insert a priority in the priority table.
  95. *
  96. * Arguments : prio is the priority to insert
  97. *
  98. * Returns : none
  99. *
  100. * Note(s) : 1) This function is INTERNAL to uC/OS-III and your application MUST NOT call it.
  101. ************************************************************************************************************************
  102. */
  103. void OS_PrioInsert (OS_PRIO prio)
  104. {
  105. #if (OS_CFG_PRIO_MAX <= (CPU_CFG_DATA_SIZE * 8u)) /* Optimize for less than word size nbr of priorities */
  106. OSPrioTbl[0] |= (CPU_DATA)1u << (((CPU_CFG_DATA_SIZE * 8u) - 1u) - prio);
  107. #elif (OS_CFG_PRIO_MAX <= (2u * (CPU_CFG_DATA_SIZE * 8u))) /* Optimize for 2x the word size nbr of priorities */
  108. if (prio < (CPU_CFG_DATA_SIZE * 8u)) {
  109. OSPrioTbl[0] |= (CPU_DATA)1u << (((CPU_CFG_DATA_SIZE * 8u) - 1u) - prio);
  110. } else {
  111. OSPrioTbl[1] |= (CPU_DATA)1u << (((CPU_CFG_DATA_SIZE * 8u) - 1u) - (prio - (CPU_CFG_DATA_SIZE * 8u)));
  112. }
  113. #else
  114. CPU_DATA bit_nbr;
  115. OS_PRIO ix;
  116. ix = (OS_PRIO)(prio / (CPU_CFG_DATA_SIZE * 8u));
  117. bit_nbr = (CPU_DATA)prio & ((CPU_CFG_DATA_SIZE * 8u) - 1u);
  118. OSPrioTbl[ix] |= (CPU_DATA)1u << (((CPU_CFG_DATA_SIZE * 8u) - 1u) - bit_nbr);
  119. #endif
  120. }
  121. /*
  122. ************************************************************************************************************************
  123. * REMOVE PRIORITY
  124. *
  125. * Description: This function is called to remove a priority in the priority table.
  126. *
  127. * Arguments : prio is the priority to remove
  128. *
  129. * Returns : none
  130. *
  131. * Note(s) : 1) This function is INTERNAL to uC/OS-III and your application MUST NOT call it.
  132. ************************************************************************************************************************
  133. */
  134. void OS_PrioRemove (OS_PRIO prio)
  135. {
  136. #if (OS_CFG_PRIO_MAX <= (CPU_CFG_DATA_SIZE * 8u)) /* Optimize for less than word size nbr of priorities */
  137. OSPrioTbl[0] &= ~((CPU_DATA)1u << (((CPU_CFG_DATA_SIZE * 8u) - 1u) - prio));
  138. #elif (OS_CFG_PRIO_MAX <= (2u * (CPU_CFG_DATA_SIZE * 8u))) /* Optimize for 2x the word size nbr of priorities */
  139. if (prio < (CPU_CFG_DATA_SIZE * 8u)) {
  140. OSPrioTbl[0] &= ~((CPU_DATA)1u << (((CPU_CFG_DATA_SIZE * 8u) - 1u) - prio));
  141. } else {
  142. OSPrioTbl[1] &= ~((CPU_DATA)1u << (((CPU_CFG_DATA_SIZE * 8u) - 1u) - (prio - (CPU_CFG_DATA_SIZE * 8u))));
  143. }
  144. #else
  145. CPU_DATA bit_nbr;
  146. OS_PRIO ix;
  147. ix = (OS_PRIO)(prio / (CPU_CFG_DATA_SIZE * 8u));
  148. bit_nbr = (CPU_DATA)prio & ((CPU_CFG_DATA_SIZE * 8u) - 1u);
  149. OSPrioTbl[ix] &= ~((CPU_DATA) 1u << (((CPU_CFG_DATA_SIZE * 8u) - 1u) - bit_nbr));
  150. #endif
  151. }