source: mypx/library/histogram.c @ 7

このファイルの 7 以降における最終更新内容7 で kominami が 2015/09/12 9:22:12 に更新しました

TOPPERS/ASP 1.9.1

ファイルサイズ: 4.9 KB
Rev 
[7]1/*
2 *  TOPPERS Software
3 *      Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 *  Copyright (C) 2006-2011 by Embedded and Real-Time Systems Laboratory
6 *              Graduate School of Information Science, Nagoya Univ., JAPAN
7 *
8 *  Ÿåµ­Ãøºîž¢ŒÔ€Ï¡€°Ê²Œ€Î(1)¡Á(4)€ÎŸò·ï€òËþ€¿€¹Ÿì¹ç€ËžÂ€ê¡€ËÜ¥œ¥Õ¥È¥Š¥§
9 *  ¥¢¡ÊËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò²þÊÑ€·€¿€â€Î€òŽÞ€à¡¥°Ê²ŒÆ±€ž¡Ë€ò»ÈÍÑ¡ŠÊ£Àœ¡Š²þ
10 *  ÊÑ¡ŠºÆÇÛÉۡʰʲŒ¡€ÍøÍрȞƀ֡ˀ¹€ë€³€È€ò̵œþ€ÇµöÂú€¹€ë¡¥
11 *  (1) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¥œ¡Œ¥¹¥³¡Œ¥É€Î·Á€ÇÍøÍÑ€¹€ëŸì¹ç€Ë€Ï¡€Ÿåµ­€ÎÃøºî
12 *      ž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äꀬ¡€€œ€Î€Þ€Þ€Î·Á€Ç¥œ¡Œ
13 *      ¥¹¥³¡Œ¥ÉÃæ€ËŽÞ€Þ€ì€Æ€€€ë€³€È¡¥
14 *  (2) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€¥é¥€¥Ö¥é¥ê·ÁŒ°€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
15 *      Íрǀ­€ë·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍÑ
16 *      ŒÔ¥Þ¥Ë¥å¥¢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃøºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­
17 *      €Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
18 *  (3) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€µ¡Žï€ËÁȀ߹þ€à€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
19 *      Íрǀ­€Ê€€·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€Œ¡€Î€€€º€ì€«€ÎŸò·ï€òËþ€¿€¹€³
20 *      €È¡¥
21 *    (a) ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍьԥޥ˥奢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃø
22 *        ºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
23 *    (b) ºÆÇÛÉۀηÁÂÖ€ò¡€ÊÌ€ËÄê€á€ëÊýË¡€Ë€è€Ã€Æ¡€TOPPERS¥×¥í¥ž¥§¥¯¥È€Ë
24 *        Êó¹ð€¹€ë€³€È¡¥
25 *  (4) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€ë€€€«€Ê€ë»
26 *      ³²€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€òÌÈÀÕ€¹€ë€³€È¡¥
27 *      €Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Î¥æ¡Œ¥¶€Þ€¿€Ï¥š¥ó¥É¥æ¡Œ¥¶€«€é€Î€€€«€Ê€ëÍý
28 *      ͳ€ËŽð€Å€¯ÀÁµá€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€ò
29 *      ÌÈÀÕ€¹€ë€³€È¡¥
30 *
31 *  ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥Ÿåµ­Ãøºîž¢ŒÔ€ª
32 *  €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ
33 *  €ËÂЀ¹€ëŬ¹çÀ­€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§
34 *  ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ
35 *  €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥
36 *
37 *  @(#) $Id$
38 */
39
40/*
41 *              ŒÂ¹Ô»þŽÖʬÉÛœž·×¥â¥ž¥å¡Œ¥ë
42 */
43
44#include <kernel.h>
45#include <t_syslog.h>
46#include <test_lib.h>
47#include <histogram.h>
48#include "target_test.h"
49
50/*
51 *  ŒÂ¹Ô»þŽÖʬÉ۷׬€Î¿ô
52 */
53#ifndef TNUM_HIST
54#define TNUM_HIST               10
55#endif /* TNUM_HIST */
56
57/*
58 *  ¥¿¡Œ¥²¥Ã¥È°ÍžÉô€ÇÀßÄêÊѹ¹€¹€ë€¿€á€Î¥Þ¥¯¥í
59 */
60#ifndef HISTTIM                                         /* ŒÂ¹Ô»þŽÖ·×¬Íрλþ¹ï€Î¥Ç¡Œ¥¿·¿ */
61#define HISTTIM                 SYSUTM
62#endif /* HISTTIM */
63
64#ifndef HIST_GET_TIM                            /* ŒÂ¹Ô»þŽÖ·×¬ÍрΞœºß»þ¹ï€ÎŒèÆÀ */
65#ifndef TOPPERS_SUPPORT_GET_UTM
66#error get_utm is not supported.
67#endif /* TOPPERS_SUPPORT_GET_UTM */
68#define HIST_GET_TIM(p_time)    ((void) get_utm(p_time))
69#endif /* HIST_GET_TIM */
70
71#ifndef HIST_CONV_TIM                           /* »þ¹ï€Îº¹€«€éŒÂ¹Ô»þŽÖ€Ø€ÎÊÑŽ¹ */
72#define HIST_CONV_TIM(time)             ((uint_t)(time))
73#endif /* HIST_CONV_TIM */
74
75#ifndef HIST_BM_HOOK                            /* ŒÂ¹Ô»þŽÖ·×¬ğÁ°€Ë¹Ô€Š€Ù€­œèÍý */
76#define HIST_BM_HOOK()                  ((void) 0)
77#endif
78
79/*
80 *  ŒÂ¹Ô»þŽÖʬÉ۷׬ŽÉÍý¥Ö¥í¥Ã¥¯
81 */
82typedef struct histogram_control_block {
83        HISTTIM         begin_time;                     /* ·×¬³«»Ï»þ¹ï */
84        uint_t          maxval;                         /* ʬÉÛ€òµ­Ï¿€¹€ëºÇÂç»þŽÖ */
85        uint_t          *histarea;                      /* ʬÉÛ€òµ­Ï¿€¹€ë¥á¥â¥êÎΰè */
86        uint_t          over;                           /* ºÇÂç»þŽÖ€òĶ€š€¿ÅÙ¿ô */
87        uint_t          under;                          /* »þŽÖ€ÎµÕÅŸ€¬µ¿€ï€ì€ëÅÙ¿ô */
88} HISTCB;
89
90/*
91 *  ŒÂ¹Ô»þŽÖʬÉ۷׬ŽÉÍý¥Ö¥í¥Ã¥¯€Î¥š¥ê¥¢
92 */
93static HISTCB   histcb_table[TNUM_HIST];
94
95/*
96 *  ŒÂ¹Ô»þŽÖʬÉ۷׬ID€ÎºÇŸ®Ã̀ȺÇÂçÃÍ
97 */
98#define TMIN_HISTID             1
99#define TMAX_HISTID             (TMIN_HISTID + TNUM_HIST - 1)
100
101/*
102 *  ŒÂ¹Ô»þŽÖʬÉ۷׬€ÎœéŽü²œ
103 */
104void
105init_hist(ID histid, uint_t maxval, uint_t histarea[])
106{
107        HISTCB  *p_histcb;
108        uint_t  i;
109
110        assert(TMIN_HISTID <= histid && histid <= TMAX_HISTID);
111        p_histcb = &(histcb_table[histid - TMIN_HISTID]);
112
113        for (i = 0; i <= maxval; i++) {
114                histarea[i] = 0U;
115        }
116        p_histcb->maxval = maxval;
117        p_histcb->histarea = histarea;
118        p_histcb->over = 0U;
119        p_histcb->under = 0U;
120}
121
122/*
123 *  ŒÂ¹Ô»þŽÖ·×¬€Î³«»Ï
124 */
125void
126begin_measure(ID histid)
127{
128        HISTCB  *p_histcb;
129
130        assert(TMIN_HISTID <= histid && histid <= TMAX_HISTID);
131        p_histcb = &(histcb_table[histid - TMIN_HISTID]);
132
133        HIST_BM_HOOK();
134        HIST_GET_TIM(&(p_histcb->begin_time));
135}
136
137/*
138 *  ŒÂ¹Ô»þŽÖ·×¬€ÎœªÎ»
139 */
140void
141end_measure(ID histid)
142{
143        HISTCB  *p_histcb;
144        HISTTIM end_time;
145        uint_t  val;
146
147        HIST_GET_TIM(&end_time);
148
149        assert(TMIN_HISTID <= histid && histid <= TMAX_HISTID);
150        p_histcb = &(histcb_table[histid - TMIN_HISTID]);
151
152        val = HIST_CONV_TIM(end_time - p_histcb->begin_time);
153        if (val <= p_histcb->maxval) {
154                p_histcb->histarea[val]++;
155        }
156        else if (val <= ((uint_t) INT_MAX)) {
157                p_histcb->over++;
158        }
159        else {
160                p_histcb->under++;
161        }
162}
163
164/*
165 *  ŒÂ¹Ô»þŽÖʬÉ۷׬€ÎÉœŒš
166 */
167void
168print_hist(ID histid)
169{
170        HISTCB  *p_histcb;
171        uint_t  i;
172
173        assert(TMIN_HISTID <= histid && histid <= TMAX_HISTID);
174        p_histcb = &(histcb_table[histid - TMIN_HISTID]);
175
176        for (i = 0; i <= p_histcb->maxval; i++) {
177                if (p_histcb->histarea[i] > 0) {
178                        syslog_2(LOG_NOTICE, "%d : %d", i, p_histcb->histarea[i]);
179                        syslog_flush();
180                }
181        }
182        if (p_histcb->over > 0) {
183                syslog_2(LOG_NOTICE, "> %d : %d", p_histcb->maxval, p_histcb->over);
184        }
185        if (p_histcb->under > 0) {
186                syslog_1(LOG_NOTICE, "> INT_MAX : %d", p_histcb->under);
187        }
188        syslog_flush();
189}
詳しい使い方は TracBrowser を参照してください。