1 /* -------------------------------- Arctic Core ------------------------------
\r
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
\r
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
\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
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
14 * -------------------------------- Arctic Core ------------------------------*/
\r
18 * Created on: 28 feb 2011
\r
29 #define USE_LDEBUG_PRINTF
\r
32 // How many errors to keep in error log.
\r
33 #define ERROR_LOG_SIZE 20
\r
36 * Just an example of a basic task.
\r
39 void btask_3( void ) {
\r
42 LDEBUG_PRINTF("[%08u] btask_3 start\n", (unsigned)GetOsTick() );
\r
44 WdgM_UpdateAliveCounter (WDGM_ALIVE_BTASK3);
\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
54 void WDTask( void ) {
\r
56 /* Service the WD manager. */
\r
57 WdgM_MainFunction_AliveSupervision();
\r
58 WdgM_MainFunction_Trigger();
\r
64 * An extended task is auto-started and is also triggered by an alarm
\r
65 * that sets event 2.
\r
68 void etask_1( void ) {
\r
69 volatile float tryFloatingPoint = 0.0F;
\r
73 LDEBUG_PRINTF("etask_1 start\n");
\r
75 WdgM_UpdateAliveCounter (WDGM_ALIVE_ETASK1);
\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
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
91 * An extended task that receives events from someone
\r
92 * and activates task: btask_3.
\r
94 static Dio_LevelType level;
\r
96 void etask_2( void ) {
\r
98 LDEBUG_PRINTF("etask_2 start\n");
\r
100 WdgM_SetMode(WDGM_WIDE_MODE);
\r
103 WaitEvent(EVENT_MASK_EVENT_1);
\r
104 ClearEvent(EVENT_MASK_EVENT_1);
\r
105 ActivateTask(TASK_ID_btask_3);
\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
115 Dio_WriteChannel(DIO_CHANNEL_NAME_HeartBeatLED, level);
\r
118 static uint8 changeMode = 1;
\r
121 WdgM_SetMode(WDGM_NARROW_MODE);
\r
125 /* WdgM supervised task. */
\r
126 GetCounterValue(COUNTER_ID_WDFailureCounter, &wdCnt);
\r
129 IncrementCounter(COUNTER_ID_WDFailureCounter);
\r
130 WdgM_UpdateAliveCounter (WDGM_ALIVE_ETASK2);
\r
139 * Functions that must be supplied by the example
\r
142 void OsIdle( void ) {
\r
148 ProtectionReturnType ProtectionHook( StatusType FatalError ) {
\r
149 LDEBUG_PRINTF("## ProtectionHook\n");
\r
150 return PRO_KILLAPPL;
\r
153 void StartupHook( void ) {
\r
154 uint32_t sys_freq = McuE_GetSystemClock();
\r
156 LDEBUG_PRINTF("## StartupHook\n");
\r
158 LDEBUG_PRINTF("Sys clock %u Hz\n",(unsigned)sys_freq);
\r
161 void ShutdownHook( StatusType Error ) {
\r
162 LDEBUG_PRINTF("## ShutdownHook\n");
\r
171 OsServiceIdType serviceId;
\r
175 void ErrorHook( StatusType Error ) {
\r
178 static struct LogBad_s LogBad[ERROR_LOG_SIZE];
\r
179 static uint8_t ErrorCount = 0;
\r
184 OsServiceIdType service = OSErrorGetServiceId();
\r
186 /* Grab the arguments to the functions
\r
187 * This is the standard way, see 11.2 in OSEK spec
\r
190 case OSServiceId_SetRelAlarm:
\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
200 // ... Handle this some way.
\r
204 * The same pattern as above applies for all other OS functions.
\r
205 * See Os.h for names and definitions.
\r
212 LDEBUG_PRINTF("## ErrorHook err=%u\n",Error);
\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
224 // Stall if buffer is full.
\r
225 while(ErrorCount >= ERROR_LOG_SIZE) ;
\r
228 void PreTaskHook( void ) {
\r
231 // LDEBUG_PRINTF("## PreTaskHook, taskid=%u\n",task);
\r
234 void PostTaskHook( void ) {
\r
237 // LDEBUG_PRINTF("## PostTaskHook, taskid=%u\n",task);
\r