/******************************************************************************* * FreeRTOS+Trace v2.2.3 Recorder Library * Percepio AB, www.percepio.se * * trcKernel.h * * Functions used by trcHooks.h, for the FreeRTOS kernel integration. * * Terms of Use * This software is copyright Percepio AB. The recorder library is free for * use together with Percepio products. You may distribute the recorder library * in its original form, including modifications in trcPort.c and trcPort.h * given that these modification are clearly marked as your own modifications * and documented in the initial comment section of these source files. * This software is the intellectual property of Percepio AB and may not be * sold or in other ways commercially redistributed without explicit written * permission by Percepio AB. * * Disclaimer * The trace tool and recorder library is being delivered to you AS IS and * Percepio AB makes no warranty as to its use or performance. Percepio AB does * not and cannot warrant the performance or results you may obtain by using the * software or documentation. Percepio AB make no warranties, express or * implied, as to noninfringement of third party rights, merchantability, or * fitness for any particular purpose. In no event will Percepio AB, its * technology partners, or distributors be liable to you for any consequential, * incidental or special damages, including any lost profits or lost savings, * even if a representative of Percepio AB has been advised of the possibility * of such damages, or for any claim by any third party. Some jurisdictions do * not allow the exclusion or limitation of incidental, consequential or special * damages, or the exclusion of implied warranties or limitations on how long an * implied warranty may last, so the above limitations may not apply to you. * * FreeRTOS+Trace is available as Free Edition and in two premium editions. * You may use the premium features during 30 days for evaluation. * Download FreeRTOS+Trace at http://www.percepio.se/index.php?page=downloads * * Copyright Percepio AB, 2012. * www.percepio.se ******************************************************************************/ #ifndef TRCKERNEL_H #define TRCKERNEL_H #include "trcTypes.h" #if (configUSE_TRACE_FACILITY == 1) #include "trcBase.h" /* Internal functions */ void vTraceStoreTaskswitch(void); void vTraceStoreKernelCall(uint32_t eventcode, uint32_t byteParam); void vTraceStoreKernelCallWithNumericParamOnly(uint32_t evtcode, uint16_t param); void vTraceStoreKernelCallWithParam(uint32_t evtcode, uint32_t objectNumber, uint8_t param); void vTraceSetTaskInstanceFinished(objectHandleType handle); void vTraceSetPriorityProperty(uint8_t objectclass, uint8_t id, uint8_t value); uint8_t uiTraceGetPriorityProperty(uint8_t objectclass, uint8_t id); void vTraceSetObjectState(uint8_t objectclass, uint8_t id, uint8_t value); uint8_t uiTraceGetObjectState(uint8_t objectclass, uint8_t id); #if (INCLUDE_OBJECT_DELETE == 1) void vTraceStoreObjectNameOnCloseEvent(objectHandleType handle, traceObjectClass objectclass); void vTraceStoreObjectPropertiesOnCloseEvent(objectHandleType handle, traceObjectClass objectclass); #endif /* Internal constants for task state */ #define TASK_STATE_INSTANCE_NOT_ACTIVE 0 #define TASK_STATE_INSTANCE_ACTIVE 1 #define TASK_STATE_INSTANCE_MARKED_FINISHED 2 /* This defines the mapping between FreeRTOS queue types and our internal class IDs */ extern traceObjectClass TraceObjectClassTable[5]; /******************************************************************************* * The event codes - should match the offline config file. * * Some sections below are encoded to allow for constructions like: * * vTraceStoreKernelCall(EVENTGROUP_CREATE + objectclass, ... * * The object class ID is given by the three LSB bits, in such cases. Since each * object class has a separate object property table, the class ID is needed to * know what section in the object table to use for getting an object name from * an object handle. ******************************************************************************/ #define NULL_EVENT (0x00) /* Ignored in the analysis*/ #define RECORDING_START (0x01) /* Not yet used */ #define RECORDING_STOP (0x02) /* Not yet used */ /******************************************************************************* * EVENTGROUP_TS * * Events for storing task-switches and interrupts. The RESUME events are * generated if the task/interrupt is already marked active. ******************************************************************************/ #define EVENTGROUP_TS (0x04) #define TS_ISR_BEGIN (EVENTGROUP_TS + 0) /* 4 */ #define TS_ISR_RESUME (EVENTGROUP_TS + 1) /* 5 */ #define TS_TASK_BEGIN (EVENTGROUP_TS + 2) /* 6 */ #define TS_TASK_RESUME (EVENTGROUP_TS + 3) /* 7 */ /******************************************************************************* * EVENTGROUP_OBJCLOSE_NAME * * About Close Events * When an object is evicted from the object property table (object close), two * internal events are stored (EVENTGROUP_OBJCLOSE_NAME and * EVENTGROUP_OBJCLOSE_PROP), containg the handle-name mapping and object * properties valid up to this point. ******************************************************************************/ #define EVENTGROUP_OBJCLOSE_NAME (0x08) /******************************************************************************* * EVENTGROUP_OBJCLOSE_PROP * * The internal event carrying properties of deleted objects * The handle and object class of the closed object is not stored in this event, * but is assumed to be the same as in the preceeding CLOSE event. Thus, these * two events must be generated from within a critical section. * When queues are closed, arg1 is the "state" property (i.e., number of * buffered messages/signals). * When actors are closed, arg1 is priority, arg2 is handle of the "instance * finish" event, and arg3 is event code of the "instance finish" event. * In this case, the lower three bits is the object class of the instance finish * handle. The lower three bits are not used (always zero) when queues are * closed since the queue type is given in the previous OBJCLOSE_NAME event. ******************************************************************************/ #define EVENTGROUP_OBJCLOSE_PROP (EVENTGROUP_OBJCLOSE_NAME + 8) /*0x10*/ /******************************************************************************* * EVENTGROUP_CREATE * * The events in this group are used to log Kernel object creations. * The lower three bits in the event code gives the object class, i.e., type of * create operation (task, queue, semaphore, etc). ******************************************************************************/ #define EVENTGROUP_CREATE (EVENTGROUP_OBJCLOSE_PROP + 8) /*0x18*/ /******************************************************************************* * EVENTGROUP_SEND * * The events in this group are used to log Send/Give events on queues, * semaphores and mutexeds The lower three bits in the event code gives the * object class, i.e., what type of object that is operated on (queue, semaphore * or mutex). ******************************************************************************/ #define EVENTGROUP_SEND (EVENTGROUP_CREATE + 8) /*0x20*/ /******************************************************************************* * EVENTGROUP_RECEIVE * * The events in this group are used to log Receive/Take events on queues, * semaphores and mutexes. The lower three bits in the event code gives the * object class, i.e., what type of object that is operated on (queue, semaphore * or mutex). ******************************************************************************/ #define EVENTGROUP_RECEIVE (EVENTGROUP_SEND + 8) /*0x28*/ /* Send/Give operations, from ISR */ #define EVENTGROUP_SEND_FROM_ISR (EVENTGROUP_RECEIVE + 8) /*0x30*/ /* Receive/Take operations, from ISR */ #define EVENTGROUP_RECEIVE_FROM_ISR (EVENTGROUP_SEND_FROM_ISR + 8) /*0x38*/ /* "Failed" event type versions of above (timeout, failed allocation, etc) */ #define EVENTGROUP_FAILED_KSE (EVENTGROUP_RECEIVE_FROM_ISR + 8) /*0x40*/ /* Failed create calls - memory allocation failed */ #define EVENTGROUP_FAILED_CREATE (EVENTGROUP_FAILED_KSE) /*0x40*/ /* Failed send/give - timeout! */ #define EVENTGROUP_FAILED_SEND (EVENTGROUP_FAILED_CREATE + 8) /*0x48*/ /* Failed receive/take - timeout! */ #define EVENTGROUP_FAILED_RECEIVE (EVENTGROUP_FAILED_SEND + 8) /*0x50*/ /* Failed non-blocking send/give - queue full */ #define EVENTGROUP_FAILED_SEND_FROM_ISR (EVENTGROUP_FAILED_RECEIVE + 8) /*0x58*/ /* Failed non-blocking receive/take - queue empty */ #define EVENTGROUP_FAILED_RECEIVE_FROM_ISR \ (EVENTGROUP_FAILED_SEND_FROM_ISR + 8) /*0x60*/ /* Events when blocking on receive/take */ #define EVENTGROUP_BLOCK_ON_RECEIVE \ (EVENTGROUP_FAILED_RECEIVE_FROM_ISR + 8) /*0x68*/ /* Events when blocking on send/give */ #define EVENTGROUP_BLOCK_ON_SEND (EVENTGROUP_BLOCK_ON_RECEIVE + 8) /*0x70*/ /* Events on queue peek (receive) */ #define EVENTGROUP_PEEK (EVENTGROUP_BLOCK_ON_SEND + 8) /*0x78*/ /* Events on object delete (vTaskDelete or vQueueDelete) */ #define EVENTGROUP_DELETE (EVENTGROUP_PEEK + 8) /*0x80*/ /* Other events - object class is implied: TASK */ #define EVENTGROUP_OTHERS (EVENTGROUP_DELETE + 8) /*0x88*/ #define TASK_DELAY_UNTIL (EVENTGROUP_OTHERS + 0) #define TASK_DELAY (EVENTGROUP_OTHERS + 1) #define TASK_SUSPEND (EVENTGROUP_OTHERS + 2) #define TASK_RESUME (EVENTGROUP_OTHERS + 3) #define TASK_RESUME_FROM_ISR (EVENTGROUP_OTHERS + 4) #define TASK_PRIORITY_SET (EVENTGROUP_OTHERS + 5) #define TASK_PRIORITY_INHERIT (EVENTGROUP_OTHERS + 6) #define TASK_PRIORITY_DISINHERIT (EVENTGROUP_OTHERS + 7) /* Not yet used */ #define EVENTGROUP_FTRACE_PLACEHOLDER (EVENTGROUP_OTHERS + 8) /*0x90*/ /* User events */ #define EVENTGROUP_USEREVENT (EVENTGROUP_FTRACE_PLACEHOLDER + 8) /*0x98*/ #define USER_EVENT (EVENTGROUP_USEREVENT + 0) /* Allow for 0-15 arguments (the number of args is added to event code) */ #define USER_EVENT_LAST (EVENTGROUP_USEREVENT + 15) /****************************************************************************** * XTS Event - eXtended TimeStamp events * The timestamps used in the recorder are "differential timestamps" (DTS), i.e. * the time since the last stored event. The DTS fields are either 1 or 2 bytes * in the other events, depending on the bytes available in the event struct. * If the time since the last event (the DTS) is larger than allowed for by * the DTS field of the current event, an XTS event is inserted immidiatly * before the original event. The XTS event contains up to 3 additional bytes * of the DTS value - the higher bytes of the true DTS value. The lower 1-2 * bytes are stored in the normal DTS field. * There are two types of XTS events, XTS8 and XTS16. An XTS8 event is stored * when there is only room for 1 byte (8 bit) DTS data in the original event, * which means a limit of 0xFF (255). The XTS16 is used when the original event * has a 16 bit DTS field and thereby can handle values up to 0xFFFF (65535). * * Using a very high frequency time base can result in many XTS events. * Preferably, the time between two OS ticks should fit in 16 bits, i.e., * at most 65535. If your time base has a higher frequency, you can define * the TRACE ******************************************************************************/ #define EVENTGROUP_SYS (EVENTGROUP_USEREVENT + 16) /*0xA8*/ #define XTS8 (EVENTGROUP_SYS + 0) /*0xA8*/ #define XTS16 (EVENTGROUP_SYS + 1) /*0xA9*/ #define EVENT_BEING_WRITTEN (EVENTGROUP_SYS + 2) /*0xAA*/ #define RESERVED_DUMMY_CODE (EVENTGROUP_SYS + 3) /*0xAB*/ #endif #endif