27#include <basictypes.h>
36#define OS_LO_PRIO (OS_MAX_PRIOS-1)
45#define OS_STAT_RDY 0x00
46#define OS_STAT_MBOX 0x01
47#define OS_STAT_SEM 0x02
49#define OS_STAT_FIFO 0x08
50#define OS_STAT_CRIT 0x10
51#define OS_STAT_DELAY 0x20
52#define OS_STAT_JOIN 0x40
53#define OS_STAT_RES4 0x40
54#define OS_STAT_RES5 0x80
65#define OS_MBOX_FULL 20
68#define OS_PRIO_EXIST 40
69#define OS_PRIO_INVALID 41
73#define OS_NO_MORE_TCB 70
83#define OS_TFLAG_IN_USE 0x80
88typedef volatile uint32_t tick_t;
94extern volatile tick_t TimeTick;
97inline bool IsTickLater(uint32_t test_time)
99 return ((
int)(TimeTick - test_time) < 0);
103inline bool IsTickNowOrEarlier(uint32_t test_time)
105 return ((
int)(TimeTick - test_time) >= 0);
109inline bool Is2ndTickEarlier(uint32_t t1, uint32_t t2)
111 return (((
int)(t1 - t2)) > 0);
115inline bool Is2ndTickNowOrEarlier(uint32_t t1, uint32_t t2)
117 return (((
int)(t1 - t2)) >= 0);
121struct RawTickTimeout_t
123 tick_t expiration = 0;
125 inline bool expired()
const {
return expiration ? (((int)(expiration - TimeTick)) <= 0) : false; }
126 inline bool expired()
volatile {
return expiration ? (((int)(expiration - TimeTick)) <= 0) : false; }
127 inline operator bool()
const {
return !expired(); }
128 const RawTickTimeout_t &operator=(
const TickTimeout &rhs);
129 volatile RawTickTimeout_t &operator=(
const TickTimeout &rhs)
volatile;
131 inline bool operator<(
const RawTickTimeout_t &later)
135 if (!later.expiration)
137 return (((
int)(expiration - later.expiration)) <= 0);
140 inline bool operator<(tick_t later)
144 return (((
int)(expiration - later)) <= 0);
147 inline tick_t operator-(
const tick_t &tick) {
return expiration - tick; }
148 inline tick_t operator-(
const tick_t &tick)
const {
return expiration - tick; }
149 inline tick_t operator-(
const tick_t &tick)
volatile {
return expiration - tick; }
152inline bool operator==(
const RawTickTimeout_t &lhs,
const int &rhs)
154 return lhs.expiration == (tick_t)rhs;
157inline bool operator==(
const volatile RawTickTimeout_t &lhs,
const int &rhs)
159 return lhs.expiration == (tick_t)rhs;
169 RawTickTimeout_t raw;
171 void set(uint32_t timeout)
173 if (!timeout) { raw.expiration = 0; }
176 raw.expiration = TimeTick + (timeout & 0x7FFFFFFF);
180 if (timeout && !raw.expiration) { raw.expiration = 1; }
185 class uint32_nonboolean_t
190 uint32_nonboolean_t(uint32_t val) : value(val) {}
191 inline explicit operator bool() {
return (
bool)value; }
192 inline operator uint32_t() {
return value; }
195 explicit TickTimeout() { set(0); }
202 TickTimeout(uint32_t timeout) { set(timeout); }
203 TickTimeout(uint16_t timeout) { set(timeout); }
204 TickTimeout(
int timeout) { set(timeout); }
212 inline uint32_t val()
const
214 if (!raw.expiration) {
return raw.expiration; }
215 int ret = raw.expiration - TimeTick;
217 return (ret > 0) ? ret : 1;
226 inline bool expired()
const {
return raw.expired(); }
239 inline operator bool()
const {
return !expired(); }
241 inline operator uint32_t()
const {
return val(); }
243 inline operator uint16_t()
const
245 uint32_t ret = val();
246 return ret > 0xFFFF ? 0xFFFE : ret;
249 inline TickTimeout &operator=(
const TickTimeout &rhs)
251 raw.expiration = rhs.raw.expiration;
254 inline TickTimeout &operator=(uint32_t val)
259 inline bool operator<(TickTimeout later)
261 return raw < later.raw;
263 inline bool operator<(tick_t later)
267 inline TickTimeout &operator+=(uint32_t val)
271 raw.expiration += (val & 0x7FFFFFFF);
275 if (val && !raw.expiration) { raw.expiration = 1; }
285 inline void SetUntil(uint32_t when) {raw.expiration = when; }
287 friend void OSTimeWaitUntil(uint32_t systemTickValue);
289 friend class RawTickTimeout_t;
292inline const RawTickTimeout_t &RawTickTimeout_t::operator=(
const TickTimeout &rhs)
294 expiration = rhs.raw.expiration;
298inline volatile RawTickTimeout_t &RawTickTimeout_t::operator=(
const TickTimeout &rhs)
volatile
300 expiration = rhs.raw.expiration;
309 volatile uint32_t OSTbl[TASK_TABLE_SIZE];
312 void Init()
volatile;
313 void Copy(
volatile task_bit_list &rhs)
315 for (
int i = 0; i < TASK_TABLE_SIZE; i++)
317 OSTbl[i] = rhs.OSTbl[i];
322 void set(
int set_num)
volatile;
323 void clr(
int clr_num)
volatile;
326 uint32_t gethigh()
volatile;
327 uint32_t get_high_and_clear()
volatile;
329 inline bool isSet(
int num)
volatile const {
return (OSTbl[num / 32] & (0x80000000 >> (num % 32))); }
337 task_bit_list tasks_waiting;
344 bool Wait_when(uint8_t StatReason, TickTimeout &timeout);
346 inline bool Wait(uint8_t StatReason, uint32_t to_count)
348 TickTimeout to_when(to_count);
349 return Wait_when(StatReason, to_when);
353 void MakeHighTaskWaitingReady(uint8_t StatReason);
354 void MakeTaskWaitingReady(uint8_t taskPrio, uint8_t StatReason);
355 void MakeAllWaitingReady(uint8_t StatReason);
357} __attribute__((packed));
361class OS_TCB :
public cpu_tcb
369 RawTickTimeout_t OSTCBDly_when;
371 const char *pOSTCBName;
375#ifdef NBRTOS_PRIO_PROMOTION
378 volatile OS_TCB *pPromotedTo;
379 volatile OS_TCB *pDisplacedBy;
380 OS_TASK_DLY_OBJ *pWaiting;
381 uint32_t displacedByOrigPrio;
383 void PromoteToCurPrio()
volatile;
384 void Demote()
volatile;
387 static volatile OS_TCB *GetCur();
390 unsigned long switchTimeTick;
391 unsigned long switchTimeFraction;
392 unsigned long runningTime;
393 unsigned long runningTimeFraction;
399 bool Init(uint8_t prio,
void *pActualTop,
void *pstk,
long *pbot,
const char *name);
410struct OS_SEM :
public OS_TASK_DLY_OBJ
412 volatile uint32_t OSSemCnt;
413 volatile uint32_t OSSemUsed;
426 inline OS_SEM(int32_t cnt = 0) : OS_TASK_DLY_OBJ() { Init(cnt); }
437 uint8_t Init(int32_t cnt = 0);
459 inline uint8_t Pend(uint32_t timeoutTicks = WAIT_FOREVER){TickTimeout tt(timeoutTicks);
return Pend(tt);};
470 inline uint8_t PendUntil(uint32_t timeout_time){TickTimeout tt(0); tt.SetUntil(timeout_time);
return Pend(tt);};
481 uint8_t Pend(TickTimeout &t);
492 uint8_t PendNoWait();
503 inline uint32_t Avail() { uint32_t v; USER_ENTER_CRITICAL(); v=OSSemCnt-OSSemUsed; USER_EXIT_CRITICAL();
return v;};
505} __attribute__((packed));
521struct OS_MBOX :
public OS_TASK_DLY_OBJ
524 bool OSMboxDataAvail;
526 bool Claim(
void *&Result);
534 inline OS_MBOX() : OS_TASK_DLY_OBJ() { Init(); }
543 inline OS_MBOX(
void *msg) : OS_TASK_DLY_OBJ() { Init(msg); }
554 uint8_t Init(
void *msg = NULL);
566 uint8_t Post(
void *msg);
580 inline void *Pend(uint32_t timeoutTicks, uint8_t &result){TickTimeout tt(timeoutTicks);
return Pend(tt,result);};
594 void *Pend(TickTimeout &t, uint8_t &result);
606 inline void *Pend(uint32_t timeoutTicks = WAIT_FOREVER)
609 return Pend(timeoutTicks, unused);
624 inline void *PendUntil(uint32_t timeoutTime, uint8_t &result){TickTimeout tt(0); tt.SetUntil(timeoutTime);
return Pend(tt,result);};
637 void *PendNoWait(uint8_t &result);
647 inline void *PendNoWait()
650 return PendNoWait(unused);
662 TEMPL_MBOX(
const T *msg) : m_mbox((void *)msg) {}
663 inline uint8_t Init(
const T *msg) {
return m_mbox.Init((
void *)msg); }
664 inline uint8_t Post(
const T *msg) {
return m_mbox.Post((
void *)msg); }
666 inline T *Pend(uint32_t timeoutTicks, uint8_t &result) {
return static_cast<T *
>(m_mbox.Pend(timeoutTicks, result)); };
668 inline T *PendNoWait(uint8_t &result) {
return static_cast<T *
>(m_mbox.PendNoWait(result)); };
670 inline T *Pend(uint32_t timeoutTicks = WAIT_FOREVER) {
return static_cast<T *
>(m_mbox.Pend(timeoutTicks)); };
672 inline T *PendNoWait() {
return static_cast<T *
>(m_mbox.PendNoWait()); };
696struct OS_Q :
public OS_TASK_DLY_OBJ
705 bool Claim(
void *&Result);
723 inline OS_Q(
void **pQueueStorage, uint8_t size) : OS_TASK_DLY_OBJ() { Init(pQueueStorage, size); }
733 uint8_t Init(
void **pQueueStorage, uint8_t size);
745 uint8_t Post(
void *pItem);
757 uint8_t PostFirst(
void *pItem);
771 uint8_t PostUnique(
void *pItem);
785 uint8_t PostUniqueFirst(
void *msg);
799 inline void *Pend(uint32_t timeoutTicks, uint8_t &result){TickTimeout tt(timeoutTicks);
return Pend(tt,result);};
813 void *Pend(TickTimeout &t, uint8_t &result);
825 inline void *Pend(uint32_t timeoutTicks = WAIT_FOREVER)
828 return Pend(timeoutTicks, unused);
843 inline void *PendUntil(uint32_t timeoutTime, uint8_t &result){TickTimeout tt(0); tt.SetUntil(timeoutTime);
return Pend(tt,result);};
856 void *PendNoWait(uint8_t &result);
866 inline void *PendNoWait()
869 return PendNoWait(unused);
885 TEMPL_Q(T **pQueueStorage, uint8_t size)
886 : m_q((void**)pQueueStorage,size) { }
887 uint8_t Init(T **pQueueStorage, uint8_t size) {
return m_q.Init((
void **)pQueueStorage, size); }
888 uint8_t Post(T *item) {
return m_q.Post((
void *)item); }
889 uint8_t PostFirst(T *item) {
return m_q.PostFirst((
void *)item); };
890 uint8_t PostUnique(T *item) {
return m_q.PostUnique((
void *)item); };
891 uint8_t PostUniqueFirst(T *item) {
return m_q.PostUniqueFirst((
void *)item); };
893 inline T *Pend(uint32_t timeoutTicks, uint8_t &result) {
return static_cast<T *
>(m_q.Pend(timeoutTicks, result)); };
895 inline T *Pend(uint32_t timeoutTicks = WAIT_FOREVER) {
return static_cast<T *
>(m_q.Pend(timeoutTicks)); };
897 inline T *PendNoWait() {
return static_cast<T *
>(m_q.PendNoWait()); };
899 inline T *PendNoWait(uint8_t &result) {
return static_cast<T *
>(m_q.PendNoWait(result)); };
908typedef struct os_fifo_el
917 struct os_fifo_el *pNextFifo_El;
931struct OS_FIFO :
public OS_TASK_DLY_OBJ
936 bool Claim(
volatile OS_FIFO_EL *&pToRet);
944 inline OS_FIFO() : OS_TASK_DLY_OBJ() { Init(); }
966 uint8_t Post(OS_FIFO_EL *pToPost);
979 uint8_t PostFirst(OS_FIFO_EL *pToPost);
993 inline OS_FIFO_EL *Pend(uint32_t timeoutTicks, uint8_t &result){TickTimeout tt(timeoutTicks);
return Pend(tt,result);};
1007 OS_FIFO_EL *Pend(TickTimeout &t, uint8_t &result);
1019 inline OS_FIFO_EL *Pend(uint32_t timeoutTicks = WAIT_FOREVER)
1022 return Pend(timeoutTicks, unused);
1037 inline OS_FIFO_EL *PendUntil(uint32_t timeoutTime, uint8_t &result){TickTimeout tt(0); tt.SetUntil(timeoutTime);
return Pend(tt,result);};
1050 OS_FIFO_EL *PendNoWait(uint8_t &result);
1061 inline OS_FIFO_EL *PendNoWait()
1064 return PendNoWait(unused);
1077 TEMPL_FIFO() { m_fifo.Init(); }
1078 uint8_t Init() {
return m_fifo.Init(); }
1079 uint8_t Post(T *item) {
return m_fifo.Post((OS_FIFO_EL *)item); }
1080 uint8_t PostFirst(T *item) {
return m_fifo.PostFirst((OS_FIFO_EL *)item); };
1082 inline T *Pend(uint32_t timeoutTicks, uint8_t &result) {
return static_cast<T *
>(m_fifo.Pend(timeoutTicks, result)); };
1084 inline T *Pend(uint32_t timeoutTicks = WAIT_FOREVER) {
return static_cast<T *
>(m_fifo.Pend(timeoutTicks)); };
1086 inline T *PendNoWait() {
return static_cast<T *
>(m_fifo.PendNoWait()); };
1088 inline T *PendNoWait(uint8_t &result) {
return static_cast<T *
>(m_fifo.PendNoWait(result)); };
1090 inline OS_FIFO *GetRawFIFO() {
return &m_fifo; }
1100class BufferCriticalLock;
1109struct OS_CRIT :
public OS_TASK_DLY_OBJ
1111 OS_TCB *OSCritOwnerTCB;
1112 uint32_t OSCritDepthCount;
1115 OS_TCB *GetOwner() {
return (OS_TCB*)(((uint32_t)OSCritOwnerTCB)&~0x1ul); }
1116 void SetOwner(OS_TCB *newOwner)
1119 (OS_TCB*) (((uint32_t)newOwner) | (((uint32_t)OSCritOwnerTCB)&0x1));
1128 OS_CRIT() { Init(); }
1154 uint8_t LockAndEnter(uint32_t timeoutTicks = WAIT_FOREVER);
1170 uint8_t Enter(TickTimeout &t);
1186 inline uint8_t Enter(uint32_t timeoutTicks = WAIT_FOREVER) {TickTimeout tt(timeoutTicks);
return Enter(tt);};
1199 uint8_t EnterNoWait();
1224 uint8_t LeaveAndUnlock();
1226 friend class BufferCriticalLock;
1228 friend class OS_RRCB;
1235 bool UsedFromISR() {
return (((uint32_t)OSCritOwnerTCB)&0x1ul); }
1244 void SetUseFromISR(
bool enableFromISR)
1248 OSCritOwnerTCB = (OS_TCB*)(((uint32_t)OSCritOwnerTCB)|0x1ul);
1252 OSCritOwnerTCB = (OS_TCB*)(((uint32_t)OSCritOwnerTCB)&~0x1ul);
1259 bool OwnedByCurTask();
1266 uint32_t CurDepth() {
return OSCritDepthCount; }
1272} __attribute__((packed));
1276struct OS_FLAGS_WAIT;
1291 vuint32_t m_current_flags;
1292 void *m_pWaitinglist;
1294 void AddOFW(OS_FLAGS_WAIT *ofw);
1295 void RemoveOFW(OS_FLAGS_WAIT *ofw);
1319 void Set(uint32_t bits_to_set);
1328 void Clear(uint32_t bits_to_clr);
1338 void Write(uint32_t bits_to_force);
1363 uint8_t PendAny(uint32_t bit_mask, uint16_t timeout = WAIT_FOREVER){TickTimeout tt(timeout);
return PendAny(bit_mask,tt);}
1379 uint8_t PendAny(uint32_t bit_mask, TickTimeout & timeout);
1393 uint8_t PendAnyUntil(uint32_t bit_mask, uint32_t end_time){TickTimeout tt(0); tt.SetUntil(end_time);
return PendAny(bit_mask,tt);}
1405 uint8_t PendAnyNoWait(uint32_t bit_mask);
1420 uint8_t PendAll(uint32_t bit_mask, uint16_t timeout = WAIT_FOREVER){TickTimeout tt(timeout);
return PendAll(bit_mask,tt);}
1435 uint8_t PendAll(uint32_t bit_mask,TickTimeout & timeout);
1448 uint8_t PendAllUntil(uint32_t bit_mask, uint32_t end_time){TickTimeout tt(0); tt.SetUntil(end_time);
return PendAll(bit_mask,tt);}
1461 uint8_t PendAllNoWait(uint32_t bit_mask);
1469[[deprecated]]
inline void OSFlagCreate(OS_FLAGS *pf)
1484[[deprecated]]
inline void OSFlagSet(OS_FLAGS *flags, uint32_t bits_to_set)
1486 flags->Set(bits_to_set);
1499[[deprecated]]
inline void OSFlagClear(OS_FLAGS *flags, uint32_t bits_to_clr)
1501 flags->Clear(bits_to_clr);
1518[[deprecated]]
inline uint8_t OSFlagPendAny(OS_FLAGS *flags, uint32_t bit_mask, uint16_t timeout)
1520 return flags->PendAny(bit_mask, timeout);
1536[[deprecated]]
inline uint8_t OSFlagPendAnyNoWait(OS_FLAGS *flags, uint32_t bit_mask)
1538 return flags->PendAnyNoWait(bit_mask);
1555[[deprecated]]
inline uint8_t OSFlagPendAll(OS_FLAGS *flags, uint32_t bit_mask, uint16_t timeout)
1557 return flags->PendAll(bit_mask, timeout);
1573[[deprecated]]
inline uint8_t OSFlagPendAllNoWait(OS_FLAGS *flags, uint32_t bit_mask)
1575 return flags->PendAllNoWait(bit_mask);
1589[[deprecated]]
inline uint32_t OSFlagState(OS_FLAGS *flags)
1591 return flags->State();
1603extern volatile task_bit_list OSTaskReadyList;
1604#ifdef NBRTOS_PRIO_PROMOTION
1605extern volatile task_bit_list OSInUsePrioList FAST_SYS_VAR;
1606extern volatile task_bit_list OSActivePrioList FAST_SYS_VAR;
1611extern OS_TCB *pOSActiveTCBList;
1614extern volatile uint32_t nPrioOfCurTask;
1615extern volatile uint32_t nPrioOfHighReady;
1616extern volatile OS_TCB *OSTCBCur;
1617extern volatile OS_TCB *OSTCBHighRdy;
1619extern OS_TCB *pOSTCBFreeList;
1621extern volatile uint32_t OSIntNesting;
1622extern volatile uint32_t OSLockNesting;
1623extern volatile uint32_t OSISRLevel32;
1625extern volatile bool OSRunning;
1628extern unsigned long OSTcbStructSize;
1630#ifdef NBRTOS_TASK_LOG
1631extern void (*pTaskLogger)(uint8_t nextPrio);
1643void OSInit(uint8_t maxtasks);
1645void OSCreateIdleTask();
1719uint8_t OSTaskCreatewName(
void (*task)(
void *dptr),
1725 OS_TCB **pRetHandle = NULL
1767#define OSSimpleTaskCreatewName(x, p, n) \
1769 static uint32_t func_##x##_Stk[USER_TASK_STK_SIZE] __attribute__((aligned(4))); \
1770 return OSTaskCreatewName(x, NULL, (void *)&func_##x##_Stk[USER_TASK_STK_SIZE], (void *)func_##x##_Stk, p, n); \
1789#define OSSimpleTaskCreatewNameSRAM(x, p, n) \
1791 static uint32_t func_##x##_Stk[USER_TASK_STK_SIZE] __attribute__((aligned(4))) FAST_USER_STK; \
1792 return OSTaskCreatewName(x, NULL, (void *)&func_##x##_Stk[USER_TASK_STK_SIZE], (void *)func_##x##_Stk, p, n); \
1797#define LambdaTask2(p,n,f,vn) static uint32_t func_##vn_Stk[USER_TASK_STK_SIZE] __attribute__((aligned(4)));OSTaskCreatewName(f, NULL, (void *)&func_##vn_Stk[USER_TASK_STK_SIZE], (void *)func_##vn_Stk, p, n)
1814#define OSSimpleTaskCreateLambda(p,n,f) LambdaTask2(p,n,[]( void * pv)f,__COUNTER__)
1836void OSTimeWaitUntil(uint32_t systemTickValue);
1850inline void OSTimeDly(uint32_t to_count)
1852 uint32_t to_when = to_count + TimeTick;
1853 if (!to_when) to_when++;
1854 OSTimeWaitUntil(to_when);
1861 void OSIntExit(
void);
1863 void OSTickISR(
void);
1864 void OSStartHighRdy(
void);
1865 void OSSetupVBR(
void);
1867 void OSTimeTick(
void);
1879 void OSTaskDelete(
void);
1882OS_TCB *OSTCBGetFree(
void);
1902uint8_t OSChangePrio(uint32_t newp);
1910void OSSetName(
const char *cp);
1950[[deprecated]]
inline uint8_t OSSemInit(OS_SEM *psem,
long value)
1952 return (psem !=
nullptr) ? psem->Init(value) : OS_CRIT_ERR;
1968[[deprecated]]
inline uint8_t OSSemPost(OS_SEM *psem)
1970 return psem->Post();
1987[[deprecated]]
inline uint8_t OSSemPend(OS_SEM *psem, uint16_t timeout)
1989 return psem->Pend(timeout);
2004[[deprecated]]
inline uint8_t OSSemPendNoWait(OS_SEM *psem)
2006 return psem->PendNoWait();
2022[[deprecated]]
inline uint8_t OSMboxInit(OS_MBOX *pmbox,
void *msg)
2024 return (pmbox !=
nullptr) ? pmbox->Init(msg) : OS_CRIT_ERR;
2040[[deprecated]]
inline uint8_t OSMboxPost(OS_MBOX *pmbox,
void *msg)
2042 return pmbox->Post(msg);
2056[[deprecated]]
inline void *OSMboxPend(OS_MBOX *pmbox, uint16_t timeout, uint8_t *err)
2058 return pmbox->Pend(timeout, *err);
2071[[deprecated]]
inline void *OSMboxPendNoWait(OS_MBOX *pmbox, uint8_t *err)
2073 return pmbox->PendNoWait(*err);
2090[[deprecated]]
inline uint8_t OSQInit(OS_Q *pq,
void **start, uint8_t size)
2092 return (pq !=
nullptr) ? pq->Init(start, size) : OS_CRIT_ERR;
2108[[deprecated]]
inline uint8_t OSQPost(OS_Q *pq,
void *msg)
2110 return pq->Post(msg);
2126[[deprecated]]
inline uint8_t OSQPostFirst(OS_Q *pq,
void *msg)
2128 return pq->PostFirst(msg);
2146[[deprecated]]
inline uint8_t OSQPostUnique(OS_Q *pq,
void *msg)
2148 return pq->PostUnique(msg);
2166[[deprecated]]
inline uint8_t OSQPostUniqueFirst(OS_Q *pq,
void *msg)
2168 return pq->PostUniqueFirst(msg);
2182[[deprecated]]
inline void *OSQPend(OS_Q *pq, uint16_t timeout, uint8_t *err)
2184 return pq->Pend(timeout, *err);
2197[[deprecated]]
inline void *OSQPendNoWait(OS_Q *pq, uint8_t *err)
2199 return pq->PendNoWait(*err);
2214[[deprecated]]
inline uint8_t OSFifoInit(OS_FIFO *pFifo)
2216 return (pFifo !=
nullptr) ? pFifo->Init() : OS_CRIT_ERR;
2231[[deprecated]]
inline uint8_t OSFifoPost(OS_FIFO *pFifo, OS_FIFO_EL *pToPost)
2233 return pFifo->Post(pToPost);
2247[[deprecated]]
inline uint8_t OSFifoPostFirst(OS_FIFO *pFifo, OS_FIFO_EL *pToPost)
2249 return pFifo->PostFirst(pToPost);
2262[[deprecated]]
inline OS_FIFO_EL *OSFifoPend(OS_FIFO *pFifo, uint16_t timeout)
2264 return pFifo->Pend(timeout);
2276[[deprecated]]
inline OS_FIFO_EL *OSFifoPendNoWait(OS_FIFO *pFifo)
2278 return pFifo->PendNoWait();
2293[[deprecated]]
inline uint8_t OSCritInit(OS_CRIT *pCrit)
2295 return pCrit->Init();
2297[[deprecated]]
inline uint8_t OSCritLockAndEnter(OS_CRIT *pCrit, uint16_t timeout)
2299 return pCrit->LockAndEnter(timeout);
2315[[deprecated]]
inline uint8_t OSCritEnter(OS_CRIT *pCrit, uint16_t timeout)
2317 return pCrit->Enter(timeout);
2332[[deprecated]]
inline uint8_t OSCritEnterNoWait(OS_CRIT *pCrit)
2334 return pCrit->EnterNoWait();
2349[[deprecated]]
inline uint8_t OSCritLeave(OS_CRIT *pCrit)
2351 return pCrit->Leave();
2353[[deprecated]]
inline uint8_t OSCritLeaveAndUnlock(OS_CRIT *pCrit)
2355 return pCrit->LeaveAndUnlock();
2363uint8_t OSTaskID(
void);
2369enum class OSNextPrio {
2385int OSGetNextPrio(OSNextPrio where=OSNextPrio::Below,
int startingPrio = -1);
2390const char *OSTaskName();
2392void OSChangeTaskWhen(uint16_t task_prio, uint32_t to_when);
2404inline void OSChangeTaskDly(uint16_t task_prio, uint32_t to_count)
2406 uint32_t to_when = to_count + TimeTick;
2407 if (!to_when) to_when++;
2408 OSChangeTaskWhen(task_prio, to_when);
2419OS_TCB * OSGetTaskBlock(uint16_t task_prio);
2432uint8_t OSTaskJoin(OS_TCB *pTask, uint32_t timeoutDly = 0);
2437void OSDumpStack(
void);
2439#if (defined NBRTOS_STACKOVERFLOW) || (defined NBRTOS_STACKUNDERFLOW)
2440void EnableOSStackProtector();
2441extern "C" void OSStackProtectCtxSw();
2442extern "C" void OSStackProtectIntCtxSw();
2443extern "C" void OSStackProtector();
2446#ifdef NBRTOS_STACKCHECK
2455void OSDumpTCBStacks(
void);
2465void OSDumpTasks(
void);
2475void OSStartTaskDumper(uint8_t prio, uint32_t reportInterval);
2478#ifdef NBRTOS_TASKLIST
2484void ShowTaskList(
void);
2488uint32_t GetCurrentTaskTime(uint32_t *
const TotalTicks);
2489void ShowTaskTimes(
void);
2490void ClearTaskTimes(
void);
2510 OSLockObj() { OSLock(); };
2515 ~OSLockObj() { OSUnlock(); };
2516} __attribute__((packed));
2527class OSCriticalSectionObj
2538 OSCriticalSectionObj(OS_CRIT &ocrit)
2552 OSCriticalSectionObj(OS_CRIT &ocrit,
bool NoWait, TickTimeout &timeout)
2556 ocrit.EnterNoWait();
2558 ocrit.Enter(timeout);
2565 ~OSCriticalSectionObj() { pcrit->Leave(); }
2566} __attribute__((packed));
2578class OSLockAndCritObj
2589 OSLockAndCritObj(OS_CRIT &ocrit) : pcrit(&ocrit) { pcrit->LockAndEnter(0); }
2595 ~OSLockAndCritObj() { pcrit->LeaveAndUnlock(); }
2620 OSSpinCrit(OS_CRIT &ocrit) : pcrit(&ocrit)
2622 while (pcrit->EnterNoWait() == OS_TIMEOUT) {}
2629 ~OSSpinCrit() { pcrit->Leave(); }
2639 USERCritObj() { USER_ENTER_CRITICAL(); }
2640 ~USERCritObj() { USER_EXIT_CRITICAL(); }
2651inline bool OS_CRIT::OwnedByCurTask()
2653 return OSCritOwnerTCB == OSTCBCur;
2669 static NBRtosInitObj * pHead;
2670 static bool bAlreadInited;
2671 NBRtosInitObj *pNext;
2674 inline bool WasInitDone() {
return bAlreadInited; }
2682 virtual void Notify()=0;
2683 static void InitWholeSet();
FIFO buffer storage using linked pool buffers.
Definition buffers.h:443
#define OS_MAX_TASKS
Max number of system tasks.
Definition constants.h:97
#define OS_MAX_PRIOS
Maximum number of system priorities (NBRTOS limit: 256)
Definition constants.h:101
void ForceReboot(bool fromIRQ=false)
Initiates an immediate hardware-level system reset of the NetBurner device.