AutosarOS
Events.c
Go to the documentation of this file.
1 
14 #include "Events.h"
15 #include "Types.h"
16 #include "OS.h"
17 #include "OCB.h"
18 #include "Resource.h"
19 
20 #include <util/atomic.h>
21 
23 {
24  OS_SET_ERROR_INFO2(OSServiceId_SetEvent, &TaskID, sizeof(TaskID), &events, sizeof(events));
25 
26  bool taskChanged = false;
27 
28  if (OS_EXTENDED && TaskID >= INVALID_TASK) {
30 
31  return E_OS_ID;
32  }
33 
34  if (OS_EXTENDED && TCB_Cfg[TaskID]->taskType != EXTENDED) {
36 
37  return E_OS_ACCESS;
38  }
39 
40  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
41  if (OS_EXTENDED && TCB_Cfg[TaskID]->curState == SUSPENDED) {
43 
44  return E_OS_STATE;
45  }
46 
47  // Set pending events
48  TCB_Cfg[TaskID]->pendingEvents |= (events & TCB_Cfg[TaskID]->events);
49 
50  if ((TCB_Cfg[TaskID]->waitEvents & TCB_Cfg[TaskID]->pendingEvents) != 0
51  && TCB_Cfg[TaskID]->curState == WAITING) {
52  // Task was waiting for one of the pending events => transfer to READY state
53  TCB_Cfg[TaskID]->curState = READY;
54 
55  taskChanged = true;
56  }
57  }
58 
59  if (taskChanged) {
60  // Rescheduling might be required because the task was transferred to the READY state
61  OS_Schedule();
62  }
63 
64  return E_OK;
65 }
66 
68 {
69  OS_SET_ERROR_INFO1(OSServiceId_ClearEvent, &events, sizeof(events));
70 
71  if (OS_EXTENDED && isISR) {
73 
74  return E_OS_CALLLEVEL;
75  }
76 
77  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
78  if (OS_EXTENDED && TCB_Cfg[currentTask]->taskType != EXTENDED) {
80 
81  return E_OS_ACCESS;
82  }
83 
84  // Clear specified events
86  }
87 
88  return E_OK;
89 }
90 
92 {
93  OS_SET_ERROR_INFO2(OSServiceId_GetEvent, &TaskID, sizeof(TaskID), &events, sizeof(events));
94 
95  if (TaskID >= INVALID_TASK) {
97 
98  return E_OS_ID;
99  }
100 
101  if (OS_EXTENDED && events == NULL) {
103 
104  return E_OS_PARAM_POINTER;
105  }
106 
107  if (OS_EXTENDED && TCB_Cfg[TaskID]->taskType != EXTENDED) {
109 
110  return E_OS_ACCESS;
111  }
112 
113  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
114  if (OS_EXTENDED && TCB_Cfg[TaskID]->curState == SUSPENDED) {
116 
117  return E_OS_STATE;
118  }
119 
120  // Copy pending events
121  *events = TCB_Cfg[TaskID]->pendingEvents;
122  }
123 
124  return E_OK;
125 }
126 
128 {
129  OS_SET_ERROR_INFO1(OSServiceId_WaitEvent, &events, sizeof(events));
130 
131  if (OS_EXTENDED && isISR) {
133 
134  return E_OS_CALLLEVEL;
135  }
136 
137  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
138  if (OS_EXTENDED && TCB_Cfg[currentTask]->taskType != EXTENDED) {
140 
141  return E_OS_ACCESS;
142  }
143 
144  if (OS_EXTENDED && TCB_Cfg[currentTask]->resourceQueue != NULL) {
146 
147  return E_OS_RESOURCE;
148  }
149 
150  // Set wait mask
152 
153  if ((TCB_Cfg[currentTask]->waitEvents & TCB_Cfg[currentTask]->pendingEvents) == 0) {
154  /* None of the requested events is pending => transfer to WAITING state */
156 
158 
159  forceScheduling = true;
160  OS_Schedule();
161  }
162  }
163 
164  return E_OK;
165 }
TaskType
enum tasks_e TaskType
Type for task reference.
Definition: TaskTypes.h:29
EventMaskType
uint8_t EventMaskType
Data type of the event mask.
Definition: EventTypes.h:21
StatusType
enum StatusType_e StatusType
Type for status.
OSServiceId_WaitEvent
@ OSServiceId_WaitEvent
Definition: ErrorTypes.h:35
EXTENDED
@ EXTENDED
The task is a extended task.
Definition: TaskTypes.h:43
EventMaskRefType
EventMaskType * EventMaskRefType
Reference to an event mask.
Definition: EventTypes.h:28
OS.h
Operating system control.
E_OS_RESOURCE
@ E_OS_RESOURCE
Definition: Types.h:46
Events_ClearEvent
StatusType Events_ClearEvent(EventMaskType events)
Clear events.
Definition: Events.c:67
currentTask
volatile TaskType currentTask
Task currently being executed.
Definition: OCB.c:23
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
Events.h
Event management.
E_OS_CALLLEVEL
@ E_OS_CALLLEVEL
Definition: Types.h:42
OS_Schedule
void OS_Schedule(void)
Schedule task.
TCB_Cfg
volatile struct task_s * TCB_Cfg[]
Current task control blocks.
E_OS_ACCESS
@ E_OS_ACCESS
Definition: Types.h:41
task_s::curState
TaskStateType curState
Current state of the task.
Definition: TaskTypes.h:97
task_s::pendingEvents
EventMaskType pendingEvents
Mask of currently pending events.
Definition: TaskTypes.h:106
isISR
volatile bool isISR
Is currently ISR context?
Definition: OCB.c:20
OSServiceId_ClearEvent
@ OSServiceId_ClearEvent
Definition: ErrorTypes.h:33
READY
@ READY
The task is ready to be scheduled.
Definition: TaskTypes.h:60
Events_WaitEvent
StatusType Events_WaitEvent(EventMaskType events)
Wait for events.
Definition: Events.c:127
SUSPENDED
@ SUSPENDED
The task is suspended and will not be scheduled.
Definition: TaskTypes.h:58
task_s::events
const EventMaskType events
Mask of assigned task events.
Definition: TaskTypes.h:93
Types.h
Type definitions.
WAITING
@ WAITING
The task is waiting for an event.
Definition: TaskTypes.h:62
OS_EXTENDED
#define OS_EXTENDED
Definition: OCB.h:156
Events_GetEvent
StatusType Events_GetEvent(TaskType TaskID, EventMaskRefType events)
Get events.
Definition: Events.c:91
task_s::waitEvents
EventMaskType waitEvents
Mask of events the task is currently waiting on.
Definition: TaskTypes.h:105
E_OS_STATE
@ E_OS_STATE
Definition: Types.h:47
E_OS_ID
@ E_OS_ID
Definition: Types.h:43
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
OSServiceId_SetEvent
@ OSServiceId_SetEvent
Definition: ErrorTypes.h:32
forceScheduling
bool forceScheduling
Force the next rescheduling.
Definition: OCB.c:28
E_OS_PARAM_POINTER
@ E_OS_PARAM_POINTER
Definition: Types.h:50
Events_SetEvent
StatusType Events_SetEvent(TaskType TaskID, EventMaskType events)
Set events.
Definition: Events.c:22
OCB.h
Operating System Control Block.
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
OSServiceId_GetEvent
@ OSServiceId_GetEvent
Definition: ErrorTypes.h:34