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 isrFlag = false;
28 
29 TASK(Idle)
30 {
31  while (1);
32 }
33 
34 TASK(Task1)
35 {
36  StatusType stat = ActivateTask(INVALID_TASK);
37  assert(stat == E_OS_ID);
38 
39  TaskStateType state = SUSPENDED;
40  stat = GetTaskState(INVALID_TASK, &state);
41  assert(stat == E_OS_ID);
42 
43  stat = ChainTask(INVALID_TASK);
44  assert(stat == E_OS_ID);
45 
46  stat = ActivateTask(Task2);
47  assert(stat == E_OK);
48 
49  stat = Schedule();
50  assert(stat == E_OK);
51 
52  stat = GetResource(RES_SCHEDULER);
53  assert(stat == E_OK);
54 
55  stat = TerminateTask();
56  assert(stat == E_OS_RESOURCE);
57 
58  stat = ChainTask(Task2);
59  assert(stat == E_OS_RESOURCE);
60 
61  stat = ReleaseResource(RES_SCHEDULER);
62  assert(stat == E_OK);
63 
64  while (!isrFlag)
65  ;
66 
67  stat = TerminateTask();
68  assert(stat == E_OK);
69 }
70 
71 TASK(Task2)
72 {
73  StatusType stat = ActivateTask(Task1);
74  assert(stat == E_OS_LIMIT);
75 
76  stat = ActivateTask(Task2);
77  assert(stat == E_OS_LIMIT);
78 
79  stat = ChainTask(Task1);
80  assert(stat == E_OS_LIMIT);
81 
82  stat = TerminateTask();
83  assert(stat == E_OK);
84 }
85 
86 extern void StartupHook(void)
87 {
88  DDRB = 0xFF; // PB as output
89  PORTB = 0xFF; // keep all LEDs off
90 
91  DDRD = 0x00; // PD as input
92  PORTD = 0xFF; // enable PU on PD
93 
94 #if defined (__AVR_ATmega32__)
95  GICR = 1 << INT0; // Enable INT0 and INT1
96  MCUCR = 1 << ISC01 | 0 << ISC00; // Trigger INT0 and INT1 on falling edge
97 #elif defined (__AVR_ATmega128__) || defined (__AVR_ATmega1284__)
98  EICRA = 1 << ISC01 | 0 << ISC00; // Trigger INT0 and INT1 on falling edge
99  EIMSK |= 1 << INT0; // Enable INT0 and INT1
100 
101  /* Timer 2 */
102 #if defined (OS_CONFIG_SIM) && OS_CONFIG_SIM == true
103 #if defined (__AVR_ATmega128__)
104  TCCR2 = (1 << CS20); // Enable Timer2 with Prescaler 1
105  TIMSK |= 1 << TOIE2; // Enable Overflow Interrupt (Timer2)
106 #else /* defined (__AVR_ATmega128__) */
107  TCCR2B = (1 << CS20); // Enable Timer2 with Prescaler 1
108  TIMSK2 |= 1 << TOIE2; // Enable Overflow Interrupt (Timer2)
109 #endif /* defined (__AVR_ATmega128__) */
110 #endif /* defined (OS_CONFIG_SIM) && OS_CONFIG_SIM == true */
111 #else /* defined (__AVR_ATmega32__) */
112 #error Unknown CPU defined!
113 #endif /* defined (__AVR_ATmega32__) */
114 
115  uint8_t t = 0;
116 
117  while (t < 6) {
118  uint8_t r = PORTB;
119  r ^= (1 << 7);
120  PORTB = r;
121  DELAY_MS(50);
122  t++;
123  }
124 }
125 
126 extern void ShutdownHook(StatusType error)
127 {
128  DDRB = 0xFF; // PB as output
129  PORTB = 0xFF; // keep all LEDs off
130 
131  for (uint8_t i = 0; i < 11; i++) {
132  PORTB ^= 0xFF;
133  DELAY_MS(1000);
134  }
135 }
136 
137 extern void PreTaskHook(void)
138 {
139  TaskType task;
140  GetTaskID(&task);
141  TaskStateType state = SUSPENDED;
142  GetTaskState(task, &state);
143 }
144 
145 extern void PostTaskHook(void)
146 {
147  TaskType task;
148  GetTaskID(&task);
149  TaskStateType state = SUSPENDED;
150  GetTaskState(task, &state);
151 }
152 
153 extern void ErrorHook(StatusType error)
154 {
155 
156 }
157 
158 ISR(INT0_vect)
159 {
160  assert(isISR && isCat2ISR);
161 
162  StatusType stat = TerminateTask();
163  assert(stat == E_OS_CALLLEVEL);
164 
165  stat = ChainTask(Task2);
166  assert(stat == E_OS_CALLLEVEL);
167 
168  stat = Schedule();
169  assert(stat == E_OS_CALLLEVEL);
170 
171  TaskType task = INVALID_TASK;
172  stat = GetTaskID(&task);
173  assert(stat == E_OK && task == Task1);
174 
175  isrFlag = true;
176 }
177 
178 ISR(TIMER2_OVF_vect)
179 {
180 
181 }
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
StartupHook
void StartupHook(void)
Definition: App.c:702
E_OS_RESOURCE
@ E_OS_RESOURCE
Definition: Types.h:46
E_OS_LIMIT
@ E_OS_LIMIT
Definition: Types.h:44
GetTaskState
#define GetTaskState
Definition: OS_API.h:83
assert.h
Assert macros and functions.
ChainTask
#define ChainTask
Definition: OS_API.h:79
TASK
TASK(Idle)
Definition: App.c:33
E_OK
@ E_OK
Definition: Types.h:40
E_OS_CALLLEVEL
@ E_OS_CALLLEVEL
Definition: Types.h:42
ISR
ISR(INT0_vect)
Definition: App.c:806
DELAY_MS
#define DELAY_MS(ms)
Definition: App.c:24
PreTaskHook
void PreTaskHook(void)
PreTask hook function.
Definition: App.c:768
isCat2ISR
volatile uint8_t isCat2ISR
Priority of current Cat 2 ISR (zero if not in Cat 2 ISR)
Definition: OCB.c:21
ActivateTask
#define ActivateTask
Definition: OS_API.h:78
isISR
volatile bool isISR
Is currently ISR context?
Definition: OCB.c:20
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.
GetTaskID
#define GetTaskID
Definition: OS_API.h:82
isrFlag
volatile bool isrFlag
Definition: App.c:27
ReleaseResource
#define ReleaseResource
Definition: OS_API.h:71
E_OS_ID
@ E_OS_ID
Definition: Types.h:43
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.
GetResource
#define GetResource
Definition: OS_API.h:70