SYS/BIOS  7.00
Task.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020, Texas Instruments Incorporated - http://www.ti.com
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  */
370 /*
371  * ======== Task.h ========
372  */
373 
374 #ifndef ti_sysbios_knl_Task__include
375 #define ti_sysbios_knl_Task__include
376 
377 /* BIOS 6.x compatibility, use -Dxdc_std__include to disable */
379 #include <xdc/std.h>
382 #include <stdbool.h>
383 #include <stddef.h>
384 #include <stdint.h>
385 
386 #include <ti/sysbios/knl/Queue.h>
387 #include <ti/sysbios/knl/Clock.h>
388 
391 
393 #define ti_sysbios_knl_Task_long_names
394 #include "Task_defs.h"
397 #ifdef __cplusplus
398 extern "C" {
399 #endif
400 
404 #define Task_A_badPriority "invalid priority"
405 
409 #define Task_A_badTaskState "cannot delete a task in RUNNING state"
410 
414 #define Task_A_badThreadType "cannot create/delete a task from a Hwi or Swi thread"
415 
419 #define Task_A_badTimeout "cannot sleep forever"
420 
424 #define Task_A_noPendElem "not enough info to delete BLOCKED task"
425 
429 #define Task_A_sleepTaskDisabled "cannot call Task_sleep when the scheduler is disabled"
430 
434 #define Task_A_taskDisabled "cannot create a task when tasking is disabled"
435 
447 #define Task_E_stackOverflow "task 0x%x stack overflow"
448 
461 #define Task_E_spOutOfBounds "task 0x%x stack error, SP = 0x%x"
462 
471 #define Task_E_deleteNotAllowed "delete not allowed task 0x%x"
472 
479 #define Task_E_moduleStateCheckFailed "invalid module state"
480 
486 #define Task_E_objectCheckFailed "invalid task object 0x%x"
487 
490 typedef struct Task_PendElem Task_PendElem;
491 typedef struct Task_RunQEntry Task_RunQEntry;
500 enum Task_Mode {
509 };
510 
517 typedef enum Task_Mode Task_Mode;
518 
522 typedef void (*Task_FuncPtr)(uintptr_t arg1, uintptr_t arg2);
523 
524 typedef struct Task_Struct Task_Struct;
525 typedef struct Task_Struct Task_Object;
526 typedef struct Task_Struct *Task_Handle;
527 typedef struct Task_Struct *Task_Instance;
528 
530 struct Task_PendElem {
531  Queue_Elem qElem;
532  Task_Handle taskHandle;
533  Clock_Handle clockHandle;
534 };
535 /* @endcond */
536 
542 typedef struct Task_Stat Task_Stat;
543 
544 struct Task_Stat {
548  int priority;
554  void * stack;
558  size_t stackSize;
564  IHeap_Handle stackHeap;
568  void * env;
569  Task_Mode mode;
573  void * sp;
574  size_t used;
575 };
576 
583 typedef struct Task_HookSet Task_HookSet;
584 
585 struct Task_HookSet {
586  void (*registerFxn)(int arg1);
587  void (*createFxn)(Task_Handle arg1, Error_Block* arg2);
588  void (*readyFxn)(Task_Handle arg1);
589  void (*switchFxn)(Task_Handle arg1, Task_Handle arg2);
590  void (*exitFxn)(Task_Handle arg1);
591  void (*deleteFxn)(Task_Handle arg1);
592 };
593 
594 typedef struct { int length; const Task_HookSet *elem; } Task_Hook;
595 
596 typedef struct Task_Params Task_Params;
597 
598 struct Task_Params {
602  char * name;
606  uintptr_t arg0;
610  uintptr_t arg1;
614  int priority;
620  void * stack;
624  size_t stackSize;
630  IHeap_Handle stackHeap;
634  void * env;
642 };
643 
645 struct Task_Struct {
646  Queue_Elem qElem;
647  Queue_Elem objElem;
648  char * name;
649  volatile int priority;
650  unsigned int mask;
651  void * context;
652  Task_Mode mode;
653  Task_PendElem *pendElem;
654  size_t stackSize;
655  char *stack;
656  IHeap_Handle stackHeap;
657  Task_FuncPtr fxn;
658  uintptr_t arg0;
659  uintptr_t arg1;
660  void * env;
661  void * *hookEnv;
662  bool vitalTaskFlag;
663  Queue_Handle readyQ;
664  uint32_t checkValue;
665  void * tls;
666 };
667 
668 /* Module_State */
669 struct Task_Module_State {
670  Queue_Struct objQ;
671  volatile bool locked;
672  volatile unsigned int curSet;
673  volatile bool workFlag;
674  unsigned int vitalTasks;
675  Task_Handle curTask;
676  Queue_Handle curQ;
677  Queue_Handle readyQ;
678  Queue_Object terminatedQ;
679  Queue_Object inactiveQ;
680  Task_Handle idleTask;
681  bool initDone;
682  char dummy;
683 };
684 
685 typedef struct Task_Module_State Task_Module_State;
686 
690 typedef void (*Task_AllBlockedFuncPtr)(void);
691 
692 /* ModStateCheckValueFuncPtr */
693 typedef uint32_t (*Task_ModuleStateCheckValueFuncPtr)(Task_Module_State* arg1);
694 
695 /* ModStateCheckFuncPtr */
696 typedef int (*Task_ModuleStateCheckFuncPtr)(Task_Module_State* arg1, uint32_t arg2);
697 
701 typedef uint32_t (*Task_ObjectCheckValueFuncPtr)(Task_Handle arg1);
702 
706 typedef int (*Task_ObjectCheckFuncPtr)(Task_Handle arg1, uint32_t arg2);
707 
708 extern Queue_Handle Task_terminatedQ;
709 extern Queue_Handle Task_inactiveQ;
710 extern Queue_Handle Task_objectQ;
711 
726 extern const unsigned int Task_numPriorities;
727 
737 extern const size_t Task_defaultStackSize;
738 
745 extern IHeap_Handle Task_defaultStackHeap;
795 extern const Task_AllBlockedFuncPtr Task_allBlockedFunc;
796 
808 extern const bool Task_initStackFlag;
809 
831 extern const bool Task_checkStackFlag;
832 
860 extern const bool Task_objectCheckFlag;
861 
903 extern const Task_ObjectCheckFuncPtr Task_objectCheckFxn;
904 
947 extern const Task_ModuleStateCheckValueFuncPtr Task_moduleStateCheckValueFxn;
948 
949 /* objectCheckValue */
950 extern uint32_t Task_objectCheckValue(Task_Handle, uint32_t);
951 
1003 extern const Task_ObjectCheckValueFuncPtr Task_objectCheckValueFxn;
1004 
1029 extern const bool Task_moduleStateCheckFlag;
1030 
1073 extern const Task_ModuleStateCheckFuncPtr Task_moduleStateCheckFxn;
1074 
1075 /* moduleStateCheckValue */
1076 extern uint32_t Task_moduleStateCheckValue;
1077 
1120 extern const Task_ModuleStateCheckValueFuncPtr Task_moduleStateCheckValueFxn;
1149 extern const bool Task_deleteTerminatedTasks;
1150 
1156 extern const Task_Hook Task_hooks;
1157 
1159 extern void Task_init(void);
1160 
1161 extern int Task_Instance_init(Task_Object *obj, Task_FuncPtr fxn, const Task_Params *prms, Error_Block *eb);
1162 
1163 extern void Task_Instance_finalize(Task_Object *obj, int ec);
1254 extern Task_Handle Task_create(Task_FuncPtr fxn, const Task_Params *prms, Error_Block *eb);
1255 
1269 extern Task_Handle Task_construct(Task_Struct *obj, Task_FuncPtr fxn, const Task_Params *prms, Error_Block *eb);
1270 
1279 extern void Task_delete(Task_Handle *task);
1280 
1288 extern void Task_destruct(Task_Struct *obj);
1289 
1301 extern void Task_startup(void);
1308 extern bool Task_enabled(void);
1319 extern void Task_unlockSched(void);
1359 extern unsigned int Task_disable(void);
1360 
1371 extern void Task_enable(void);
1415 extern void Task_restore(unsigned int key);
1416 
1421 extern void Task_restoreHwi(unsigned int key);
1438 extern Task_Handle Task_self(void);
1439 
1463 extern void Task_checkStacks(Task_Handle oldTask, Task_Handle newTask);
1464 
1501 extern void Task_exit(void);
1502 
1531 extern void Task_sleep(uint32_t nticks);
1532 
1552 extern void Task_yield(void);
1553 
1557 extern Task_Handle Task_getIdleTask(void);
1558 
1567 extern uintptr_t Task_getArg0(Task_Handle task);
1578 extern uintptr_t Task_getArg1(Task_Handle task);
1596 extern void * Task_getEnv(Task_Handle task);
1597 
1612 extern Task_FuncPtr Task_getFunc(Task_Handle task, uintptr_t *arg0, uintptr_t *arg1);
1613 
1640 extern void * Task_getHookContext(Task_Handle task, int id);
1641 
1651 extern char * Task_getName(Task_Handle task);
1652 
1662 extern int Task_getPri(Task_Handle task);
1663 
1668 extern void Task_setArg0(Task_Handle task, uintptr_t arg);
1675 extern void Task_setArg1(Task_Handle task, uintptr_t arg);
1691 extern void Task_setEnv(Task_Handle task, void * env);
1692 
1718 extern void Task_setHookContext(Task_Handle task, int id, void * hookContext);
1719 
1773 extern int Task_setPri(Task_Handle task, int newpri);
1774 
1801 extern void Task_stat(Task_Handle task, Task_Stat *statbuf);
1802 
1808 extern Task_Mode Task_getMode(Task_Handle task);
1809 
1827 extern void Task_block(Task_Handle task);
1848 extern void Task_unblock(Task_Handle task);
1861 extern void Task_blockI(Task_Handle task);
1874 extern void Task_unblockI(Task_Handle task, unsigned int hwiKey);
1875 
1876 extern void Task_schedule(void);
1877 
1878 extern void Task_enter(void);
1879 
1880 extern void Task_enterUnpriv(void);
1881 
1882 extern void Task_sleepTimeout(uintptr_t arg);
1883 
1884 extern int Task_postInit(Task_Object *task, Error_Block *eb);
1885 
1886 extern void Task_allBlockedFunction(void);
1887 
1888 extern void Task_deleteTerminatedTasksFunc(void);
1889 
1890 extern void Task_processVitalTaskFlag(Task_Object *task);
1891 
1892 extern int Task_moduleStateCheck(Task_Module_State *moduleState, uint32_t checkValue);
1893 
1894 extern uint32_t Task_getModuleStateCheckValue(Task_Module_State *moduleState);
1895 
1896 extern int Task_objectCheck(Task_Handle handle, uint32_t checkValue);
1897 
1898 extern uint32_t Task_getObjectCheckValue(Task_Handle handle);
1899 
1900 extern void Task_enableOtherCores(void);
1914 extern void Task_Params_init(Task_Params *prms);
1915 
1924 extern Task_Handle Task_Object_first(void);
1925 
1936 extern Task_Handle Task_Object_next(Task_Handle task);
1937 
1938 /* @cond NODOC */
1939 extern Task_Module_State Task_Module_state;
1940 
1941 #define Task_module ((Task_Module_State *) &(Task_Module_state))
1942 
1943 #define Task_Object_heap() NULL
1944 
1945 static inline char * Task_Handle_name(Task_Handle obj)
1946 {
1947  return (obj->name);
1948 }
1949 
1950 static inline Task_Handle Task_handle(Task_Struct *str)
1951 {
1952  return ((Task_Handle)str);
1953 }
1954 
1955 static inline Task_Struct * Task_struct(Task_Handle h)
1956 {
1957  return ((Task_Struct *)h);
1958 }
1959 /* @endcond */
1960 
1961 #ifdef __cplusplus
1962 }
1963 #endif
1964 
1965 #endif /* ti_sysbios_knl_Task__include */
1966 
1967 /* @cond NODOC */
1968 #undef ti_sysbios_knl_Task_long_names
1969 #include "Task_defs.h"
int Task_setPri(Task_Handle task, int newpri)
Set a task&#39;s priority.
Task_Handle Task_Object_next(Task_Handle task)
return handle of the next task on task list
Definition: Task.h:504
void * Task_getHookContext(Task_Handle task, int id)
Get hook set&#39;s context for a task.
unsigned int Task_disable(void)
Disable the task scheduler.
Task_Handle Task_create(Task_FuncPtr fxn, const Task_Params *prms, Error_Block *eb)
Create a Task.
size_t used
Definition: Task.h:574
void * env
Global environment struct.
Definition: Task.h:634
Task_Handle Task_Object_first(void)
return handle of the first task on task list
uintptr_t arg0
Task function argument. Default is 0.
Definition: Task.h:606
struct Task_Struct Task_Struct
Definition: Task.h:524
Task_FuncPtr Task_getFunc(Task_Handle task, uintptr_t *arg0, uintptr_t *arg1)
Get Task function and arguments.
Task_Handle Task_getIdleTask(void)
returns a handle to the idle task object (for core 0)
Definition: Clock.h:408
void Task_destruct(Task_Struct *obj)
Destruct a task.
void Task_delete(Task_Handle *task)
Delete a task.
void Task_exit(void)
Terminate execution of the current task.
struct Task_Struct * Task_Instance
Definition: Task.h:527
Definition: Task.h:544
void * env
Global environment struct.
Definition: Task.h:568
int priority
Task priority.
Definition: Task.h:614
void Task_Params_init(Task_Params *prms)
Initialize the Task_Params structure with default values.
size_t stackSize
Task stack size.
Definition: Task.h:624
bool vitalTaskFlag
Exit system immediately when the last task with this flag set to true has terminated.
Definition: Task.h:641
Opaque queue element.
Definition: Queue.h:204
System Clock Manager.
void * Task_getEnv(Task_Handle task)
Get task environment pointer.
Definition: Task.h:501
int Task_getPri(Task_Handle task)
Get task priority.
Runtime error manager.
Task_Handle Task_self(void)
Returns a handle to the currently executing Task object.
Task is on inactive task list.
Definition: Task.h:508
Definition: Task.h:594
char * Task_getName(Task_Handle task)
Get task name.
Queue Manager.
Definition: Task.h:585
char * name
Optional name for the object. NULL by default.
Definition: Task.h:602
void Task_setHookContext(Task_Handle task, int id, void *hookContext)
Set hook instance&#39;s context for a task.
uintptr_t arg1
Task function argument. Default is 0.
Definition: Task.h:610
Task_Handle Task_construct(Task_Struct *obj, Task_FuncPtr fxn, const Task_Params *prms, Error_Block *eb)
Construct a task.
void Task_block(Task_Handle task)
Block a task.
Definition: Task.h:503
const bool Task_initStackFlag
Initialize stack with known value for stack checking at runtime (see Task_checkStackFlag).
const size_t Task_defaultStackSize
Default stack size (in MAUs) used for all tasks.
void Task_sleep(uint32_t nticks)
Delay execution of the current task.
struct Task_Struct Task_Object
Definition: Task.h:525
Error block.
Definition: Error.h:152
void(* Task_FuncPtr)(uintptr_t arg1, uintptr_t arg2)
Task function type definition.
Definition: Task.h:522
void Task_stat(Task_Handle task, Task_Stat *statbuf)
Retrieve the status of a task.
void * stack
Task stack pointer. Default = null.
Definition: Task.h:620
void Task_yield(void)
Yield processor to equal priority task.
Interface to heap functions.
int priority
Task priority.
Definition: Task.h:548
void * sp
Task&#39;s current stack pointer.
Definition: Task.h:573
void * stack
Task stack pointer. Default = null.
Definition: Task.h:554
Definition: Task.h:598
Definition: Task.h:502
const bool Task_checkStackFlag
Check &#39;from&#39; and &#39;to&#39; task stacks before task context switch.
const Task_AllBlockedFuncPtr Task_allBlockedFunc
Function to call while all tasks are blocked.
Task_Mode mode
Definition: Task.h:569
size_t stackSize
Task stack size.
Definition: Task.h:558
void Task_setEnv(Task_Handle task, void *env)
Set task environment.
struct Task_Struct * Task_Handle
Definition: Task.h:526
void Task_restore(unsigned int key)
Restore Task scheduling state.
int length
Definition: Task.h:594
IHeap_Handle stackHeap
Mem heap used for dynamically created task stack.
Definition: Task.h:564
void Task_checkStacks(Task_Handle oldTask, Task_Handle newTask)
Check for stack overflow.
Task_Mode
Task execution modes.
Definition: Task.h:500
IHeap_Handle stackHeap
Mem heap used for dynamically created task stack.
Definition: Task.h:630
Task_Mode Task_getMode(Task_Handle task)
Retrieve the Task_Mode of a task.
const unsigned int Task_numPriorities
Number of Task priorities supported. Default is 16.
© Copyright 1995-2023, Texas Instruments Incorporated. All rights reserved.
Trademarks | Privacy policy | Terms of use | Terms of sale