1 /* -------------------------------- Arctic Core ------------------------------
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
6 * This source code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published by the
8 * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * -------------------------------- Arctic Core ------------------------------*/
21 //#define USE_LDEBUG_PRINTF // Uncomment this to turn debug statements on.
24 // How many errors to keep in error log.
25 #define ERROR_LOG_SIZE 20
29 * Just an example of a basic task.
35 LDEBUG_PRINTF("[%08u] bTask3 start\n", (unsigned)GetOsTick() );
38 Os_Arc_GetStackInfo(currTask,&si);
39 LDEBUG_PRINTF("bTask3: %u%% stack usage\n",
40 (unsigned)OS_STACK_USAGE(&si));
46 * An extended task is auto-started and is also triggered by an alarm
51 volatile float tryFloatingPoint = 0.0F;
55 LDEBUG_FPUTS("eTask1 start\n");
57 SetEvent(TASK_ID_eTask2,EVENT_MASK_Event1);
58 WaitEvent(EVENT_MASK_Event2);
59 ClearEvent(EVENT_MASK_Event2);
60 tryFloatingPoint += 1.0F;
62 Os_Arc_GetStackInfo(currTask,&si);
63 LDEBUG_PRINTF("eTask1: %u%% stack usage\n",
64 (unsigned)OS_STACK_USAGE(&si));
70 * An extended task that receives events from someone
71 * and activates task: bTask3.
74 LDEBUG_FPUTS("eTask2 start\n");
77 WaitEvent(EVENT_MASK_Event1);
78 ClearEvent(EVENT_MASK_Event1);
79 ActivateTask(TASK_ID_bTask3);
84 Os_Arc_GetStackInfo(currTask,&si);
85 LDEBUG_PRINTF("eTask2: %u%% stack usage\n",
86 (unsigned)OS_STACK_USAGE(&si));
93 * Functions that must be supplied by the example
102 ProtectionReturnType ProtectionHook( StatusType FatalError ) {
104 LDEBUG_FPUTS("## ProtectionHook\n");
108 void StartupHook( void ) {
109 LDEBUG_FPUTS("## StartupHook\n");
111 LDEBUG_PRINTF("Sys clock %u Hz\n",(unsigned)McuE_GetSystemClock());
114 void ShutdownHook( StatusType Error ) {
116 LDEBUG_FPUTS("## ShutdownHook\n");
125 OsServiceIdType serviceId;
129 void ErrorHook( StatusType Error ) {
132 static struct LogBad_s LogBad[ERROR_LOG_SIZE];
133 static uint8_t ErrorCount = 0;
138 OsServiceIdType service = OSErrorGetServiceId();
140 /* Grab the arguments to the functions
141 * This is the standard way, see 11.2 in OSEK spec
144 case OSServiceId_SetRelAlarm:
146 // Read the arguments to the faulty functions...
147 AlarmType alarm_id = OSError_SetRelAlarm_AlarmId;
148 TickType increment = OSError_SetRelAlarm_Increment;
149 TickType cycle = OSError_SetRelAlarm_Cycle;
154 // ... Handle this some way.
158 * The same pattern as above applies for all other OS functions.
159 * See Os.h for names and definitions.
166 LDEBUG_PRINTF("## ErrorHook err=%u\n",Error);
168 /* Log the errors in a buffer for later review */
169 LogBad[ErrorCount].param1 = os_error.param1;
170 LogBad[ErrorCount].param2 = os_error.param2;
171 LogBad[ErrorCount].param3 = os_error.param3;
172 LogBad[ErrorCount].serviceId = service;
173 LogBad[ErrorCount].taskId = task;
174 LogBad[ErrorCount].error = Error;
178 // Stall if buffer is full.
179 while(ErrorCount >= ERROR_LOG_SIZE) {};
182 void PreTaskHook( void ) {
185 // LDEBUG_PRINTF("## PreTaskHook, taskid=%u\n",task);
188 void PostTaskHook( void ) {
191 // LDEBUG_PRINTF("## PostTaskHook, taskid=%u\n",task);