AutosarOS
Task.c
Go to the documentation of this file.
1 
14 #include "Task.h"
15 #include "OS.h"
16 #include "assert.h"
17 #include "Resource.h"
18 
19 #include <util/atomic.h>
20 
22 {
23  OS_SET_ERROR_INFO1(OSServiceId_ActivateTask, &TaskID, sizeof(TaskID));
24 
25  if (OS_EXTENDED && TaskID >= INVALID_TASK) {
27 
28  return E_OS_ID;
29  }
30 
31  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
32  if (TCB_Cfg[TaskID]->curNumberOfActivations + 1 > TCB_Cfg[TaskID]->numberOfActivations) {
34 
35  return E_OS_LIMIT;
36  }
37 
38  TCB_Cfg[TaskID]->curNumberOfActivations += 1;
39 
40  if (TCB_Cfg[TaskID]->taskType == EXTENDED) {
41  TCB_Cfg[TaskID]->pendingEvents = 0; // Clear any pending events
42  }
43 
44  if (TCB_Cfg[TaskID]->curState == SUSPENDED) {
45  TCB_Cfg[TaskID]->curState = PRE_READY;
46  }
47  }
48 
49  OS_Schedule();
50 
51  return E_OK;
52 }
53 
55 {
56  OS_SET_ERROR_INFO1(OSServiceId_ChainTask, &TaskID, sizeof(TaskID));
57 
58  if (OS_EXTENDED && isISR) {
60 
61  return E_OS_CALLLEVEL;
62  }
63 
64  if (OS_EXTENDED && TaskID >= INVALID_TASK) {
66 
67  return E_OS_ID;
68  }
69 
70  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
71  if (OS_EXTENDED && TCB_Cfg[currentTask]->resourceQueue != NULL) {
73 
74  return E_OS_RESOURCE;
75  }
76 
77  /* Handle multiple activations of chained task */
78  if (TCB_Cfg[TaskID]->curNumberOfActivations + 1 > TCB_Cfg[TaskID]->numberOfActivations && TaskID != currentTask) {
80 
81  return E_OS_LIMIT;
82  }
83 
84  TCB_Cfg[TaskID]->curNumberOfActivations += 1;
85 
86  /* Handle multiple activations of current task */
88  assert(TCB_Cfg[currentTask]->curNumberOfActivations >= 0);
89  assert(TCB_Cfg[currentTask]->curNumberOfActivations <= TCB_Cfg[currentTask]->numberOfActivations);
90 
91 #if defined(OS_CONFIG_HOOK_PRE_TASK) && OS_CONFIG_HOOK_PRE_TASK == true
92  PostTaskHook();
93 #endif
94 
95  if (TCB_Cfg[currentTask]->curNumberOfActivations > 0) {
97  } else {
99  }
100 
102 
103  currentTask = INVALID_TASK;
104 
105  if (TCB_Cfg[TaskID]->curState == SUSPENDED) {
106  TCB_Cfg[TaskID]->curState = PRE_READY;
107  }
108  }
109 
110  OS_Schedule();
111 
112  return E_OK;
113 }
114 
116 {
118 
119  if (OS_EXTENDED && isISR) {
121 
122  return E_OS_CALLLEVEL;
123  }
124 
125  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
126  if (OS_EXTENDED && TCB_Cfg[currentTask]->resourceQueue != NULL) {
128 
129  return E_OS_RESOURCE;
130  }
131 
133 
134  assert(TCB_Cfg[currentTask]->curNumberOfActivations >= 0);
135  assert(TCB_Cfg[currentTask]->curNumberOfActivations <= TCB_Cfg[currentTask]->numberOfActivations);
136 
137 #if defined(OS_CONFIG_HOOK_PRE_TASK) && OS_CONFIG_HOOK_PRE_TASK == true
138  PostTaskHook();
139 #endif
140 
141  if (TCB_Cfg[currentTask]->curNumberOfActivations > 0) {
143  } else {
145  }
146 
148 
149  currentTask = INVALID_TASK;
150  }
151 
152  OS_Schedule();
153 
154  return E_OK;
155 }
156 
158 {
160 
161  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
162  if (OS_EXTENDED && isISR) {
164 
165  return E_OS_CALLLEVEL;
166  }
167 
168  if (TCB_Cfg[currentTask]->taskSchedule == PREEMPTIVE) {
169  return E_OK;
170  }
171 
172  if (OS_EXTENDED && TCB_Cfg[currentTask]->resourceQueue != NULL) {
174 
175  return E_OS_RESOURCE;
176  }
177 
179 
180  forceScheduling = true;
181  }
182 
183  OS_Schedule();
184 
185  return E_OK;
186 }
187 
189 {
190  OS_SET_ERROR_INFO1(OSServiceId_GetTaskID, &TaskID, sizeof(TaskID));
191 
192  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
193  *TaskID = currentTask;
194  }
195 
196  return E_OK;
197 }
198 
199 
201 {
202  OS_SET_ERROR_INFO2(OSServiceId_GetTaskState, &TaskID, sizeof(TaskID), &State, sizeof(State));
203 
204  if (OS_EXTENDED && TaskID >= INVALID_TASK) {
206 
207  return E_OS_ID;
208  }
209 
210  if (OS_EXTENDED && State == NULL) {
212 
213  return E_OS_PARAM_POINTER;
214  }
215 
216  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
217  *State = TCB_Cfg[TaskID]->curState;
218  }
219 
220  /* Report PRE_READY as READY to conform to OSEK standard */
221  if (*State == PRE_READY) {
222  *State = READY;
223  }
224 
225  return E_OK;
226 }
227 
228 extern void Task_startup(void)
229 {
230  if (TASK_COUNT > 0) {
231  assert(TASK_COUNT <= UINT8_MAX);
232  /* Start all tasks configured as autostart */
233  for (uint8_t i = 0; i < TASK_COUNT; i++) {
234  if (TCB_Cfg[i]->autostart == AUTOSTART && TCB_Cfg[i]->curState == SUSPENDED) {
235  TCB_Cfg[i]->curState = PRE_READY;
237  }
238 
239 #if defined (OS_CONFIG_STACK_MONITORING) && OS_CONFIG_STACK_MONITORING >= 2
240  // Set stack top marker
241  *(TCB_Cfg[i]->stack - 1) = 0xBE;
242 #if OS_CONFIG_STACK_MONITORING >= 3
243  // Set stack memory for stack monitoring
244  memset(TCB_Cfg[i]->stack, 0xBE, TCB_Cfg[i]->stackSize);
245 #endif /* OS_CONFIG_STACK_MONITORING >= 3 */
246 #endif /* defined (OS_CONFIG_STACK_MONITORING) && OS_CONFIG_STACK_MONITORING >= 2 */
247  }
248  }
249 }
Task_Schedule
StatusType Task_Schedule(void)
Reschedule current task.
Definition: Task.c:157
TaskType
enum tasks_e TaskType
Type for task reference.
Definition: TaskTypes.h:29
StatusType
enum StatusType_e StatusType
Type for status.
task_s::curNumberOfActivations
uint8_t curNumberOfActivations
Current number of activations.
Definition: TaskTypes.h:96
Task_ActivateTask
StatusType Task_ActivateTask(TaskType TaskID)
Activate a task.
Definition: Task.c:21
EXTENDED
@ EXTENDED
The task is a extended task.
Definition: TaskTypes.h:43
OS.h
Operating system control.
Task_GetTaskState
StatusType Task_GetTaskState(TaskType TaskID, TaskStateRefType State)
Return the state of a task.
Definition: Task.c:200
E_OS_RESOURCE
@ E_OS_RESOURCE
Definition: Types.h:46
OSServiceId_Schedule
@ OSServiceId_Schedule
Definition: ErrorTypes.h:50
Task.h
Task management.
E_OS_LIMIT
@ E_OS_LIMIT
Definition: Types.h:44
assert.h
Assert macros and functions.
currentTask
volatile TaskType currentTask
Task currently being executed.
Definition: OCB.c:23
PREEMPTIVE
@ PREEMPTIVE
The task may be preempted by another task.
Definition: TaskTypes.h:50
E_OK
@ E_OK
Definition: Types.h:40
Resource.h
Resource management.
OS_SET_ERROR_INFO1
#define OS_SET_ERROR_INFO1(serviceId, paramPtr1, size1)
Set error info with up to one parameter.
Definition: ErrorTypes.h:220
OSServiceId_GetTaskID
@ OSServiceId_GetTaskID
Definition: ErrorTypes.h:51
task_s::stack
uint8_t *const stack
Pointer to stack base.
Definition: TaskTypes.h:84
E_OS_CALLLEVEL
@ E_OS_CALLLEVEL
Definition: Types.h:42
Task_TerminateTask
StatusType Task_TerminateTask(void)
Terminate active task.
Definition: Task.c:115
OS_Schedule
void OS_Schedule(void)
Schedule task.
TCB_Cfg
volatile struct task_s * TCB_Cfg[]
Current task control blocks.
task_s::curState
TaskStateType curState
Current state of the task.
Definition: TaskTypes.h:97
Task_startup
void Task_startup(void)
Startup function for task management.
Definition: Task.c:228
OSServiceId_ActivateTask
@ OSServiceId_ActivateTask
Definition: ErrorTypes.h:47
OS_SET_ERROR_INFO0
#define OS_SET_ERROR_INFO0(serviceId)
Set error info with zero parameters.
Definition: ErrorTypes.h:208
Task_ChainTask
StatusType Task_ChainTask(TaskType TaskID)
Chain task.
Definition: Task.c:54
TaskRefType
TaskType * TaskRefType
Reference to a task reference.
Definition: TaskTypes.h:36
task_s::pendingEvents
EventMaskType pendingEvents
Mask of currently pending events.
Definition: TaskTypes.h:106
AUTOSTART
@ AUTOSTART
Autostart task.
Definition: TaskTypes.h:77
isISR
volatile bool isISR
Is currently ISR context?
Definition: OCB.c:20
READY
@ READY
The task is ready to be scheduled.
Definition: TaskTypes.h:60
assert
#define assert(expression)
Definition: assert.h:37
SUSPENDED
@ SUSPENDED
The task is suspended and will not be scheduled.
Definition: TaskTypes.h:58
OSServiceId_GetTaskState
@ OSServiceId_GetTaskState
Definition: ErrorTypes.h:52
OSServiceId_TerminateTask
@ OSServiceId_TerminateTask
Definition: ErrorTypes.h:49
OS_EXTENDED
#define OS_EXTENDED
Definition: OCB.h:156
E_OS_ID
@ E_OS_ID
Definition: Types.h:43
PostTaskHook
void PostTaskHook(void)
PostTask hook function.
Definition: App.c:776
TASK_COUNT
#define TASK_COUNT
Count of tasks defined.
Definition: CfgGenMacros.h:267
OS_SET_ERROR_INFO2
#define OS_SET_ERROR_INFO2(serviceId, paramPtr1, size1, paramPtr2, size2)
Set error info with up to two parameters.
Definition: ErrorTypes.h:234
TaskStateRefType
TaskStateType * TaskStateRefType
Type for task state reference.
Definition: TaskTypes.h:70
forceScheduling
bool forceScheduling
Force the next rescheduling.
Definition: OCB.c:28
Task_GetTaskID
StatusType Task_GetTaskID(TaskRefType TaskID)
Return the ID of the task currently running.
Definition: Task.c:188
E_OS_PARAM_POINTER
@ E_OS_PARAM_POINTER
Definition: Types.h:50
OSServiceId_ChainTask
@ OSServiceId_ChainTask
Definition: ErrorTypes.h:48
Resource_ReleaseInternalResource
void Resource_ReleaseInternalResource(void)
Release internal resource of the current task if one is assigned.
Definition: Resource.c:174
OS_CALL_ERROR_HOOK
#define OS_CALL_ERROR_HOOK(error)
Call error hook if configured.
Definition: ErrorTypes.h:93
PRE_READY
@ PRE_READY
The task is ready but its stack is uninitialized.
Definition: TaskTypes.h:59