1 #ifndef BAMBOO_MULTICORE_TASK_PROFILE_H
2 #define BAMBOO_MULTICORE_TASK_PROFILE_H
6 // data structures for profile mode
8 #define TASKINFOLENGTH 3000
10 typedef struct task_info {
12 unsigned long long startTime;
13 unsigned long long endTime;
14 unsigned long long exitIndex;
15 struct Queue * newObjs;
18 TaskInfo * taskInfoArray[TASKINFOLENGTH];
20 bool taskInfoOverflow;
21 volatile int profilestatus[NUMCORESACTIVE]; // records status of each core
24 #ifdef PROFILE_INTERRUPT
25 #define INTERRUPTINFOLENGTH 50
26 typedef struct interrupt_info {
27 unsigned long long startTime;
28 unsigned long long endTime;
31 InterruptInfo * interruptInfoArray[INTERRUPTINFOLENGTH];
32 int interruptInfoIndex;
33 bool interruptInfoOverflow;
36 void outputProfileData();
37 void inittaskprofiledata();
39 INLINE static void setTaskExitIndex(int index) {
40 taskInfoArray[taskInfoIndex]->exitIndex = index;
43 INLINE static void addNewObjInfo(void * nobj) {
44 if(taskInfoArray[taskInfoIndex]->newObjs == NULL) {
45 taskInfoArray[taskInfoIndex]->newObjs = createQueue();
47 addNewItem(taskInfoArray[taskInfoIndex]->newObjs, nobj);
50 INLINE static void profileTaskStart(char * taskname) {
51 if(!taskInfoOverflow) {
52 TaskInfo* taskInfo = RUNMALLOC(sizeof(struct task_info));
53 taskInfoArray[taskInfoIndex] = taskInfo;
54 taskInfo->taskName = taskname;
55 taskInfo->startTime = BAMBOO_GET_EXE_TIME();
56 taskInfo->endTime = -1;
57 taskInfo->exitIndex = -1;
58 taskInfo->newObjs = NULL;
62 INLINE staitc void profileTaskEnd() {
63 if(!taskInfoOverflow) {
64 taskInfoArray[taskInfoIndex]->endTime = BAMBOO_GET_EXE_TIME();
66 if(taskInfoIndex == TASKINFOLENGTH) {
67 taskInfoOverflow = true;
72 #ifdef PROFILE_INTERRUPT
73 INLINE static void profileInterruptStart_I(void) {
74 if(!interruptInfoOverflow) {
75 InterruptInfo* intInfo = RUNMALLOC_I(sizeof(struct interrupt_info));
76 interruptInfoArray[interruptInfoIndex] = intInfo;
77 intInfo->startTime = BAMBOO_GET_EXE_TIME();
78 intInfo->endTime = -1;
82 INLINE static void profileInterruptEnd_I(void) {
83 if(!interruptInfoOverflow) {
84 interruptInfoArray[interruptInfoIndex]->endTime=BAMBOO_GET_EXE_TIME();
86 if(interruptInfoIndex == INTERRUPTINFOLENGTH) {
87 interruptInfoOverflow = true;
91 #endif // PROFILE_INTERRUPT
93 #define INIT_TASKPROFILE_DATA() inittaskprofiledata()
94 #define PROFILE_TASK_START(s) profileTaskStart(s)
95 #define PROFILE_TASK_END() profileTaskEnd()
96 #ifdef PROFILE_INTERRUPT
97 INLINE void profileInterruptStart_I(void);
98 INLINE void profileInterruptEnd_I(void);
100 #define PROFILE_INTERRUPT_START() profileInterruptStart_I()
101 #define PROFILE_INTERRUPT_END() profileInterruptEnd_I()
103 #define PROFILE_INTERRUPT_START()
104 #define PROFILE_INTERRUPT_END()
107 #define INIT_TASKPROFILE_DATA()
108 #define PROFILE_TASK_START(s)
109 #define PROFILE_TASK_END()
110 #define PROFILE_INTERRUPT_START()
111 #define PROFILE_INTERRUPT_END()
114 #define INIT_TASKPROFILE_DATA()
115 #define PROFILE_TASK_START(s)
116 #define PROFILE_TASK_END()
117 #define PROFILE_INTERRUPT_START()
118 #define PROFILE_INTERRUPT_END()
120 #endif // BAMBOO_MULTICORE_TASK_PROFILE_H