78 CINOSTask(
char* apName=
nullptr, uint32 auStackSize=defDefaultStackSize,
80 uint32 auTimeSlice=defDefaultTimeSlice,
bool abInterruptsDisabled=
false,
81 void* apHandler=0,
void* apObject=0);
89 CINOSTask(std::function<
void(
void*)> aFunction,
void* apParam =
nullptr,
99 CINOSTask(
const char* apName, std::function<
void(
void*)> aFunction,
130 virtual void Exit(uint32 auExitCode);
136 { m_uExitCode = auExitCode; };
141 {
return m_uExitCode; };
147 {
return (m_uTskFlags & eTskFlgShutdownRequest); };
154 #if defined(INOS_DESKTOP)
155 m_pSuspendHook = apSuspendHook;
158 m_pSuspendHook = (
void*) ((uintnbr)apSuspendHook | 3);
160 m_pSuspendHook =
nullptr;
168 m_pSuspendHook =
nullptr;
175 return m_pSuspendHook;
182 eTskTypeResource = 1,
184 eTskTypeApplication = 3,
185 eTskTypeCommunication = 4,
186 eTskTypeRealtime = 5,
187 eTskTypeInterrupt = 6,
188 eTskTypeBackground = 7,
191 eTskTypeReserved0 = 10,
192 eTskTypeReserved1 = 11,
223#if defined(INOS_TIMINIG_CHECKS_SUSPEND)
225 virtual void OnResume(uint32 auLastState, uint32 auElapsedUs,
void* apSync);
237 friend class CINOSExceptionContext;
238 friend class CINOSExceptionCleanup;
239 friend class CINOSRegisterLoadDevice;
240 friend class CINOSWatchPoint;
241 friend class CINCODataLogger;
242 friend class CINCODataLoggerReader;
243 friend class CINFOLink;
244 friend class CINOSTaskQueue;
248 friend class CINOSMcLua;
249 friend class CINOSMcMessage;
250 friend class CINOSMcCoord;
251 friend class CINOSConcurrencyCheck;
252 friend class CINOSOpcUaIncoItemProcedureAdapter;
253 friend class CINCOEvtLoggerGet;
254 friend class CINCOObject;
255 friend class CINCOProcedure;
257 friend class CINOSTestpoint;
258 friend class CINCOVThreadImpl;
259 friend class CINCOVParseProcedure;
261 friend class CINOSMcTargetINCOFrameHandler;
263 friend class CINOSHwTarget;
264 friend class CINOSHwDevice;
265 friend class CINOSHwEthernet;
269 friend class CINOSHwDbg_P50XX;
270 friend class CINOSHwDbg_P2020;
271 friend class CINOSHwDbg_ppc750;
272 friend class CINOSHwDbg_CortexA9;
273 friend class CINOSHwDbg_ARMv8;
275 friend class CINOSHwIrq_P50XX;
276 friend class CINOSHwIrq_p2020;
277 friend class CINOSHwIrq_ppc750;
278 friend class CINOSHwIrq_CortexA9;
279 friend class CINOSHwIrq_GIC;
280 friend class CINOSHwIrq_GICv2;
281 friend class CINOSHwIrq_GICv3;
283 friend class CINOSHwCpu_p50XX;
284 friend class CINOSHwCpu_p2020;
285 friend class CINOSHwCpu_ppc750;
286 friend class CINOSHwCpu_CortexA9;
287 friend class CINOSHwCpu_ARMv8;
289 friend class CINOSHwTrp_P50XX;
290 friend class CINOSHwTrp_P2020;
291 friend class CINOSHwTrp_ppc750;
292 friend class CINOSHwTrp_CortexA9;
293 friend class CINOSHwTrp_ARMv8;
296 friend class CINOSKernel_ARM;
297 friend class CINOSKernel_P50XX;
298 friend class CINOSKernel_P2020;
299 friend class CINOSKernel_PPC750;
300 friend class CINOSKernel_CortexA9;
301 friend class CINOSKernel_ARMv8;
303 friend void Ready(
CINOSTask* apTask, uint32 auFlags);
305 #if defined (INOS_DESKTOP)
306 #if defined (INOS_WINDOWS)
307 friend long _Sleep(
long aTime);
309 friend long Sleep(
long aTime);
312 friend void _suspend(uint32 auState);
313 friend void _suspend(uint32 auState, uint32 auFlags);
315 friend void _resume(
CINOSTask* apTask, uint32 auFlags);
316 friend void _preemption();
317 friend void _schedule();
318 friend void _changepriority(uint32 auPriority);
319 friend void _relinquish();
321 friend uint32 INOSDisableExceptions();
322 friend void INOSEnableExceptions(uint32 auState);
323 friend bool _CINOSExceptionContext__Save();
324 friend void SlaveVariable(
class CINCOFrame* aFrame);
327 friend class CTaskExTestImpl;
328 friend class CINOSTaskExMsgTest;
329 friend class CINOSStackCorruptionTest;
333 #if defined(INOS_TESTING)
344 void* m_pSuspendHook =
nullptr;
354 uint8 mSavedPriority;
355 uint16 mUsecTimeSlice;
356 uint16 mPreemptionCnt;
357 uint32 mBclkTimeSlice;
362 eTskFlgFloatingpoint = 0x00000001,
363 eTskFlgIrqDisabled = 0x00000002,
364 eTskFlgTimeslice = 0x00000004,
365 eTskFlgTimingFailureHaltTask = 0x00000008,
366 eTskFlgDebugTimingDisableIrq = 0x00000010,
367 eTskFlgStartupDone = 0x00000020,
368 eTskFlgShutdownRequest = 0x00000040,
369 eTskFlgFunctionValid = 0x00000080,
370 eTskFlgShutdownPending = 0x00000100,
371 eTskFlgStackProtection = 0x00000200,
372 eTskFlgPriorityCheck = 0x00000400,
373 eTskFlgSuspendTimingCheck = 0x00000800,
374 eTskFlgSuspendHookRunning = 0x00001000,
375 eTskFlgIncoTouch = 0x00002000,
381 uint32 m_uTskNxtId = 0;
383 uint32 m_uTskPrvId = 0;
385 uint32 m_uTskParentId = 0;
387 volatile uint32 m_uTskLastChildId = 0;
404 uint32 mExceptionState;
405 class CINOSException* pExceptionPending;
406 class CINOSExceptionContext* pExceptionContext;
411 char* pNameSave =
nullptr;
412 uint32 mTaskIdentification;
413 _reent* m_pReentrancy;
425 uint64 mResumeTimeNs;
426 uint32 mMinResponseTime;
427 uint32 mMaxResponseTime;
428 uint32 mActResponseTime;
429 uint32 mSinglestepInstruction;
434 static uint32 m_uDebugUpdateId;
449 uint64 m_uBusTickAtIrq;
454 void PrepareStack(
bool aInterruptsDisabled,
void* apHandler,
void* apObject);
464 enum ETaskErrorFlags {
469 eFlagCalledByINCO = 0x100,
470 eFlagUseINCO4AsyncResultMgr = 0x200,
471#if defined(INCO_RETRY_AWARE_GETVARIABLE)
472 eFlagINCODenyRetries = 0x400
475 virtual void MsgReply(
480 # if defined(INCO_DEPRECATED_CALLPROCEDURE_ERRORS)
488 void SetError(uint32 aError)
489 { mError=(uint16)aError;}
492 {
return mTaskIdentification;}
493 void SetId(uint32 aId)
494 { mTaskIdentification=aId;}
498 {
return m_uTskParentId; }
499 uint32 GetState ()
const
501 void SetState(uint16 aState)
508 void SetPriority(uint32 auPriority);
510 uint32 GetTrapNumber()
511 {
return mTrapNumber;}
512 void SetTrapNumber(uint32 aNumber)
513 { mTrapNumber = (uint16)aNumber;}
514 uint32 GetCycleTicks()
515 {
return mCycleTicks&0x00ffffff;}
516 uint32 SetCycleTicks(uint32 auCycleTicks)
517 {
return mCycleTicks = auCycleTicks;}
518 uint8 GetOversampling()
519 {
return (uint8) ((mCycleTicks>>24)&0xff);}
520 void SetOversampling(uint8 auOversampling)
521 { mCycleTicks = (mCycleTicks&0x00ffffff)|(auOversampling<<24);}
522 uint32 GetResumeTicks()
523 {
return mResumeTime;}
524 uint64 GetResumeTimeNs()
525 {
return mResumeTimeNs;}
526 void SetResumeTimeNs(uint64 auResumeTimeNs)
527 { mResumeTimeNs = auResumeTimeNs;}
529 {
return m_uActivity;}
532 uint64 GetTbTask()
const
534 uint32 uMsr = INOSDisableInterrupts();
535 uint64 uValue = m_uTbTask;
536 INOSEnableInterrupts(uMsr);
542 uint64 GetTbTaskReal()
const
544 uint64 uCurrentTicks = GetSystemTicks();
546 uint32 uMsr = INOSDisableInterrupts();
547 uint64 uTskTicks = pTask->m_uTbTask;
548 uint64 uTskRestore = pTask->m_uTbRestore;
549 INOSEnableInterrupts(uMsr);
550 if (uCurrentTicks > uTskRestore) uTskTicks += (uCurrentTicks-uTskRestore);
555 uint64 GetTbRestore()
const
557 uint32 uMsr = INOSDisableInterrupts();
558 uint64 uValue = m_uTbRestore;
559 INOSEnableInterrupts(uMsr);
562 uint16 GetClassSize()
563 {
return mClassSize;}
564 _reent* GetReentrancy()
566 m_uReentrancyTouched++;
567 return m_pReentrancy;
569 uint32 GetReentrancyTouched()
571 return m_uReentrancyTouched;
574 char* GetName()
const
576 CINCOObject* iGetRegister();
579 uint32 RangeStep(uint32 auFrom, uint32 auTo);
583 uint32 GetPC(uintnbr* aValue);
584 uint32 PutPC(uintnbr aValue);
585 uint32 GetLR(uintnbr* aValue);
586 uint32 GetSPR(uint32 aNumber, uint32* aValue);
587 uint32 PutSPR(uint32 aNumber, uint32 aValue);
588 uint32 GetSPRs(uint32* aResult);
589 uint32 GetSPRsGdb(uint32* aResult);
591 uint32 GetGPR(uint32 aNumber, uint32* aValue);
592 uint32 PutGPR(uint32 aNumber, uint32 aValue);
594 uint32 GetGPRs(uint32* aResult,
bool abNative=
false);
598 uint32 GetGdbRegsSize(uint32& auSize);
602 uint32 GetGdbRegs(
void* apData);
609 uint32 PutGdbReg(
const uint32 auRegister,
const void* apData, uint32 auDataLength);
611 uint32 GetFPR(uint32 aNumber,
double* aValue);
612 uint32 PutFPR(uint32 aNumber,
double aValue);
613 uint32 GetFPRs(
double* aResult);
615 uint32 GetEVHs(uint32* aResult);
616 uint32 GetSPE(uint32* aResult);
619 uint32 GetTaskData(uint32 aDataDef, uintnbr* aResult, uint32& aLength);
620 uint32 PutTaskData(uint32 aDataDef, uint32* aData, uint32 aLength);
622 bool DisableFloatingPoint();
623 bool EnableFloatingPoint();
627 uint16 EnableExceptions();
631 void RestoreExceptions(uint16 auLevel);
635 bool AreExceptionsEnabled();
639 bool IsAddressOnStack(uintptr auAddress)
const;
641 uint32 GetStackSize()
const;
646 uint32 GetStackSizeFree()
const;
648 #if !defined(INOS_DESKTOP)
650 uintnbr GetStackLeft()
const
653 #if defined(INOS_CPU_CORTEXA9)
654 asm volatile (
"mov %0,sp" :
"=r" (uSp));
655 #elif defined(INOS_CPU_ARMV8)
656 asm volatile (
"mov %0,sp" :
"=r" (uSp));
658 asm volatile (
"mr %0,1" :
"=r" (uSp));
660 return uSp - (uintnbr)pStackEnd;
668 static uint32 GetDebugUpdateId();
671 static void ChangeDebugUpdateId();
673#ifdef INOS_STACKPROTECTION
675 void UnprotectStack();
676 void StackProtectionEnable() {
677 m_uTskFlags |= eTskFlgStackProtection;
679 void StackProtectionDisable() {
680 m_uTskFlags &= ~eTskFlgStackProtection;
682 bool StackProtectionEnabled()
const {
683 return m_uTskFlags & eTskFlgStackProtection;
693 friend long Sleep(
long aTime);
699 void ThrowException(CINOSException* aException);
701 void ThrowExceptionToTask(CINOSException* aException);
703 void AcceptException();
705 void IgnoreException();
706 #ifdef INOS_EXCEPTION_MUTEX
711 inline void SetBusTicksAtIrq(uint64 auBusTicks) {
713 m_uBusTickAtIrq = auBusTicks;
721 const uint32* pSrc =
reinterpret_cast<const uint32*
>(&auBusTicks);
722 uint32* pDst =
reinterpret_cast<uint32*
>(&m_uBusTickAtIrq);
729 inline uint64 GetBusTicksAtIrq()
const {
730 return m_uBusTickAtIrq;
734 void*
operator new(
size_t aSize);
735 void operator delete(
void* aPtr);
740 void Create(
char* apName =
nullptr, uint32 auStackSize=defDefaultStackSize,
742 uint32 auTimeSlice=defDefaultTimeSlice,
bool abInterruptsDisabled=
false,
743 void* apHandler=0,
void* apObject=0);
745 void* AllocStack(uint32 auSize);
747 void ReAllocStack(uint32 auSize);
754 virtual void SetCallResult(CMcResult aResult);
756 virtual CMcResult GetCallResult();
761 struct STLSKeyData* TLSFindData(STLSKeyData* apKeyData)
const;
763 void TLSAddData(
struct STLSKeyData* apKeyData);
766 void TLSRemoveData(
struct STLSKeyData* apKeyData);
768 #ifdef INOS_MULTICORE_KERNEL
770 void SetCoreSync(
struct SINOSCoreSync* apCoreSync) { m_pCoreSync = apCoreSync; };
772 struct SINOSCoreSync* GetCoreSync() {
return m_pCoreSync; };
774 uint8 GetTaskCoreId()
const {
return m_uTaskCoreId; }
776 void SetTaskCoreId(uint8 auCoreId)
777 { m_uTaskCoreId = auCoreId; m_uTaskCoreIdRequested = auCoreId; };
781 void SetTaskCoreIdRequested(uint8 auCoreIdRequested)
782 { m_uTaskCoreIdRequested = auCoreIdRequested; };
784 uint8 GetTaskCoreIdRequested()
785 {
return m_uTaskCoreIdRequested; };
788 struct SINOSCoreSync* GetCoreSync() {
return nullptr; };
790 uint8 GetTaskCoreId()
const {
return 0; }
793 void SetTaskCategory(uint8 auCategory)
794 { m_uTaskCategory = auCategory; };
796 uint8 GetTaskCategory()
797 {
return m_uTaskCategory; };
801 void EnableTimingFailureHaltTask() {
802 m_uTskFlags |= eTskFlgTimingFailureHaltTask;
807 void DisableTimingFailureHaltTask() {
808 m_uTskFlags &= (~eTskFlgTimingFailureHaltTask);
812 bool IsTimingFailureHaltTaskEnabled() {
813 return (m_uTskFlags & eTskFlgTimingFailureHaltTask);
819 inline void EnableIrqDisableTiming() {
820 m_uTskFlags |= eTskFlgDebugTimingDisableIrq;
825 inline void DisableIrqDisableTiming() {
826 m_uTskFlags &= (~eTskFlgDebugTimingDisableIrq);
830 inline bool IsIrqDisableTimingEnabled() {
831 return (m_uTskFlags & eTskFlgDebugTimingDisableIrq);
836 inline void EnablePriorityChecking() {
837 m_uTskFlags |= eTskFlgPriorityCheck;
841 inline void DisablePriorityChecking() {
842 m_uTskFlags &= (~eTskFlgPriorityCheck);
846 inline bool IsPriorityCheckingEnabled() {
847 return (m_uTskFlags & eTskFlgPriorityCheck);
852 inline void EnableSuspendTimingCheck() {
853 m_uTskFlags |= eTskFlgSuspendTimingCheck;
857 inline void DisableSuspendTimingCheck() {
858 m_uTskFlags &= (~eTskFlgSuspendTimingCheck);
862 inline bool IsSuspendTimingCheckEnabled() {
863 return (m_uTskFlags & eTskFlgSuspendTimingCheck);
866 inline bool IsStartupDone() {
867 return (m_uTskFlags & eTskFlgStartupDone);
870 inline void EnableIncoTouch() {
871 m_uTskFlags |= eTskFlgIncoTouch;
874 inline void DisableIncoTouch() {
875 m_uTskFlags &= (~eTskFlgIncoTouch);
878 inline bool IsIncoTouchEnabled() {
879 return (m_uTskFlags & eTskFlgIncoTouch);
882 inline void EnableFloatingpoint() {
883 m_uTskFlags |= eTskFlgFloatingpoint;
886 inline void DisableFloatingpoint() {
887 m_uTskFlags &= (~eTskFlgFloatingpoint);
890 inline bool IsFloatingpointEnabled() {
891 return (m_uTskFlags & eTskFlgFloatingpoint);
894 void SetTskFlag(uint32 auFlag) {
895 m_uTskFlags |= auFlag;
901 inline uint32& GetIrqDisableTicks() {
902 return m_uIrqDisableTicks;
905 inline bool IsRealtime() {
906 return (m_eTskType == eTskTypeInterrupt) || ((m_eTskType == eTskTypeRealtime));
911 TINOSBalancedBinaryTree<STLSKeyData> m_TLS;
917 CMcResult* m_pCallResult{};
919 #ifdef INOS_MULTICORE_KERNEL
920 struct SINOSCoreSync* m_pCoreSync;
922 uint8 m_uTaskCoreId = GetCoreId();
927 uint8 m_uTaskCategory = 0xff;
929 #if defined(INOS_DESKTOP)
930 friend class CINOSKernel_desktop;
931 friend void _Suspend(uint32 auState, uint32 auFlags,
CINOSTask* apTask);
932 friend void Resume(
CINOSTask* apTask, uint32 auFlags);
933 friend void Relinquish();
934 friend void ChangePriority(uint32 auPriority);
935 std::thread* m_pThread =
nullptr;
936 std::condition_variable_any m_Startup;
937 std::condition_variable_any m_Resume;
950 uint32 m_uIrqDisableTicks = 0;
953 uint32 m_uExitCode = 0;
959 alignas(4) inosName128 m_cName = {0};
961 void* m_pFunctionParam =
nullptr;
963 std::function<void(
void*)> m_Function;
965 ETskType m_eTskType = eTskTypeSystem;
967 uint32 m_uReentrancyTouched{};
969 #if !defined(INOS_DESKTOP) && defined(INOS_THREADLOCAL)
971 uint8* m_pThreadLocal{};
972 uint8* m_pThreadLocalBase{};