Mark3 Realtime Kernel
priomapl2.h
Go to the documentation of this file.
1 /*===========================================================================
2  _____ _____ _____ _____
3  ___| _|__ __|_ |__ __|__ |__ __| __ |__ ______
4 | \ / | || \ || | || |/ / ||___ |
5 | \/ | || \ || \ || \ ||___ |
6 |__/\__/|__|_||__|\__\ __||__|\__\ __||__|\__\ __||______|
7  |_____| |_____| |_____| |_____|
8 
9 --[Mark3 Realtime Platform]--------------------------------------------------
10 
11 Copyright (c) 2012 - 2019 m0slevin, all rights reserved.
12 See license.txt for more information
13 ===========================================================================*/
20 #pragma once
21 
22 #include "kerneltypes.h"
23 #include "mark3cfg.h"
24 #include "threadport.h"
25 
26 namespace Mark3
27 {
28 //---------------------------------------------------------------------------
49 template <typename T, size_t C>
51 {
52 public:
58  {
60  for (auto i = PORT_PRIO_TYPE{0}; i < m_uXPrioMapNumWords; i++) { m_auXPriorityMap[i] = 0; }
61  }
62 
68  void Set(T uXPrio_)
69  {
70  auto uXPrioBit = PrioBit(uXPrio_);
71  auto uXWordIdx = PrioMapWordIndex(uXPrio_);
72 
73  m_auXPriorityMap[uXWordIdx] |= (1 << uXPrioBit);
74  m_uXPriorityMapL2 |= (1 << uXWordIdx);
75  }
76 
82  void Clear(T uXPrio_)
83  {
84  auto uXPrioBit = PrioBit(uXPrio_);
85  auto uXWordIdx = PrioMapWordIndex(uXPrio_);
86 
87  m_auXPriorityMap[uXWordIdx] &= ~(1 << uXPrioBit);
88  if (!m_auXPriorityMap[uXWordIdx]) {
89  m_uXPriorityMapL2 &= ~(1 << uXWordIdx);
90  }
91  }
92 
101  {
102  auto uXMapIdx = PriorityFromBitmap(m_uXPriorityMapL2);
103  if (!uXMapIdx) {
104  return 0;
105  }
106  uXMapIdx--;
107  auto uXPrio = PriorityFromBitmap(m_auXPriorityMap[uXMapIdx]);
108  uXPrio += (uXMapIdx * m_uXPrioMapBits);
109  return uXPrio;
110  }
111 
112 private:
113  static inline T PrioBit(T prio) { return prio & m_uXPrioMapBitMask; }
114 
115  static inline T PrioMapWordIndex(T prio) { return prio >> m_uXPrioMapWordShift; }
116 
117  static inline T PriorityFromBitmap(T uXPrio_)
118  {
119 #if PORT_USE_HW_CLZ
120  // Support hardware-accelerated Count-leading-zeros instruction
121  return m_uXPrioMapBits - PORT_CLZ(uXPrio_);
122 #else
123  // Default un-optimized count-leading zeros operation
124  T uXMask = 1 << (m_uXPrioMapBits - 1);
125  auto u8Zeros = T { 0 };
126 
127  while (uXMask) {
128  if (uXMask & uXPrio_) {
129  return (m_uXPrioMapBits - u8Zeros);
130  }
131 
132  uXMask >>= 1;
133  u8Zeros++;
134  }
135  return 0;
136 #endif
137  }
138 
139  static constexpr size_t m_uXPrioMapShiftLUT[9] = {0, 3, 4, 0, 5, 0, 0, 0, 6};
140  static constexpr auto m_uXPrioMapWordShift = T { m_uXPrioMapShiftLUT[sizeof(T)] };
141  static constexpr auto m_uXPrioMapBits = T { 8 * sizeof(T) };
142  static constexpr auto m_uXPrioMapBitMask = T { (1 << m_uXPrioMapWordShift) - 1 };
143 
144  // Required size of the bitmap array in words
145  static constexpr auto m_uXPrioMapNumWords
146  = T { (C + (m_uXPrioMapBits - 1)) / m_uXPrioMapBits };
147 
150 };
151 } // namespace Mark3
static constexpr auto m_uXPrioMapBits
Definition: priomapl2.h:141
void Clear(T uXPrio_)
Clear Clear the priority map bitmap data, at all levels, for the given priority.
Definition: priomapl2.h:82
Basic data type primatives used throughout the OS.
static constexpr auto m_uXPrioMapNumWords
Definition: priomapl2.h:146
PriorityMapL2()
PriorityMap Initialize the priority map object, clearing the bitamp data to all 0&#39;s.
Definition: priomapl2.h:57
static T PrioMapWordIndex(T prio)
Definition: priomapl2.h:115
#define PORT_PRIO_TYPE
Type used for bitmap in the PriorityMap class.
Definition: portcfg.h:73
T m_auXPriorityMap[m_uXPrioMapNumWords]
Definition: priomapl2.h:148
static constexpr auto m_uXPrioMapBitMask
Definition: priomapl2.h:142
Definition: atomic.cpp:23
Mark3 Kernel Configuration This file is used to configure the kernel for your specific application in...
uint8_t PORT_CLZ(uint8_t in_)
Definition: threadport.h:144
ATMega1284p Multithreading support.
The PriorityMapL2 class This class implements a priority bitmap data structure. Each bit in the objec...
Definition: priomapl2.h:50
static T PrioBit(T prio)
Definition: priomapl2.h:113
static T PriorityFromBitmap(T uXPrio_)
Definition: priomapl2.h:117
static constexpr auto m_uXPrioMapWordShift
Definition: priomapl2.h:140
void Set(T uXPrio_)
Set Set the priority map bitmap data, at all levels, for the given priority.
Definition: priomapl2.h:68
static constexpr size_t m_uXPrioMapShiftLUT[9]
Definition: priomapl2.h:139
T HighestPriority(void)
HighestPriority Computes the numeric priority of the highest-priority thread represented in the prior...
Definition: priomapl2.h:100