AutosarOS
App.c
Go to the documentation of this file.
1 
14 #include "assert.h"
15 
16 #include "OS_API.h"
17 
18 #include <avr/io.h>
19 #include <util/delay.h>
20 
21 #if defined (OS_CONFIG_SIM) && OS_CONFIG_SIM == true
22 #define DELAY_MS(ms)
23 #else
24 #define DELAY_MS(ms) _delay_ms(ms)
25 #endif /* defined (OS_CONFIG_SIM) && OS_CONFIG_SIM == true */
26 
27 volatile bool startupHooksCalled = false;
28 volatile bool errorHookCalled = false;
29 
30 TASK(Idle)
31 {
32  assert(startupHooksCalled == true);
33 
34  StatusType stat = ActivateTask(Task1);
35  assert(stat == E_OK);
36 
37  while (1);
38 }
39 
40 TASK(Task1)
41 {
42  StatusType stat = ActivateTask(Task2);
43  assert(stat == E_OK);
44 
45  stat = Schedule();
46  assert(stat == E_OK);
47 
48  stat = TerminateTask();
49  assert(stat == E_OK);
50 }
51 
52 TASK(Task2)
53 {
54  assert(errorHookCalled == false);
55 
56  TickType tick = 0;
57  StatusType stat = GetAlarm(Alarm1, &tick);
58  assert(stat == E_OS_NOFUNC && errorHookCalled == true);
59 
60  stat = TerminateTask();
61  assert(stat == E_OK);
62 }
63 
64 extern void StartupHook(void)
65 {
66  DDRB = 0xFF; // PB as output
67  PORTB = 0xFF; // keep all LEDs off
68 
69  DDRD = 0x00; // PD as input
70  PORTD = 0xFF; // enable PU on PD
71 
72 #if defined (__AVR_ATmega32__)
73 
74 #elif defined (__AVR_ATmega128__) || defined (__AVR_ATmega1284__)
75  /* Timer 2 */
76 #if defined (OS_CONFIG_SIM) && OS_CONFIG_SIM == true
77 #if defined (__AVR_ATmega128__)
78  TCCR2 = (1 << CS20); // Enable Timer2 with Prescaler 1
79  TIMSK |= 1 << TOIE2; // Enable Overflow Interrupt (Timer2)
80 #else /* defined (__AVR_ATmega128__) */
81  TCCR2B = (1 << CS20); // Enable Timer2 with Prescaler 1
82  TIMSK2 |= 1 << TOIE2; // Enable Overflow Interrupt (Timer2)
83 #endif /* defined (__AVR_ATmega128__) */
84 #endif /* defined (OS_CONFIG_SIM) && OS_CONFIG_SIM == true */
85 #else /* defined (__AVR_ATmega32__) */
86 #error Unknown CPU defined!
87 #endif /* defined (__AVR_ATmega32__) */
88 
89  uint8_t t = 0;
90 
91  while (t < 6) {
92  uint8_t r = PORTB;
93  r ^= (1 << 7);
94  PORTB = r;
95  DELAY_MS(50);
96  t++;
97  }
98 
99  startupHooksCalled = true;
100 }
101 
102 extern void ShutdownHook(StatusType error)
103 {
104  DDRB = 0xFF; // PB as output
105  PORTB = 0xFF; // keep all LEDs off
106 
107  for (uint8_t i = 0; i < 11; i++) {
108  PORTB ^= 0xFF;
109  DELAY_MS(1000);
110  }
111 }
112 
113 extern void PreTaskHook(void)
114 {
115  static uint8_t count = 0;
116 
117  if (count == 1) {
118  TaskType task;
119  StatusType stat = GetTaskID(&task);
120  assert(stat == E_OK && task == Task1);
121 
122  TaskStateType state = SUSPENDED;
123  stat = GetTaskState(Task1, &state);
124  assert(stat == E_OK && state == RUNNING);
125  stat = GetTaskState(Task2, &state);
126  assert(stat == E_OK && state == SUSPENDED);
127  } else if (count == 2) {
128  TaskType task;
129  StatusType stat = GetTaskID(&task);
130  assert(stat == E_OK && task == Task2);
131 
132  TaskStateType state = SUSPENDED;
133  stat = GetTaskState(Task1, &state);
134  assert(stat == E_OK && state == READY);
135  stat = GetTaskState(Task2, &state);
136  assert(stat == E_OK && state == RUNNING);
137  } else if (count == 3) {
138  TaskType task;
139  StatusType stat = GetTaskID(&task);
140  assert(stat == E_OK && task == Task1);
141 
142  TaskStateType state = SUSPENDED;
143  stat = GetTaskState(Task1, &state);
144  assert(stat == E_OK && state == RUNNING);
145  stat = GetTaskState(Task2, &state);
146  assert(stat == E_OK && state == SUSPENDED);
147  }
148 
149  count += 1;
150 }
151 
152 extern void PostTaskHook(void)
153 {
154  static uint8_t count = 0;
155 
156  if (count == 1) {
157  TaskType task;
158  StatusType stat = GetTaskID(&task);
159  assert(stat == E_OK && task == Task1);
160 
161  TaskStateType state = SUSPENDED;
162  stat = GetTaskState(Task1, &state);
163  assert(stat == E_OK && state == RUNNING);
164  stat = GetTaskState(Task2, &state);
165  assert(stat == E_OK && state == READY);
166  } else if (count == 2) {
167  TaskType task;
168  StatusType stat = GetTaskID(&task);
169  assert(stat == E_OK && task == Task2);
170 
171  TaskStateType state = SUSPENDED;
172  stat = GetTaskState(Task1, &state);
173  assert(stat == E_OK && state == READY);
174  stat = GetTaskState(Task2, &state);
175  assert(stat == E_OK && state == RUNNING);
176  } else if (count == 3) {
177  TaskType task;
178  StatusType stat = GetTaskID(&task);
179  assert(stat == E_OK && task == Task1);
180 
181  TaskStateType state = SUSPENDED;
182  stat = GetTaskState(Task1, &state);
183  assert(stat == E_OK && state == RUNNING);
184  stat = GetTaskState(Task2, &state);
185  assert(stat == E_OK && state == SUSPENDED);
186  }
187 
188  count += 1;
189 }
190 
191 extern void ErrorHook(StatusType error)
192 {
193  errorHookCalled = true;
194 }
195 
196 ISR(TIMER2_OVF_vect)
197 {
198 
199 }
startupHooksCalled
volatile bool startupHooksCalled
Definition: App.c:27
TaskType
enum tasks_e TaskType
Type for task reference.
Definition: TaskTypes.h:29
StatusType
enum StatusType_e StatusType
Type for status.
ErrorHook
void ErrorHook(StatusType error)
PostTask hook function.
Definition: App.c:784
Schedule
#define Schedule
Definition: OS_API.h:81
E_OS_NOFUNC
@ E_OS_NOFUNC
Definition: Types.h:45
TickType
uint64_t TickType
Data type of counter values.
Definition: CounterTypes.h:21
StartupHook
void StartupHook(void)
Definition: App.c:702
GetTaskState
#define GetTaskState
Definition: OS_API.h:83
errorHookCalled
volatile bool errorHookCalled
Definition: App.c:28
assert.h
Assert macros and functions.
TASK
TASK(Idle)
Definition: App.c:33
E_OK
@ E_OK
Definition: Types.h:40
RUNNING
@ RUNNING
The task is currently running.
Definition: TaskTypes.h:61
ISR
ISR(INT0_vect)
Definition: App.c:806
PreTaskHook
void PreTaskHook(void)
PreTask hook function.
Definition: App.c:768
ActivateTask
#define ActivateTask
Definition: OS_API.h:78
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
TerminateTask
#define TerminateTask
Definition: OS_API.h:80
OS_API.h
Operating System API.
GetAlarm
#define GetAlarm
Definition: OS_API.h:26
DELAY_MS
#define DELAY_MS(ms)
Definition: App.c:24
GetTaskID
#define GetTaskID
Definition: OS_API.h:82
PostTaskHook
void PostTaskHook(void)
PostTask hook function.
Definition: App.c:776
ShutdownHook
void ShutdownHook(StatusType error)
Definition: App.c:757
TaskStateType
enum OsTaskState_e TaskStateType
Task state.