]> rtime.felk.cvut.cz Git - arc.git/blob - examples/wdg_node/wdgm_node.c
Cleanup of some drivers. Re-generated examples for mpc551xsim
[arc.git] / examples / wdg_node / wdgm_node.c
1 /* -------------------------------- Arctic Core ------------------------------\r
2  * Arctic Core - the open source AUTOSAR platform http://arccore.com\r
3  *\r
4  * Copyright (C) 2009  ArcCore AB <contact@arccore.com>\r
5  *\r
6  * This source code is free software; you can redistribute it and/or modify it\r
7  * under the terms of the GNU General Public License version 2 as published by the\r
8  * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.\r
9  *\r
10  * This program is distributed in the hope that it will be useful, but\r
11  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
12  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r
13  * for more details.\r
14  * -------------------------------- Arctic Core ------------------------------*/\r
15 /*\r
16  * wdgm_node.c\r
17  *\r
18  *  Created on: 28 feb 2011\r
19  *      Author: Fredrik\r
20  */\r
21 \r
22 #include "Os.h"\r
23 #include "Mcu.h"\r
24 #include "arc.h"\r
25 #include "WdgM.h"\r
26 #include "Dio.h"\r
27 #include "Gpt.h"\r
28 \r
29 #define USE_LDEBUG_PRINTF\r
30 #include "debug.h"\r
31 \r
32 // How many errors to keep in error log.\r
33 #define ERROR_LOG_SIZE 20\r
34 \r
35 /**\r
36  * Just an example of a basic task.\r
37  */\r
38 \r
39 void btask_3( void ) {\r
40         StackInfoType si;\r
41         TaskType currTask;\r
42         LDEBUG_PRINTF("[%08u] btask_3 start\n", (unsigned)GetOsTick() );\r
43 \r
44         WdgM_UpdateAliveCounter (WDGM_ALIVE_BTASK3);\r
45 \r
46         GetTaskID(&currTask);\r
47         Os_Arc_GetStackInfo(currTask,&si);\r
48         LDEBUG_PRINTF("btask_3: Stack usage %u%%\n",\r
49                         (unsigned)OS_STACK_USAGE(&si));\r
50 \r
51         TerminateTask();\r
52 }\r
53 \r
54 void WDTask( void ) {\r
55 \r
56         /* Service the WD manager. */\r
57         WdgM_MainFunction_AliveSupervision();\r
58         WdgM_MainFunction_Trigger();\r
59 \r
60         TerminateTask();\r
61 }\r
62 \r
63 /**\r
64  * An extended task is auto-started and is also triggered by an alarm\r
65  * that sets event 2.\r
66  */\r
67 \r
68 void etask_1( void ) {\r
69         volatile float tryFloatingPoint = 0.0F;\r
70         StackInfoType si;\r
71         TaskType currTask;\r
72 \r
73         LDEBUG_PRINTF("etask_1 start\n");\r
74         for(;;) {\r
75                 WdgM_UpdateAliveCounter (WDGM_ALIVE_ETASK1);\r
76 \r
77                 SetEvent(TASK_ID_etask_2,EVENT_MASK_EVENT_1);\r
78                 WaitEvent(EVENT_MASK_EVENT_2);\r
79                 ClearEvent(EVENT_MASK_EVENT_2);\r
80 \r
81                 tryFloatingPoint += 1.0F;\r
82                 GetTaskID(&currTask);\r
83                 Os_Arc_GetStackInfo(currTask,&si);\r
84                 LDEBUG_PRINTF("etask_1: Stack usage %u%% \n",\r
85                                 (unsigned)OS_STACK_USAGE(&si));\r
86 \r
87         }\r
88 }\r
89 \r
90 /**\r
91  * An extended task that receives events from someone\r
92  * and activates task: btask_3.\r
93  */\r
94 static Dio_LevelType level;\r
95 \r
96 void etask_2( void ) {\r
97     TickType wdCnt;\r
98         LDEBUG_PRINTF("etask_2 start\n");\r
99 \r
100         WdgM_SetMode(WDGM_WIDE_MODE);\r
101 \r
102         for(;;) {\r
103                 WaitEvent(EVENT_MASK_EVENT_1);\r
104                 ClearEvent(EVENT_MASK_EVENT_1);\r
105                 ActivateTask(TASK_ID_btask_3);\r
106                 {\r
107                         StackInfoType si;\r
108                         TaskType currTask;\r
109                         GetTaskID(&currTask);\r
110                         Os_Arc_GetStackInfo(currTask,&si);\r
111                         LDEBUG_PRINTF("etask_1: Stack usage %u%% \n",\r
112                                         (unsigned)OS_STACK_USAGE(&si));\r
113 \r
114                     level ^= 1;\r
115                         Dio_WriteChannel(DIO_CHANNEL_NAME_HeartBeatLED, level);\r
116 \r
117                         {\r
118                                 static uint8 changeMode = 1;\r
119                                 if (changeMode)\r
120                                 {\r
121                                         WdgM_SetMode(WDGM_NARROW_MODE);\r
122                                         changeMode = 0;\r
123                                 }\r
124                         }\r
125                         /* WdgM supervised task. */\r
126                         GetCounterValue(COUNTER_ID_WDFailureCounter, &wdCnt);\r
127                         if (wdCnt < 75)\r
128                         {\r
129                             IncrementCounter(COUNTER_ID_WDFailureCounter);\r
130                                 WdgM_UpdateAliveCounter (WDGM_ALIVE_ETASK2);\r
131                         }\r
132                 }\r
133         }\r
134 }\r
135 \r
136 \r
137 \r
138 /*\r
139  * Functions that must be supplied by the example\r
140  */\r
141 \r
142 void OsIdle( void ) {\r
143         for(;;) ;\r
144 }\r
145 \r
146 \r
147 /* Global hooks */\r
148 ProtectionReturnType ProtectionHook( StatusType FatalError ) {\r
149         LDEBUG_PRINTF("## ProtectionHook\n");\r
150         return PRO_KILLAPPL;\r
151 }\r
152 \r
153 void StartupHook( void ) {\r
154         uint32_t sys_freq = McuE_GetSystemClock();\r
155 \r
156         LDEBUG_PRINTF("## StartupHook\n");\r
157 \r
158         LDEBUG_PRINTF("Sys clock %u Hz\n",(unsigned)sys_freq);\r
159 }\r
160 \r
161 void ShutdownHook( StatusType Error ) {\r
162         LDEBUG_PRINTF("## ShutdownHook\n");\r
163         while(1) ;\r
164 }\r
165 \r
166 struct LogBad_s {\r
167         uint32_t param1;\r
168         uint32_t param2;\r
169         uint32_t param3;\r
170         TaskType taskId;\r
171         OsServiceIdType serviceId;\r
172         StatusType error;\r
173 };\r
174 \r
175 void ErrorHook( StatusType Error ) {\r
176 \r
177         TaskType task;\r
178         static struct LogBad_s LogBad[ERROR_LOG_SIZE];\r
179         static uint8_t ErrorCount = 0;\r
180 \r
181         GetTaskID(&task);\r
182 \r
183 \r
184         OsServiceIdType service = OSErrorGetServiceId();\r
185 \r
186         /* Grab the arguments to the functions\r
187          * This is the standard way, see 11.2 in OSEK spec\r
188          */\r
189         switch(service) {\r
190         case OSServiceId_SetRelAlarm:\r
191         {\r
192                 // Read the arguments to the faulty functions...\r
193                 AlarmType alarm_id = OSError_SetRelAlarm_AlarmId;\r
194                 TickType increment = OSError_SetRelAlarm_Increment;\r
195                 TickType cycle = OSError_SetRelAlarm_Cycle;\r
196                 (void)alarm_id;\r
197                 (void)increment;\r
198                 (void)cycle;\r
199 \r
200                 // ... Handle this some way.\r
201                 break;\r
202         }\r
203         /*\r
204          * The same pattern as above applies for all other OS functions.\r
205          * See Os.h for names and definitions.\r
206          */\r
207 \r
208         default:\r
209                 break;\r
210         }\r
211 \r
212         LDEBUG_PRINTF("## ErrorHook err=%u\n",Error);\r
213 \r
214         /* Log the errors in a buffer for later review */\r
215         LogBad[ErrorCount].param1 = os_error.param1;\r
216         LogBad[ErrorCount].param2 = os_error.param2;\r
217         LogBad[ErrorCount].param3 = os_error.param3;\r
218         LogBad[ErrorCount].serviceId = service;\r
219         LogBad[ErrorCount].taskId = task;\r
220         LogBad[ErrorCount].error = Error;\r
221 \r
222         ErrorCount++;\r
223 \r
224         // Stall if buffer is full.\r
225         while(ErrorCount >= ERROR_LOG_SIZE) ;\r
226 }\r
227 \r
228 void PreTaskHook( void ) {\r
229         TaskType task;\r
230         GetTaskID(&task);\r
231 //      LDEBUG_PRINTF("## PreTaskHook, taskid=%u\n",task);\r
232 }\r
233 \r
234 void PostTaskHook( void ) {\r
235         TaskType task;\r
236         GetTaskID(&task);\r
237 //      LDEBUG_PRINTF("## PostTaskHook, taskid=%u\n",task);\r
238 }\r