source: sample/sample1.c

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 15.2 KB
 
1/*
2 *  TOPPERS/ASP Kernel
3 *      Toyohashi Open Platform for Embedded Real-Time Systems/
4 *      Advanced Standard Profile Kernel
5 *
6 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 *                              Toyohashi Univ. of Technology, JAPAN
8 *  Copyright (C) 2004-2012 by Embedded and Real-Time Systems Laboratory
9 *              Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 *  Ÿåµ­Ãøºîž¢ŒÔ€Ï¡€°Ê²Œ€Î(1)¡Á(4)€ÎŸò·ï€òËþ€¿€¹Ÿì¹ç€ËžÂ€ê¡€ËÜ¥œ¥Õ¥È¥Š¥§
12 *  ¥¢¡ÊËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò²þÊÑ€·€¿€â€Î€òŽÞ€à¡¥°Ê²ŒÆ±€ž¡Ë€ò»ÈÍÑ¡ŠÊ£Àœ¡Š²þ
13 *  ÊÑ¡ŠºÆÇÛÉۡʰʲŒ¡€ÍøÍрȞƀ֡ˀ¹€ë€³€È€ò̵œþ€ÇµöÂú€¹€ë¡¥
14 *  (1) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¥œ¡Œ¥¹¥³¡Œ¥É€Î·Á€ÇÍøÍÑ€¹€ëŸì¹ç€Ë€Ï¡€Ÿåµ­€ÎÃøºî
15 *      ž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äꀬ¡€€œ€Î€Þ€Þ€Î·Á€Ç¥œ¡Œ
16 *      ¥¹¥³¡Œ¥ÉÃæ€ËŽÞ€Þ€ì€Æ€€€ë€³€È¡¥
17 *  (2) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€¥é¥€¥Ö¥é¥ê·ÁŒ°€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
18 *      Íрǀ­€ë·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍÑ
19 *      ŒÔ¥Þ¥Ë¥å¥¢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃøºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­
20 *      €Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
21 *  (3) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€µ¡Žï€ËÁȀ߹þ€à€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
22 *      Íрǀ­€Ê€€·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€Œ¡€Î€€€º€ì€«€ÎŸò·ï€òËþ€¿€¹€³
23 *      €È¡¥
24 *    (a) ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍьԥޥ˥奢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃø
25 *        ºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
26 *    (b) ºÆÇÛÉۀηÁÂÖ€ò¡€ÊÌ€ËÄê€á€ëÊýË¡€Ë€è€Ã€Æ¡€TOPPERS¥×¥í¥ž¥§¥¯¥È€Ë
27 *        Êó¹ð€¹€ë€³€È¡¥
28 *  (4) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€ë€€€«€Ê€ë»
29 *      ³²€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€òÌÈÀÕ€¹€ë€³€È¡¥
30 *      €Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Î¥æ¡Œ¥¶€Þ€¿€Ï¥š¥ó¥É¥æ¡Œ¥¶€«€é€Î€€€«€Ê€ëÍý
31 *      ͳ€ËŽð€Å€¯ÀÁµá€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€ò
32 *      ÌÈÀÕ€¹€ë€³€È¡¥
33 *
34 *  ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥Ÿåµ­Ãøºîž¢ŒÔ€ª
35 *  €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ
36 *  €ËÂЀ¹€ëŬ¹çÀ­€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§
37 *  ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ
38 *  €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥
39 *
40 *  $Id$
41 */
42
43/*
44 *  ¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à(1)€ÎËÜÂÎ
45 *
46 *  ASP¥«¡Œ¥Í¥ë€ÎŽðËÜŪ€Êưºî€ò³Îǧ€¹€ë€¿€á€Î¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à¡¥
47 *
48 *  ¥×¥í¥°¥é¥à€Î³µÍ×:
49 *
50 *  ¥æ¡Œ¥¶¥€¥ó¥¿¥Õ¥§¡Œ¥¹€òŒõ€±»ý€Ä¥á¥€¥ó¥¿¥¹¥¯¡Ê¥¿¥¹¥¯ID: MAIN_TASK¡€Í¥
51 *  ÀèÅÙ: MAIN_PRIORITY¡Ë€È¡€3€Ä€ÎʹԌ¹Ԁµ€ì€ë¥¿¥¹¥¯¡Ê¥¿¥¹¥¯ID:
52 *  TASK1¡ÁTASK3¡€œéŽüÍ¥ÀèÅÙ: MID_PRIORITY¡Ë€Ç¹œÀ®€µ€ì€ë¡¥€Þ€¿¡€µ¯Æ°Œþ
53 *  Žü€¬2ÉÀΌþŽü¥Ï¥ó¥É¥é¡ÊŒþŽü¥Ï¥ó¥É¥éID: CYCHDR1¡Ë€òÍÑ€€€ë¡¥
54 *
55 *  ʹԌ¹Ԁµ€ì€ë¥¿¥¹¥¯€Ï¡€task_loop²ó¶õ¥ë¡Œ¥×€òŒÂ¹Ô€¹€ëÅـˡ€¥¿¥¹¥¯€¬
56 *  ŒÂ¹ÔÃæ€Ç€¢€ë€³€È€ò€¢€é€ï€¹¥á¥Ã¥»¡Œ¥ž€òÉœŒš€¹€ë¡¥¶õ¥ë¡Œ¥×€òŒÂ¹Ô€¹€ë
57 *  €Î€Ï¡€¶õ¥ë¡Œ¥×€Ê€·€Ç¥á¥Ã¥»¡Œ¥ž€òœÐÎÏ€¹€ë€È¡€Â¿Î̀Υá¥Ã¥»¡Œ¥ž€¬œÐÎÏ
58 *  €µ€ì¡€¥×¥í¥°¥é¥à€Îưºî€¬³Îǧ€·€º€é€¯€Ê€ë€¿€á€Ç€¢€ë¡¥€Þ€¿¡€Ä㮀ʥ·
59 *  ¥ê¥¢¥ë¥Ý¡Œ¥È€òÍÑ€€€Æ¥á¥Ã¥»¡Œ¥ž€òœÐÎÏ€¹€ëŸì¹ç€Ë¡€€¹€Ù€Æ€Î¥á¥Ã¥»¡Œ¥ž
60 *  €¬œÐÎπǀ­€ë€è€Š€Ë¡€¥á¥Ã¥»¡Œ¥ž€ÎÎÌ€òÀ©žÂ€¹€ë€È€€€ŠÍýͳ€â€¢€ë¡¥
61 *
62 *  ŒþŽü¥Ï¥ó¥É¥é€Ï¡€»°€Ä€ÎÍ¥ÀèÅÙ¡ÊHIGH_PRIORITY¡€MID_PRIORITY¡€
63 *  LOW_PRIORITY¡Ë€Î¥ì¥Ç¥£¥­¥å¡Œ€ò²óÅŸ€µ€»€ë¡¥¥×¥í¥°¥é¥à€Îµ¯Æ°ÄŸžå€Ï¡€
64 *  ŒþŽü¥Ï¥ó¥É¥é€ÏÄä»ßŸõÂրˀʀÀƀ€€ë¡¥
65 *
66 *  ¥á¥€¥ó¥¿¥¹¥¯€Ï¡€¥·¥ê¥¢¥ëI/O¥Ý¡Œ¥È€«€é€ÎÊž»úÆþÎÏ€ò¹Ô€€¡ÊÊž»úÆþÎÏ€ò
67 *  ÂԀÀƀ€€ëŽÖ€Ï¡€Ê¹Ԍ¹Ԁµ€ì€ë¥¿¥¹¥¯€¬ŒÂ¹Ô€µ€ì€Æ€€€ë¡Ë¡€ÆþÎÏ€µ€ì€¿
68 *  Êž»ú€ËÂбþ€·€¿œèÍý€òŒÂ¹Ô€¹€ë¡¥ÆþÎÏ€µ€ì€¿Êž»ú€ÈœèÍý€ÎŽØ·ž€ÏŒ¡€ÎÄ̀ꡥ
69 *  Control-C€Þ€¿€Ï'Q'€¬ÆþÎÏ€µ€ì€ë€È¡€¥×¥í¥°¥é¥à€òœªÎ»€¹€ë¡¥
70 *
71 *  '1' : ÂПݥ¿¥¹¥¯€òTASK1€ËÀڀꎹ€š€ë¡ÊœéŽüÀßÄê¡Ë¡¥
72 *  '2' : ÂПݥ¿¥¹¥¯€òTASK2€ËÀڀꎹ€š€ë¡¥
73 *  '3' : ÂПݥ¿¥¹¥¯€òTASK3€ËÀڀꎹ€š€ë¡¥
74 *  'a' : ÂПݥ¿¥¹¥¯€òact_tsk€Ë€è€êµ¯Æ°€¹€ë¡¥
75 *  'A' : ÂПݥ¿¥¹¥¯€ËÂЀ¹€ëµ¯Æ°Í×µá€òcan_act€Ë€è€ê¥­¥ã¥ó¥»¥ë€¹€ë¡¥
76 *  'e' : ÂПݥ¿¥¹¥¯€Ëext_tsk€òžÆ€ÓœÐ€µ€»¡€œªÎ»€µ€»€ë¡¥
77 *  't' : ÂПݥ¿¥¹¥¯€òter_tsk€Ë€è€ê¶¯À©œªÎ»€¹€ë¡¥
78 *  '>' : ÂПݥ¿¥¹¥¯€ÎÍ¥ÀèÅÙ€òHIGH_PRIORITY€Ë€¹€ë¡¥
79 *  '=' : ÂПݥ¿¥¹¥¯€ÎÍ¥ÀèÅÙ€òMID_PRIORITY€Ë€¹€ë¡¥
80 *  '<' : ÂПݥ¿¥¹¥¯€ÎÍ¥ÀèÅÙ€òLOW_PRIORITY€Ë€¹€ë¡¥
81 *  'G' : ÂПݥ¿¥¹¥¯€ÎÍ¥ÀèÅÙ€òget_pri€ÇÆÉ€ßœÐ€¹¡¥
82 *  's' : ÂПݥ¿¥¹¥¯€Ëslp_tsk€òžÆ€ÓœÐ€µ€»¡€µ¯Ÿ²ÂÔ€Á€Ë€µ€»€ë¡¥
83 *  'S' : ÂПݥ¿¥¹¥¯€Ëtslp_tsk(10ÉÃ)€òžÆ€ÓœÐ€µ€»¡€µ¯Ÿ²ÂÔ€Á€Ë€µ€»€ë¡¥
84 *  'w' : ÂПݥ¿¥¹¥¯€òwup_tsk€Ë€è€êµ¯Ÿ²€¹€ë¡¥
85 *  'W' : ÂПݥ¿¥¹¥¯€ËÂЀ¹€ëµ¯Ÿ²Í×µá€òcan_wup€Ë€è€ê¥­¥ã¥ó¥»¥ë€¹€ë¡¥
86 *  'l' : ÂПݥ¿¥¹¥¯€òrel_wai€Ë€è€ê¶¯À©Åª€ËÂÔ€Á²òœü€Ë€¹€ë¡¥
87 *  'u' : ÂПݥ¿¥¹¥¯€òsus_tsk€Ë€è€ê¶¯À©ÂÔ€ÁŸõÂրˀ¹€ë¡¥
88 *  'm' : ÂПݥ¿¥¹¥¯€Î¶¯À©ÂÔ€ÁŸõÂÖ€òrsm_tsk€Ë€è€ê²òœü€¹€ë¡¥
89 *  'd' : ÂПݥ¿¥¹¥¯€Ëdly_tsk(10ÉÃ)€òžÆ€ÓœÐ€µ€»¡€»þŽÖ·Ð²áÂÔ€Á€Ë€µ€»€ë¡¥
90 *  'x' : ÂПݥ¿¥¹¥¯€ËÎã³°¥Ñ¥¿¡Œ¥ó0x0001€ÎÎã³°œèÍý€òÍ׵္€ë¡¥
91 *  'X' : ÂПݥ¿¥¹¥¯€ËÎã³°¥Ñ¥¿¡Œ¥ó0x0002€ÎÎã³°œèÍý€òÍ׵္€ë¡¥
92 *  'y' : ÂПݥ¿¥¹¥¯€Ëdis_tex€òžÆ€ÓœÐ€µ€»¡€¥¿¥¹¥¯Îã³°€ò¶Ø»ß€¹€ë¡¥
93 *  'Y' : ÂПݥ¿¥¹¥¯€Ëena_tex€òžÆ€ÓœÐ€µ€»¡€¥¿¥¹¥¯Îã³°€òµö²Ä€¹€ë¡¥
94 *  'r' : 3€Ä€ÎÍ¥ÀèÅÙ¡ÊHIGH_PRIORITY¡€MID_PRIORITY¡€LOW_PRIORITY¡Ë€Î¥ì
95 *        ¥Ç¥£¥­¥å¡Œ€ò²óÅŸ€µ€»€ë¡¥
96 *  'c' : ŒþŽü¥Ï¥ó¥É¥é€òưºî³«»Ï€µ€»€ë¡¥
97 *  'C' : ŒþŽü¥Ï¥ó¥É¥é€òưºîÄä»ß€µ€»€ë¡¥
98 *  'b' : ¥¢¥é¡Œ¥à¥Ï¥ó¥É¥é€ò5ÉÞå€Ëµ¯Æ°€¹€ë€è€ŠÆ°ºî³«»Ï€µ€»€ë¡¥
99 *  'B' : ¥¢¥é¡Œ¥à¥Ï¥ó¥É¥é€òưºîÄä»ß€µ€»€ë¡¥
100 *  'z' : ÂПݥ¿¥¹¥¯€ËCPUÎã³°€òȯÀž€µ€»€ë¡Ê¥¿¥¹¥¯€òœªÎ»€µ€»€ë¡Ë¡¥
101 *  'Z' : ÂПݥ¿¥¹¥¯€ËCPU¥í¥Ã¥¯ŸõÂÖ€ÇCPUÎã³°€òȯÀž€µ€»€ë¡Ê¥×¥í¥°¥é¥à€ò
102 *        œªÎ»€¹€ë¡Ë¡¥
103 *  'V' : get_utm€ÇÀ­ÇœÉŸ²ÁÍÑ¥·¥¹¥Æ¥à»þ¹ï€ò2²óÆÉ€à¡¥
104 *  'v' : ȯ¹Ô€·€¿¥·¥¹¥Æ¥à¥³¡Œ¥ë€òÉœŒš€¹€ë¡Ê¥Ç¥Õ¥©¥ë¥È¡Ë¡¥
105 *  'q' : ȯ¹Ô€·€¿¥·¥¹¥Æ¥à¥³¡Œ¥ë€òÉœŒš€·€Ê€€¡¥
106 */
107
108#include <kernel.h>
109#include <t_syslog.h>
110#include <t_stdlib.h>
111#include "syssvc/serial.h"
112#include "syssvc/syslog.h"
113#include "kernel_cfg.h"
114#include "sample1.h"
115
116/*
117 *  ¥µ¡Œ¥Ó¥¹¥³¡Œ¥ë€Î¥š¥é¡Œ€Î¥í¥°œÐÎÏ
118 */
119Inline void
120svc_perror(const char *file, int_t line, const char *expr, ER ercd)
121{
122        if (ercd < 0) {
123                t_perror(LOG_ERROR, file, line, expr, ercd);
124        }
125}
126
127#define SVC_PERROR(expr)        svc_perror(__FILE__, __LINE__, #expr, (expr))
128
129/*
130 *  ʹԌ¹Ԁµ€ì€ë¥¿¥¹¥¯€Ø€Î¥á¥Ã¥»¡Œ¥žÎΰè
131 */
132char    message[3];
133
134/*
135 *  ¥ë¡Œ¥×²ó¿ô
136 */
137ulong_t task_loop;              /* ¥¿¥¹¥¯Æâ€Ç€Î¥ë¡Œ¥×²ó¿ô */
138ulong_t tex_loop;               /* Îã³°œèÍý¥ë¡Œ¥Á¥óÆâ€Ç€Î¥ë¡Œ¥×²ó¿ô */
139
140/*
141 *  ʹԌ¹Ԁµ€ì€ë¥¿¥¹¥¯
142 */
143void task(intptr_t exinf)
144{
145        volatile ulong_t        i;
146        int_t           n = 0;
147        int_t           tskno = (int_t) exinf;
148        const char      *graph[] = { "|", "  +", "    *" };
149        char            c;
150
151        SVC_PERROR(ena_tex());
152        while (true) {
153                syslog(LOG_NOTICE, "task%d is running (%03d).   %s",
154                                                                                tskno, ++n, graph[tskno-1]);
155                for (i = 0; i < task_loop; i++);
156                c = message[tskno-1];
157                message[tskno-1] = 0;
158                switch (c) {
159                case 'e':
160                        syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
161                        SVC_PERROR(ext_tsk());
162                        assert(0);
163                case 's':
164                        syslog(LOG_INFO, "#%d#slp_tsk()", tskno);
165                        SVC_PERROR(slp_tsk());
166                        break;
167                case 'S':
168                        syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno);
169                        SVC_PERROR(tslp_tsk(10000));
170                        break;
171                case 'd':
172                        syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno);
173                        SVC_PERROR(dly_tsk(10000));
174                        break;
175                case 'y':
176                        syslog(LOG_INFO, "#%d#dis_tex()", tskno);
177                        SVC_PERROR(dis_tex());
178                        break;
179                case 'Y':
180                        syslog(LOG_INFO, "#%d#ena_tex()", tskno);
181                        SVC_PERROR(ena_tex());
182                        break;
183#ifdef CPUEXC1
184                case 'z':
185                        syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
186                        RAISE_CPU_EXCEPTION;
187                        break;
188                case 'Z':
189                        SVC_PERROR(loc_cpu());
190                        syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
191                        RAISE_CPU_EXCEPTION;
192                        SVC_PERROR(unl_cpu());
193                        break;
194#endif /* CPUEXC1 */
195                default:
196                        break;
197                }
198        }
199}
200
201/*
202 *  ʹԀ·€ÆŒÂ¹Ô€µ€ì€ë¥¿¥¹¥¯ÍрΥ¿¥¹¥¯Îã³°œèÍý¥ë¡Œ¥Á¥ó
203 */
204void tex_routine(TEXPTN texptn, intptr_t exinf)
205{
206        volatile ulong_t        i;
207        int_t   tskno = (int_t) exinf;
208
209        syslog(LOG_NOTICE, "task%d receives exception 0x%04x.", tskno, texptn);
210        for (i = 0; i < tex_loop; i++);
211
212        if ((texptn & 0x8000U) != 0U) {
213                syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
214                SVC_PERROR(ext_tsk());
215                assert(0);
216        }
217}
218
219/*
220 *  CPUÎã³°¥Ï¥ó¥É¥é
221 */
222#ifdef CPUEXC1
223
224void
225cpuexc_handler(void *p_excinf)
226{
227        ID              tskid;
228
229        syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf);
230        if (sns_ctx() != true) {
231                syslog(LOG_WARNING,
232                                        "sns_ctx() is not true in CPU exception handler.");
233        }
234        if (sns_dpn() != true) {
235                syslog(LOG_WARNING,
236                                        "sns_dpn() is not true in CPU exception handler.");
237        }
238        syslog(LOG_INFO, "sns_loc = %d sns_dsp = %d sns_tex = %d",
239                                                                        sns_loc(), sns_dsp(), sns_tex());
240        syslog(LOG_INFO, "xsns_dpn = %d xsns_xpn = %d",
241                                                                        xsns_dpn(p_excinf), xsns_xpn(p_excinf));
242
243        if (xsns_xpn(p_excinf)) {
244                syslog(LOG_NOTICE, "Sample program ends with exception.");
245                SVC_PERROR(ext_ker());
246                assert(0);
247        }
248
249        SVC_PERROR(iget_tid(&tskid));
250        SVC_PERROR(iras_tex(tskid, 0x8000U));
251}
252
253#endif /* CPUEXC1 */
254
255/*
256 *  ŒþŽü¥Ï¥ó¥É¥é
257 *
258 *  HIGH_PRIORITY¡€MID_PRIORITY¡€LOW_PRIORITY €Î³ÆÍ¥ÀèÅـΥì¥Ç¥£¥­¥å¡Œ
259 *  €ò²óÅŸ€µ€»€ë¡¥
260 */
261void cyclic_handler(intptr_t exinf)
262{
263        SVC_PERROR(irot_rdq(HIGH_PRIORITY));
264        SVC_PERROR(irot_rdq(MID_PRIORITY));
265        SVC_PERROR(irot_rdq(LOW_PRIORITY));
266}
267
268/*
269 *  ¥¢¥é¡Œ¥à¥Ï¥ó¥É¥é
270 *
271 *  HIGH_PRIORITY¡€MID_PRIORITY¡€LOW_PRIORITY €Î³ÆÍ¥ÀèÅـΥì¥Ç¥£¥­¥å¡Œ
272 *  €ò²óÅŸ€µ€»€ë¡¥
273 */
274void alarm_handler(intptr_t exinf)
275{
276        SVC_PERROR(irot_rdq(HIGH_PRIORITY));
277        SVC_PERROR(irot_rdq(MID_PRIORITY));
278        SVC_PERROR(irot_rdq(LOW_PRIORITY));
279}
280
281/*
282 *  ¥á¥€¥ó¥¿¥¹¥¯
283 */
284void main_task(intptr_t exinf)
285{
286        char    c;
287        ID              tskid = TASK1;
288        int_t   tskno = 1;
289        ER_UINT ercd;
290        PRI             tskpri;
291#ifndef TASK_LOOP
292        volatile ulong_t        i;
293        SYSTIM  stime1, stime2;
294#endif /* TASK_LOOP */
295#ifdef TOPPERS_SUPPORT_GET_UTM
296        SYSUTM  utime1, utime2;
297#endif /* TOPPERS_SUPPORT_GET_UTM */
298
299        SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
300        syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
301
302        /*
303         *  ¥·¥ê¥¢¥ë¥Ý¡Œ¥È€ÎœéŽü²œ
304         *
305         *  ¥·¥¹¥Æ¥à¥í¥°¥¿¥¹¥¯€ÈƱ€ž¥·¥ê¥¢¥ë¥Ý¡Œ¥È€ò»È€ŠŸì¹ç€Ê€É¡€¥·¥ê¥¢¥ë
306         *  ¥Ý¡Œ¥È€¬¥ª¡Œ¥×¥óºÑ€ß€ÎŸì¹ç€Ë€Ï€³€³€ÇE_OBJ¥š¥é¡Œ€Ë€Ê€ë€¬¡€»ÙŸã€Ï
307         *  €Ê€€¡¥
308         */
309        ercd = serial_opn_por(TASK_PORTID);
310        if (ercd < 0 && MERCD(ercd) != E_OBJ) {
311                syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
312                                                                        itron_strerror(ercd), SERCD(ercd));
313        }
314        SVC_PERROR(serial_ctl_por(TASK_PORTID,
315                                                        (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
316
317        /*
318         *  ¥ë¡Œ¥×²ó¿ô€ÎÀßÄê
319         *
320         *  ʹԌ¹Ԁµ€ì€ë¥¿¥¹¥¯Æâ€Ç€Î¶õ¥ë¡Œ¥×€Î²ó¿ô¡Êtask_loop¡Ë€Ï¡€¶õ¥ë¡Œ
321         *  ¥×€ÎŒÂ¹Ô»þŽÖ€¬Ìó0.4ÉÀˀʀë€è€Š€ËÀßÄꀹ€ë¡¥€³€ÎÀßÄê€Î€¿€á€Ë¡€
322         *  LOOP_REF²ó€Î¶õ¥ë¡Œ¥×€ÎŒÂ¹Ô»þŽÖ€ò¡€€œ€ÎÁ°žå€Çget_tim€òžÆ€Ö€³€È€Ç
323         *  ¬Äꀷ¡€€œ€Î¬Äê·ë²Ì€«€é¶õ¥ë¡Œ¥×€ÎŒÂ¹Ô»þŽÖ€¬0.4ÉÀˀʀë¥ë¡Œ¥×²ó
324         *  ¿ô€òµá€á¡€task_loop€ËÀßÄꀹ€ë¡¥
325         *
326         *  LOOP_REF€Ï¡€¥Ç¥Õ¥©¥ë¥È€Ç€Ï1,000,000€ËÀßÄꀷ€Æ€€€ë€¬¡€ÁÛÄꀷ€¿€è
327         *  €êÃÙ€€¥×¥í¥»¥Ã¥µ€Ç€Ï¡€¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à€ÎŒÂ¹Ô³«»Ï€Ë»þŽÖ€¬€«€«
328         *  €ê€¹€®€ë€È€€€ŠÌäÂê€òÀž€ž€ë¡¥µÕ€ËÁÛÄꀷ€¿€è€ê®€€¥×¥í¥»¥Ã¥µ€Ç€Ï¡€
329         *  LOOP_REF²ó€Î¶õ¥ë¡Œ¥×€ÎŒÂ¹Ô»þŽÖ€¬Ã»€¯€Ê€ê¡€task_loop€ËÀßÄꀹ€ëÃÍ
330         *  €Îžíº¹€¬Â瀭€¯€Ê€ë€È€€€ŠÌäÂꀬ€¢€ë¡¥
331         *
332         *  €œ€³€Ç¡€€œ€Î€è€Š€Ê¥¿¡Œ¥²¥Ã¥È€Ç€Ï¡€target_test.h€Ç¡€LOOP_REF€òŬ
333         *  ÀÚ€ÊÃÍ€ËÄêµÁ€¹€ë€Î€¬ËŸ€Þ€·€€¡¥
334         *
335         *  €Þ€¿¡€task_loop€ÎÃÍ€òžÇÄꀷ€¿€€Ÿì¹ç€Ë€Ï¡€€œ€ÎÃÍ€òTASK_LOOP€Ë¥Þ
336         *  ¥¯¥íÄêµÁ€¹€ë¡¥TASK_LOOP€¬¥Þ¥¯¥íÄêµÁ€µ€ì€Æ€€€ëŸì¹ç¡€Ÿåµ­€Î¬Äê€ò
337         *  ¹Ô€ï€º€Ë¡€TASK_LOOP€ËÄêµÁ€µ€ì€¿ÃÍ€ò¶õ¥ë¡Œ¥×€Î²ó¿ô€È€¹€ë¡¥
338         *
339         * ¥¿¡Œ¥²¥Ã¥È€Ë€è€Ã€Æ€Ï¡€¶õ¥ë¡Œ¥×€ÎŒÂ¹Ô»þŽÖ€Î1²óÌ܀άÄê€Ç¡€ËÜÍè€è
340         * €ê€âĹ€á€Ë€Ê€ë€â€Î€¬€¢€ë¡¥€³€Î€è€Š€Ê¥¿¡Œ¥²¥Ã¥È€Ç€Ï¡€MEASURE_TWICE
341         * €ò¥Þ¥¯¥íÄêµÁ€¹€ë€³€È€Ç¡€1²óÌ܀άÄê·ë²Ì€òŒÎ€Æ€Æ¡€2²óÌ܀άÄê·ë²Ì
342         * €ò»È€Š¡¥
343         *
344         *  ¥¿¥¹¥¯Îã³°œèÍý¥ë¡Œ¥Á¥óÆâ€Ç€Î¶õ¥ë¡Œ¥×€Î²ó¿ô¡Êtex_loop¡Ë€Ï¡€
345         *  task_loop€Î4ʬ€Î1€ÎÃ͡ʶõ¥ë¡Œ¥×€ÎŒÂ¹Ô»þŽÖ€¬0.1ÉÀˀʀë¥ë¡Œ¥×²ó
346         *  ¿ô¡Ë€ËÀßÄꀹ€ë¡¥
347         */
348#ifdef TASK_LOOP
349        task_loop = TASK_LOOP;
350#else /* TASK_LOOP */
351
352#ifdef MEASURE_TWICE
353        task_loop = LOOP_REF;
354        SVC_PERROR(get_tim(&stime1));
355        for (i = 0; i < task_loop; i++);
356        SVC_PERROR(get_tim(&stime2));
357#endif /* MEASURE_TWICE */
358
359        task_loop = LOOP_REF;
360        SVC_PERROR(get_tim(&stime1));
361        for (i = 0; i < task_loop; i++);
362        SVC_PERROR(get_tim(&stime2));
363        task_loop = LOOP_REF * 400UL / (stime2 - stime1);
364
365#endif /* TASK_LOOP */
366        tex_loop = task_loop / 4;
367
368        /*
369         *  ¥¿¥¹¥¯€Îµ¯Æ°
370         */
371        SVC_PERROR(act_tsk(TASK1));
372        SVC_PERROR(act_tsk(TASK2));
373        SVC_PERROR(act_tsk(TASK3));
374
375        /*
376         *  ¥á¥€¥ó¥ë¡Œ¥×
377         */
378        do {
379                SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1));
380                switch (c) {
381                case 'e':
382                case 's':
383                case 'S':
384                case 'd':
385                case 'y':
386                case 'Y':
387                case 'z':
388                case 'Z':
389                        message[tskno-1] = c;
390                        break;
391                case '1':
392                        tskno = 1;
393                        tskid = TASK1;
394                        break;
395                case '2':
396                        tskno = 2;
397                        tskid = TASK2;
398                        break;
399                case '3':
400                        tskno = 3;
401                        tskid = TASK3;
402                        break;
403                case 'a':
404                        syslog(LOG_INFO, "#act_tsk(%d)", tskno);
405                        SVC_PERROR(act_tsk(tskid));
406                        break;
407                case 'A':
408                        syslog(LOG_INFO, "#can_act(%d)", tskno);
409                        SVC_PERROR(ercd = can_act(tskid));
410                        if (ercd >= 0) {
411                                syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd);
412                        }
413                        break;
414                case 't':
415                        syslog(LOG_INFO, "#ter_tsk(%d)", tskno);
416                        SVC_PERROR(ter_tsk(tskid));
417                        break;
418                case '>':
419                        syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno);
420                        SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY));
421                        break;
422                case '=':
423                        syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno);
424                        SVC_PERROR(chg_pri(tskid, MID_PRIORITY));
425                        break;
426                case '<':
427                        syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno);
428                        SVC_PERROR(chg_pri(tskid, LOW_PRIORITY));
429                        break;
430                case 'G':
431                        syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno);
432                        SVC_PERROR(ercd = get_pri(tskid, &tskpri));
433                        if (ercd >= 0) {
434                                syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri);
435                        }
436                        break;
437                case 'w':
438                        syslog(LOG_INFO, "#wup_tsk(%d)", tskno);
439                        SVC_PERROR(wup_tsk(tskid));
440                        break;
441                case 'W':
442                        syslog(LOG_INFO, "#can_wup(%d)", tskno);
443                        SVC_PERROR(ercd = can_wup(tskid));
444                        if (ercd >= 0) {
445                                syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd);
446                        }
447                        break;
448                case 'l':
449                        syslog(LOG_INFO, "#rel_wai(%d)", tskno);
450                        SVC_PERROR(rel_wai(tskid));
451                        break;
452                case 'u':
453                        syslog(LOG_INFO, "#sus_tsk(%d)", tskno);
454                        SVC_PERROR(sus_tsk(tskid));
455                        break;
456                case 'm':
457                        syslog(LOG_INFO, "#rsm_tsk(%d)", tskno);
458                        SVC_PERROR(rsm_tsk(tskid));
459                        break;
460                case 'x':
461                        syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno);
462                        SVC_PERROR(ras_tex(tskid, 0x0001U));
463                        break;
464                case 'X':
465                        syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno);
466                        SVC_PERROR(ras_tex(tskid, 0x0002U));
467                        break;
468                case 'r':
469                        syslog(LOG_INFO, "#rot_rdq(three priorities)");
470                        SVC_PERROR(rot_rdq(HIGH_PRIORITY));
471                        SVC_PERROR(rot_rdq(MID_PRIORITY));
472                        SVC_PERROR(rot_rdq(LOW_PRIORITY));
473                        break;
474                case 'c':
475                        syslog(LOG_INFO, "#sta_cyc(1)");
476                        SVC_PERROR(sta_cyc(CYCHDR1));
477                        break;
478                case 'C':
479                        syslog(LOG_INFO, "#stp_cyc(1)");
480                        SVC_PERROR(stp_cyc(CYCHDR1));
481                        break;
482                case 'b':
483                        syslog(LOG_INFO, "#sta_alm(1, 5000)");
484                        SVC_PERROR(sta_alm(ALMHDR1, 5000));
485                        break;
486                case 'B':
487                        syslog(LOG_INFO, "#stp_alm(1)");
488                        SVC_PERROR(stp_alm(ALMHDR1));
489                        break;
490
491                case 'V':
492#ifdef TOPPERS_SUPPORT_GET_UTM
493                        SVC_PERROR(get_utm(&utime1));
494                        SVC_PERROR(get_utm(&utime2));
495                        syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld",
496                                                                                (ulong_t) utime1, (ulong_t) utime2);
497#else /* TOPPERS_SUPPORT_GET_UTM */
498                        syslog(LOG_NOTICE, "get_utm is not supported.");
499#endif /* TOPPERS_SUPPORT_GET_UTM */
500                        break;
501
502                case 'v':
503                        SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO),
504                                                                                LOG_UPTO(LOG_EMERG)));
505                        break;
506                case 'q':
507                        SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE),
508                                                                                LOG_UPTO(LOG_EMERG)));
509                        break;
510
511#ifdef BIT_KERNEL
512                case ' ':
513                        SVC_PERROR(loc_cpu());
514                        {
515                                extern ER       bit_kernel(void);
516
517                                SVC_PERROR(ercd = bit_kernel());
518                                if (ercd >= 0) {
519                                        syslog(LOG_NOTICE, "bit_kernel passed.");
520                                }
521                        }
522                        SVC_PERROR(unl_cpu());
523                        break;
524#endif /* BIT_KERNEL */
525
526                default:
527                        break;
528                }
529        } while (c != '\003' && c != 'Q');
530
531        syslog(LOG_NOTICE, "Sample program ends.");
532        SVC_PERROR(ext_ker());
533        assert(0);
534}
詳しい使い方は TracBrowser を参照してください。