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_CortexA72;
275 friend class CINOSHwIrq_P50XX;
276 friend class CINOSHwIrq_p2020;
277 friend class CINOSHwIrq_ppc750;
278 friend class CINOSHwIrq_CortexA9;
279 friend class CINOSHwIrq_CortexA72;
281 friend class CINOSHwCpu_p50XX;
282 friend class CINOSHwCpu_p2020;
283 friend class CINOSHwCpu_ppc750;
284 friend class CINOSHwCpu_CortexA9;
285 friend class CINOSHwCpu_CortexA72;
287 friend class CINOSHwTrp_P50XX;
288 friend class CINOSHwTrp_P2020;
289 friend class CINOSHwTrp_ppc750;
290 friend class CINOSHwTrp_CortexA9;
291 friend class CINOSHwTrp_CortexA72;
294 friend class CINOSKernel_ARM;
295 friend class CINOSKernel_P50XX;
296 friend class CINOSKernel_P2020;
297 friend class CINOSKernel_PPC750;
298 friend class CINOSKernel_CortexA9;
299 friend class CINOSKernel_CortexA72;
301 friend void Ready(
CINOSTask* apTask, uint32 auFlags);
303 #if defined (INOS_DESKTOP)
304 #if defined (INOS_WINDOWS)
305 friend long _Sleep(
long aTime);
307 friend long Sleep(
long aTime);
310 friend void _suspend(uint32 auState);
311 friend void _suspend(uint32 auState, uint32 auFlags);
313 friend void _resume(
CINOSTask* apTask, uint32 auFlags);
314 friend void _preemption();
315 friend void _schedule();
316 friend void _changepriority(uint32 auPriority);
317 friend void _relinquish();
319 friend uint32 INOSDisableExceptions();
320 friend void INOSEnableExceptions(uint32 auState);
321 friend bool _CINOSExceptionContext__Save();
322 friend void SlaveVariable(
class CINCOFrame* aFrame);
325 friend class CTaskExTestImpl;
326 friend class CINOSTaskExMsgTest;
327 friend class CINOSStackCorruptionTest;
331 #if defined(INOS_TESTING)
342 void* m_pSuspendHook =
nullptr;
352 uint8 mSavedPriority;
353 uint16 mUsecTimeSlice;
354 uint16 mPreemptionCnt;
355 uint32 mBclkTimeSlice;
360 eTskFlgFloatingpoint = 0x00000001,
361 eTskFlgIrqDisabled = 0x00000002,
362 eTskFlgTimeslice = 0x00000004,
363 eTskFlgTimingFailureHaltTask = 0x00000008,
364 eTskFlgDebugTimingDisableIrq = 0x00000010,
365 eTskFlgStartupDone = 0x00000020,
366 eTskFlgShutdownRequest = 0x00000040,
367 eTskFlgFunctionValid = 0x00000080,
368 eTskFlgShutdownPending = 0x00000100,
369 eTskFlgStackProtection = 0x00000200,
370 eTskFlgPriorityCheck = 0x00000400,
371 eTskFlgSuspendTimingCheck = 0x00000800,
372 eTskFlgSuspendHookRunning = 0x00001000,
373 eTskFlgIncoTouch = 0x00002000,
379 uint32 m_uTskNxtId = 0;
381 uint32 m_uTskPrvId = 0;
383 uint32 m_uTskParentId = 0;
385 volatile uint32 m_uTskLastChildId = 0;
402 uint32 mExceptionState;
403 class CINOSException* pExceptionPending;
404 class CINOSExceptionContext* pExceptionContext;
409 char* pNameSave =
nullptr;
410 uint32 mTaskIdentification;
411 _reent* m_pReentrancy;
423 uint64 mResumeTimeNs;
424 uint32 mMinResponseTime;
425 uint32 mMaxResponseTime;
426 uint32 mActResponseTime;
427 uint32 mSinglestepInstruction;
432 static uint32 m_uDebugUpdateId;
447 uint64 m_uBusTickAtIrq;
452 void PrepareStack(
bool aInterruptsDisabled,
void* apHandler,
void* apObject);
462 enum ETaskErrorFlags {
467 eFlagCalledByINCO = 0x100,
468 eFlagUseINCO4AsyncResultMgr = 0x200,
469#if defined(INCO_RETRY_AWARE_GETVARIABLE)
470 eFlagINCODenyRetries = 0x400
473 virtual void MsgReply(
478 # if defined(INCO_DEPRECATED_CALLPROCEDURE_ERRORS)
486 void SetError(uint32 aError)
487 { mError=(uint16)aError;}
490 {
return mTaskIdentification;}
491 void SetId(uint32 aId)
492 { mTaskIdentification=aId;}
496 {
return m_uTskParentId; }
497 uint32 GetState ()
const
499 void SetState(uint16 aState)
506 void SetPriority(uint32 auPriority);
508 uint32 GetTrapNumber()
509 {
return mTrapNumber;}
510 void SetTrapNumber(uint32 aNumber)
511 { mTrapNumber = (uint16)aNumber;}
512 uint32 GetCycleTicks()
513 {
return mCycleTicks&0x00ffffff;}
514 uint32 SetCycleTicks(uint32 auCycleTicks)
515 {
return mCycleTicks = auCycleTicks;}
516 uint8 GetOversampling()
517 {
return (uint8) ((mCycleTicks>>24)&0xff);}
518 void SetOversampling(uint8 auOversampling)
519 { mCycleTicks = (mCycleTicks&0x00ffffff)|(auOversampling<<24);}
520 uint32 GetResumeTicks()
521 {
return mResumeTime;}
522 uint64 GetResumeTimeNs()
523 {
return mResumeTimeNs;}
524 void SetResumeTimeNs(uint64 auResumeTimeNs)
525 { mResumeTimeNs = auResumeTimeNs;}
527 {
return m_uActivity;}
530 uint64 GetTbTask()
const
532 uint32 uMsr = INOSDisableInterrupts();
533 uint64 uValue = m_uTbTask;
534 INOSEnableInterrupts(uMsr);
540 uint64 GetTbTaskReal()
const
542 uint64 uCurrentTicks = GetSystemTicks();
544 uint32 uMsr = INOSDisableInterrupts();
545 uint64 uTskTicks = pTask->m_uTbTask;
546 uint64 uTskRestore = pTask->m_uTbRestore;
547 INOSEnableInterrupts(uMsr);
548 if (uCurrentTicks > uTskRestore) uTskTicks += (uCurrentTicks-uTskRestore);
553 uint64 GetTbRestore()
const
555 uint32 uMsr = INOSDisableInterrupts();
556 uint64 uValue = m_uTbRestore;
557 INOSEnableInterrupts(uMsr);
560 uint16 GetClassSize()
561 {
return mClassSize;}
562 _reent* GetReentrancy()
564 m_uReentrancyTouched++;
565 return m_pReentrancy;
567 uint32 GetReentrancyTouched()
569 return m_uReentrancyTouched;
572 char* GetName()
const
574 CINCOObject* iGetRegister();
577 uint32 RangeStep(uint32 auFrom, uint32 auTo);
581 uint32 GetPC(uintnbr* aValue);
582 uint32 PutPC(uintnbr aValue);
583 uint32 GetLR(uintnbr* aValue);
584 uint32 GetSPR(uint32 aNumber, uint32* aValue);
585 uint32 PutSPR(uint32 aNumber, uint32 aValue);
586 uint32 GetSPRs(uint32* aResult);
587 uint32 GetSPRsGdb(uint32* aResult);
589 uint32 GetGPR(uint32 aNumber, uint32* aValue);
590 uint32 PutGPR(uint32 aNumber, uint32 aValue);
592 uint32 GetGPRs(uint32* aResult,
bool abNative=
false);
596 uint32 GetGdbRegsSize(uint32& auSize);
600 uint32 GetGdbRegs(
void* apData);
607 uint32 PutGdbReg(
const uint32 auRegister,
const void* apData, uint32 auDataLength);
609 uint32 GetFPR(uint32 aNumber,
double* aValue);
610 uint32 PutFPR(uint32 aNumber,
double aValue);
611 uint32 GetFPRs(
double* aResult);
613 uint32 GetEVHs(uint32* aResult);
614 uint32 GetSPE(uint32* aResult);
617 uint32 GetTaskData(uint32 aDataDef, uintnbr* aResult, uint32& aLength);
618 uint32 PutTaskData(uint32 aDataDef, uint32* aData, uint32 aLength);
620 bool DisableFloatingPoint();
621 bool EnableFloatingPoint();
625 uint16 EnableExceptions();
629 void RestoreExceptions(uint16 auLevel);
633 bool AreExceptionsEnabled();
637 bool IsAddressOnStack(uintptr auAddress)
const;
639 uint32 GetStackSize()
const;
644 uint32 GetStackSizeFree()
const;
646 #if !defined(INOS_DESKTOP)
648 uintnbr GetStackLeft()
const
651 #if defined(INOS_CPU_CORTEXA9)
652 asm volatile (
"mov %0,sp" :
"=r" (uSp));
653 #elif defined(INOS_CPU_CORTEXA72)
654 asm volatile (
"mov %0,sp" :
"=r" (uSp));
656 asm volatile (
"mr %0,1" :
"=r" (uSp));
658 return uSp - (uintnbr)pStackEnd;
666 static uint32 GetDebugUpdateId();
669 static void ChangeDebugUpdateId();
671#ifdef INOS_STACKPROTECTION
673 void UnprotectStack();
674 void StackProtectionEnable() {
675 m_uTskFlags |= eTskFlgStackProtection;
677 void StackProtectionDisable() {
678 m_uTskFlags &= ~eTskFlgStackProtection;
680 bool StackProtectionEnabled()
const {
681 return m_uTskFlags & eTskFlgStackProtection;
691 friend long Sleep(
long aTime);
697 void ThrowException(CINOSException* aException);
699 void ThrowExceptionToTask(CINOSException* aException);
701 void AcceptException();
703 void IgnoreException();
704 #ifdef INOS_EXCEPTION_MUTEX
709 inline void SetBusTicksAtIrq(uint64 auBusTicks) {
711 m_uBusTickAtIrq = auBusTicks;
719 const uint32* pSrc =
reinterpret_cast<const uint32*
>(&auBusTicks);
720 uint32* pDst =
reinterpret_cast<uint32*
>(&m_uBusTickAtIrq);
727 inline uint64 GetBusTicksAtIrq()
const {
728 return m_uBusTickAtIrq;
732 void*
operator new(
size_t aSize);
733 void operator delete(
void* aPtr);
738 void Create(
char* apName =
nullptr, uint32 auStackSize=defDefaultStackSize,
740 uint32 auTimeSlice=defDefaultTimeSlice,
bool abInterruptsDisabled=
false,
741 void* apHandler=0,
void* apObject=0);
743 void* AllocStack(uint32 auSize);
745 void ReAllocStack(uint32 auSize);
752 virtual void SetCallResult(CMcResult aResult);
754 virtual CMcResult GetCallResult();
759 struct STLSKeyData* TLSFindData(STLSKeyData* apKeyData)
const;
761 void TLSAddData(
struct STLSKeyData* apKeyData);
764 void TLSRemoveData(
struct STLSKeyData* apKeyData);
766 #ifdef INOS_MULTICORE_KERNEL
768 void SetCoreSync(
struct SINOSCoreSync* apCoreSync) { m_pCoreSync = apCoreSync; };
770 struct SINOSCoreSync* GetCoreSync() {
return m_pCoreSync; };
772 uint8 GetTaskCoreId()
const {
return m_uTaskCoreId; }
774 void SetTaskCoreId(uint8 auCoreId)
775 { m_uTaskCoreId = auCoreId; m_uTaskCoreIdRequested = auCoreId; };
779 void SetTaskCoreIdRequested(uint8 auCoreIdRequested)
780 { m_uTaskCoreIdRequested = auCoreIdRequested; };
782 uint8 GetTaskCoreIdRequested()
783 {
return m_uTaskCoreIdRequested; };
786 struct SINOSCoreSync* GetCoreSync() {
return nullptr; };
788 uint8 GetTaskCoreId()
const {
return 0; }
791 void SetTaskCategory(uint8 auCategory)
792 { m_uTaskCategory = auCategory; };
794 uint8 GetTaskCategory()
795 {
return m_uTaskCategory; };
799 void EnableTimingFailureHaltTask() {
800 m_uTskFlags |= eTskFlgTimingFailureHaltTask;
805 void DisableTimingFailureHaltTask() {
806 m_uTskFlags &= (~eTskFlgTimingFailureHaltTask);
810 bool IsTimingFailureHaltTaskEnabled() {
811 return (m_uTskFlags & eTskFlgTimingFailureHaltTask);
817 inline void EnableIrqDisableTiming() {
818 m_uTskFlags |= eTskFlgDebugTimingDisableIrq;
823 inline void DisableIrqDisableTiming() {
824 m_uTskFlags &= (~eTskFlgDebugTimingDisableIrq);
828 inline bool IsIrqDisableTimingEnabled() {
829 return (m_uTskFlags & eTskFlgDebugTimingDisableIrq);
834 inline void EnablePriorityChecking() {
835 m_uTskFlags |= eTskFlgPriorityCheck;
839 inline void DisablePriorityChecking() {
840 m_uTskFlags &= (~eTskFlgPriorityCheck);
844 inline bool IsPriorityCheckingEnabled() {
845 return (m_uTskFlags & eTskFlgPriorityCheck);
850 inline void EnableSuspendTimingCheck() {
851 m_uTskFlags |= eTskFlgSuspendTimingCheck;
855 inline void DisableSuspendTimingCheck() {
856 m_uTskFlags &= (~eTskFlgSuspendTimingCheck);
860 inline bool IsSuspendTimingCheckEnabled() {
861 return (m_uTskFlags & eTskFlgSuspendTimingCheck);
864 inline bool IsStartupDone() {
865 return (m_uTskFlags & eTskFlgStartupDone);
868 inline void EnableIncoTouch() {
869 m_uTskFlags |= eTskFlgIncoTouch;
872 inline void DisableIncoTouch() {
873 m_uTskFlags &= (~eTskFlgIncoTouch);
876 inline bool IsIncoTouchEnabled() {
877 return (m_uTskFlags & eTskFlgIncoTouch);
880 inline void EnableFloatingpoint() {
881 m_uTskFlags |= eTskFlgFloatingpoint;
884 inline void DisableFloatingpoint() {
885 m_uTskFlags &= (~eTskFlgFloatingpoint);
888 inline bool IsFloatingpointEnabled() {
889 return (m_uTskFlags & eTskFlgFloatingpoint);
892 void SetTskFlag(uint32 auFlag) {
893 m_uTskFlags |= auFlag;
899 inline uint32& GetIrqDisableTicks() {
900 return m_uIrqDisableTicks;
903 inline bool IsRealtime() {
904 return (m_eTskType == eTskTypeInterrupt) || ((m_eTskType == eTskTypeRealtime));
909 TINOSBalancedBinaryTree<STLSKeyData> m_TLS;
915 CMcResult* m_pCallResult{};
917 #ifdef INOS_MULTICORE_KERNEL
918 struct SINOSCoreSync* m_pCoreSync;
920 uint8 m_uTaskCoreId = GetCoreId();
925 uint8 m_uTaskCategory = 0xff;
927 #if defined(INOS_DESKTOP)
928 friend class CINOSKernel_desktop;
929 friend void _Suspend(uint32 auState, uint32 auFlags,
CINOSTask* apTask);
930 friend void Resume(
CINOSTask* apTask, uint32 auFlags);
931 friend void Relinquish();
932 friend void ChangePriority(uint32 auPriority);
933 std::thread* m_pThread =
nullptr;
934 std::condition_variable_any m_Startup;
935 std::condition_variable_any m_Resume;
948 uint32 m_uIrqDisableTicks = 0;
951 uint32 m_uExitCode = 0;
957 alignas(4) inosName128 m_cName = {0};
959 void* m_pFunctionParam =
nullptr;
961 std::function<void(
void*)> m_Function;
963 ETskType m_eTskType = eTskTypeSystem;
965 uint32 m_uReentrancyTouched{};
967 #if !defined(INOS_DESKTOP) && defined(INOS_THREADLOCAL)
969 uint8* m_pThreadLocal{};
970 uint8* m_pThreadLocalBase{};