source: extension/dcre/sample/sample1.c @ 7

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 15.9 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 *  '@' : ¥¿¥¹¥¯3€òacre_tsk€Ë€è€êÀžÀ®€·¡€def_tex€Ë€è€ê¥¿¥¹¥¯Îã³°œèÍý
104 *        ¥ë¡Œ¥Á¥ó€òÀßÄꀹ€ë¡¥
105 *  '!' : ÂПݥ¿¥¹¥¯€òdel_tsk€Ë€è€êºïœü€¹€ë¡¥
106 *  'V' : get_utm€ÇÀ­ÇœÉŸ²ÁÍÑ¥·¥¹¥Æ¥à»þ¹ï€ò2²óÆÉ€à¡¥
107 *  'v' : ȯ¹Ô€·€¿¥·¥¹¥Æ¥à¥³¡Œ¥ë€òÉœŒš€¹€ë¡Ê¥Ç¥Õ¥©¥ë¥È¡Ë¡¥
108 *  'q' : ȯ¹Ô€·€¿¥·¥¹¥Æ¥à¥³¡Œ¥ë€òÉœŒš€·€Ê€€¡¥
109 */
110
111#include <kernel.h>
112#include <t_syslog.h>
113#include <t_stdlib.h>
114#include "syssvc/serial.h"
115#include "syssvc/syslog.h"
116#include "kernel_cfg.h"
117#include "sample1.h"
118
119/*
120 *  ¥µ¡Œ¥Ó¥¹¥³¡Œ¥ë€Î¥š¥é¡Œ€Î¥í¥°œÐÎÏ
121 */
122Inline void
123svc_perror(const char *file, int_t line, const char *expr, ER ercd)
124{
125        if (ercd < 0) {
126                t_perror(LOG_ERROR, file, line, expr, ercd);
127        }
128}
129
130#define SVC_PERROR(expr)        svc_perror(__FILE__, __LINE__, #expr, (expr))
131
132/*
133 *  ʹԌ¹Ԁµ€ì€ë¥¿¥¹¥¯€Ø€Î¥á¥Ã¥»¡Œ¥žÎΰè
134 */
135char    message[3];
136
137/*
138 *  ¥ë¡Œ¥×²ó¿ô
139 */
140ulong_t task_loop;              /* ¥¿¥¹¥¯Æâ€Ç€Î¥ë¡Œ¥×²ó¿ô */
141ulong_t tex_loop;               /* Îã³°œèÍý¥ë¡Œ¥Á¥óÆâ€Ç€Î¥ë¡Œ¥×²ó¿ô */
142
143/*
144 *  ʹԌ¹Ԁµ€ì€ë¥¿¥¹¥¯
145 */
146void task(intptr_t exinf)
147{
148        volatile ulong_t        i;
149        int_t           n = 0;
150        int_t           tskno = (int_t) exinf;
151        const char      *graph[] = { "|", "  +", "    *" };
152        char            c;
153
154        SVC_PERROR(ena_tex());
155        while (true) {
156                syslog(LOG_NOTICE, "task%d is running (%03d).   %s",
157                                                                                tskno, ++n, graph[tskno-1]);
158                for (i = 0; i < task_loop; i++);
159                c = message[tskno-1];
160                message[tskno-1] = 0;
161                switch (c) {
162                case 'e':
163                        syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
164                        SVC_PERROR(ext_tsk());
165                        assert(0);
166                case 's':
167                        syslog(LOG_INFO, "#%d#slp_tsk()", tskno);
168                        SVC_PERROR(slp_tsk());
169                        break;
170                case 'S':
171                        syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno);
172                        SVC_PERROR(tslp_tsk(10000));
173                        break;
174                case 'd':
175                        syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno);
176                        SVC_PERROR(dly_tsk(10000));
177                        break;
178                case 'y':
179                        syslog(LOG_INFO, "#%d#dis_tex()", tskno);
180                        SVC_PERROR(dis_tex());
181                        break;
182                case 'Y':
183                        syslog(LOG_INFO, "#%d#ena_tex()", tskno);
184                        SVC_PERROR(ena_tex());
185                        break;
186#ifdef CPUEXC1
187                case 'z':
188                        syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
189                        RAISE_CPU_EXCEPTION;
190                        break;
191                case 'Z':
192                        SVC_PERROR(loc_cpu());
193                        syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
194                        RAISE_CPU_EXCEPTION;
195                        SVC_PERROR(unl_cpu());
196                        break;
197#endif /* CPUEXC1 */
198                default:
199                        break;
200                }
201        }
202}
203
204/*
205 *  ʹԀ·€ÆŒÂ¹Ô€µ€ì€ë¥¿¥¹¥¯ÍрΥ¿¥¹¥¯Îã³°œèÍý¥ë¡Œ¥Á¥ó
206 */
207void tex_routine(TEXPTN texptn, intptr_t exinf)
208{
209        volatile ulong_t        i;
210        int_t   tskno = (int_t) exinf;
211
212        syslog(LOG_NOTICE, "task%d receives exception 0x%04x.", tskno, texptn);
213        for (i = 0; i < tex_loop; i++);
214
215        if ((texptn & 0x8000U) != 0U) {
216                syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
217                SVC_PERROR(ext_tsk());
218                assert(0);
219        }
220}
221
222/*
223 *  CPUÎã³°¥Ï¥ó¥É¥é
224 */
225#ifdef CPUEXC1
226
227void
228cpuexc_handler(void *p_excinf)
229{
230        ID              tskid;
231
232        syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf);
233        if (sns_ctx() != true) {
234                syslog(LOG_WARNING,
235                                        "sns_ctx() is not true in CPU exception handler.");
236        }
237        if (sns_dpn() != true) {
238                syslog(LOG_WARNING,
239                                        "sns_dpn() is not true in CPU exception handler.");
240        }
241        syslog(LOG_INFO, "sns_loc = %d sns_dsp = %d sns_tex = %d",
242                                                                        sns_loc(), sns_dsp(), sns_tex());
243        syslog(LOG_INFO, "xsns_dpn = %d xsns_xpn = %d",
244                                                                        xsns_dpn(p_excinf), xsns_xpn(p_excinf));
245
246        if (xsns_xpn(p_excinf)) {
247                syslog(LOG_NOTICE, "Sample program ends with exception.");
248                SVC_PERROR(ext_ker());
249                assert(0);
250        }
251
252        SVC_PERROR(iget_tid(&tskid));
253        SVC_PERROR(iras_tex(tskid, 0x8000U));
254}
255
256#endif /* CPUEXC1 */
257
258/*
259 *  ŒþŽü¥Ï¥ó¥É¥é
260 *
261 *  HIGH_PRIORITY¡€MID_PRIORITY¡€LOW_PRIORITY €Î³ÆÍ¥ÀèÅـΥì¥Ç¥£¥­¥å¡Œ
262 *  €ò²óÅŸ€µ€»€ë¡¥
263 */
264void cyclic_handler(intptr_t exinf)
265{
266        SVC_PERROR(irot_rdq(HIGH_PRIORITY));
267        SVC_PERROR(irot_rdq(MID_PRIORITY));
268        SVC_PERROR(irot_rdq(LOW_PRIORITY));
269}
270
271/*
272 *  ¥¢¥é¡Œ¥à¥Ï¥ó¥É¥é
273 *
274 *  HIGH_PRIORITY¡€MID_PRIORITY¡€LOW_PRIORITY €Î³ÆÍ¥ÀèÅـΥì¥Ç¥£¥­¥å¡Œ
275 *  €ò²óÅŸ€µ€»€ë¡¥
276 */
277void alarm_handler(intptr_t exinf)
278{
279        SVC_PERROR(irot_rdq(HIGH_PRIORITY));
280        SVC_PERROR(irot_rdq(MID_PRIORITY));
281        SVC_PERROR(irot_rdq(LOW_PRIORITY));
282}
283
284/*
285 *  ¥á¥€¥ó¥¿¥¹¥¯
286 */
287void main_task(intptr_t exinf)
288{
289        char    c;
290        ID              tskid = TASK1;
291        int_t   tskno = 1;
292        ER_UINT ercd;
293        PRI             tskpri;
294#ifndef TASK_LOOP
295        volatile ulong_t        i;
296        SYSTIM  stime1, stime2;
297#endif /* TASK_LOOP */
298#ifdef TOPPERS_SUPPORT_GET_UTM
299        SYSUTM  utime1, utime2;
300#endif /* TOPPERS_SUPPORT_GET_UTM */
301        T_CTSK  ctsk;
302        T_DTEX  dtex;
303        ID              TASK3 = -1;
304
305        SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
306        syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
307
308        /*
309         *  ¥·¥ê¥¢¥ë¥Ý¡Œ¥È€ÎœéŽü²œ
310         *
311         *  ¥·¥¹¥Æ¥à¥í¥°¥¿¥¹¥¯€ÈƱ€ž¥·¥ê¥¢¥ë¥Ý¡Œ¥È€ò»È€ŠŸì¹ç€Ê€É¡€¥·¥ê¥¢¥ë
312         *  ¥Ý¡Œ¥È€¬¥ª¡Œ¥×¥óºÑ€ß€ÎŸì¹ç€Ë€Ï€³€³€ÇE_OBJ¥š¥é¡Œ€Ë€Ê€ë€¬¡€»ÙŸã€Ï
313         *  €Ê€€¡¥
314         */
315        ercd = serial_opn_por(TASK_PORTID);
316        if (ercd < 0 && MERCD(ercd) != E_OBJ) {
317                syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
318                                                                        itron_strerror(ercd), SERCD(ercd));
319        }
320        SVC_PERROR(serial_ctl_por(TASK_PORTID,
321                                                        (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
322
323        /*
324         *  ¥ë¡Œ¥×²ó¿ô€ÎÀßÄê
325         *
326         *  ʹԌ¹Ԁµ€ì€ë¥¿¥¹¥¯Æâ€Ç€Î¶õ¥ë¡Œ¥×€Î²ó¿ô¡Êtask_loop¡Ë€Ï¡€¶õ¥ë¡Œ
327         *  ¥×€ÎŒÂ¹Ô»þŽÖ€¬Ìó0.4ÉÀˀʀë€è€Š€ËÀßÄꀹ€ë¡¥€³€ÎÀßÄê€Î€¿€á€Ë¡€
328         *  LOOP_REF²ó€Î¶õ¥ë¡Œ¥×€ÎŒÂ¹Ô»þŽÖ€ò¡€€œ€ÎÁ°žå€Çget_tim€òžÆ€Ö€³€È€Ç
329         *  ¬Äꀷ¡€€œ€Î¬Äê·ë²Ì€«€é¶õ¥ë¡Œ¥×€ÎŒÂ¹Ô»þŽÖ€¬0.4ÉÀˀʀë¥ë¡Œ¥×²ó
330         *  ¿ô€òµá€á¡€task_loop€ËÀßÄꀹ€ë¡¥
331         *
332         *  LOOP_REF€Ï¡€¥Ç¥Õ¥©¥ë¥È€Ç€Ï1,000,000€ËÀßÄꀷ€Æ€€€ë€¬¡€ÁÛÄꀷ€¿€è
333         *  €êÃÙ€€¥×¥í¥»¥Ã¥µ€Ç€Ï¡€¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à€ÎŒÂ¹Ô³«»Ï€Ë»þŽÖ€¬€«€«
334         *  €ê€¹€®€ë€È€€€ŠÌäÂê€òÀž€ž€ë¡¥µÕ€ËÁÛÄꀷ€¿€è€ê®€€¥×¥í¥»¥Ã¥µ€Ç€Ï¡€
335         *  LOOP_REF²ó€Î¶õ¥ë¡Œ¥×€ÎŒÂ¹Ô»þŽÖ€¬Ã»€¯€Ê€ê¡€task_loop€ËÀßÄꀹ€ëÃÍ
336         *  €Îžíº¹€¬Â瀭€¯€Ê€ë€È€€€ŠÌäÂꀬ€¢€ë¡¥
337         *
338         *  €œ€³€Ç¡€€œ€Î€è€Š€Ê¥¿¡Œ¥²¥Ã¥È€Ç€Ï¡€target_test.h€Ç¡€LOOP_REF€òŬ
339         *  ÀÚ€ÊÃÍ€ËÄêµÁ€¹€ë€Î€¬ËŸ€Þ€·€€¡¥
340         *
341         *  €Þ€¿¡€task_loop€ÎÃÍ€òžÇÄꀷ€¿€€Ÿì¹ç€Ë€Ï¡€€œ€ÎÃÍ€òTASK_LOOP€Ë¥Þ
342         *  ¥¯¥íÄêµÁ€¹€ë¡¥TASK_LOOP€¬¥Þ¥¯¥íÄêµÁ€µ€ì€Æ€€€ëŸì¹ç¡€Ÿåµ­€Î¬Äê€ò
343         *  ¹Ô€ï€º€Ë¡€TASK_LOOP€ËÄêµÁ€µ€ì€¿ÃÍ€ò¶õ¥ë¡Œ¥×€Î²ó¿ô€È€¹€ë¡¥
344         *
345         * ¥¿¡Œ¥²¥Ã¥È€Ë€è€Ã€Æ€Ï¡€¶õ¥ë¡Œ¥×€ÎŒÂ¹Ô»þŽÖ€Î1²óÌ܀άÄê€Ç¡€ËÜÍè€è
346         * €ê€âĹ€á€Ë€Ê€ë€â€Î€¬€¢€ë¡¥€³€Î€è€Š€Ê¥¿¡Œ¥²¥Ã¥È€Ç€Ï¡€MEASURE_TWICE
347         * €ò¥Þ¥¯¥íÄêµÁ€¹€ë€³€È€Ç¡€1²óÌ܀άÄê·ë²Ì€òŒÎ€Æ€Æ¡€2²óÌ܀άÄê·ë²Ì
348         * €ò»È€Š¡¥
349         *
350         *  ¥¿¥¹¥¯Îã³°œèÍý¥ë¡Œ¥Á¥óÆâ€Ç€Î¶õ¥ë¡Œ¥×€Î²ó¿ô¡Êtex_loop¡Ë€Ï¡€
351         *  task_loop€Î4ʬ€Î1€ÎÃ͡ʶõ¥ë¡Œ¥×€ÎŒÂ¹Ô»þŽÖ€¬0.1ÉÀˀʀë¥ë¡Œ¥×²ó
352         *  ¿ô¡Ë€ËÀßÄꀹ€ë¡¥
353         */
354#ifdef TASK_LOOP
355        task_loop = TASK_LOOP;
356#else /* TASK_LOOP */
357
358#ifdef MEASURE_TWICE
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#endif /* MEASURE_TWICE */
364
365        task_loop = LOOP_REF;
366        SVC_PERROR(get_tim(&stime1));
367        for (i = 0; i < task_loop; i++);
368        SVC_PERROR(get_tim(&stime2));
369        task_loop = LOOP_REF * 400UL / (stime2 - stime1);
370
371#endif /* TASK_LOOP */
372        tex_loop = task_loop / 4;
373
374        /*
375         *  ¥¿¥¹¥¯€Îµ¯Æ°
376         */
377        SVC_PERROR(act_tsk(TASK1));
378        SVC_PERROR(act_tsk(TASK2));
379
380        /*
381         *  ¥á¥€¥ó¥ë¡Œ¥×
382         */
383        do {
384                SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1));
385                switch (c) {
386                case 'e':
387                case 's':
388                case 'S':
389                case 'd':
390                case 'y':
391                case 'Y':
392                case 'z':
393                case 'Z':
394                        message[tskno-1] = c;
395                        break;
396                case '1':
397                        tskno = 1;
398                        tskid = TASK1;
399                        break;
400                case '2':
401                        tskno = 2;
402                        tskid = TASK2;
403                        break;
404                case '3':
405                        tskno = 3;
406                        tskid = TASK3;
407                        break;
408                case 'a':
409                        syslog(LOG_INFO, "#act_tsk(%d)", tskno);
410                        SVC_PERROR(act_tsk(tskid));
411                        break;
412                case 'A':
413                        syslog(LOG_INFO, "#can_act(%d)", tskno);
414                        SVC_PERROR(ercd = can_act(tskid));
415                        if (ercd >= 0) {
416                                syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd);
417                        }
418                        break;
419                case 't':
420                        syslog(LOG_INFO, "#ter_tsk(%d)", tskno);
421                        SVC_PERROR(ter_tsk(tskid));
422                        break;
423                case '>':
424                        syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno);
425                        SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY));
426                        break;
427                case '=':
428                        syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno);
429                        SVC_PERROR(chg_pri(tskid, MID_PRIORITY));
430                        break;
431                case '<':
432                        syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno);
433                        SVC_PERROR(chg_pri(tskid, LOW_PRIORITY));
434                        break;
435                case 'G':
436                        syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno);
437                        SVC_PERROR(ercd = get_pri(tskid, &tskpri));
438                        if (ercd >= 0) {
439                                syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri);
440                        }
441                        break;
442                case 'w':
443                        syslog(LOG_INFO, "#wup_tsk(%d)", tskno);
444                        SVC_PERROR(wup_tsk(tskid));
445                        break;
446                case 'W':
447                        syslog(LOG_INFO, "#can_wup(%d)", tskno);
448                        SVC_PERROR(ercd = can_wup(tskid));
449                        if (ercd >= 0) {
450                                syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd);
451                        }
452                        break;
453                case 'l':
454                        syslog(LOG_INFO, "#rel_wai(%d)", tskno);
455                        SVC_PERROR(rel_wai(tskid));
456                        break;
457                case 'u':
458                        syslog(LOG_INFO, "#sus_tsk(%d)", tskno);
459                        SVC_PERROR(sus_tsk(tskid));
460                        break;
461                case 'm':
462                        syslog(LOG_INFO, "#rsm_tsk(%d)", tskno);
463                        SVC_PERROR(rsm_tsk(tskid));
464                        break;
465                case 'x':
466                        syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno);
467                        SVC_PERROR(ras_tex(tskid, 0x0001U));
468                        break;
469                case 'X':
470                        syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno);
471                        SVC_PERROR(ras_tex(tskid, 0x0002U));
472                        break;
473                case 'r':
474                        syslog(LOG_INFO, "#rot_rdq(three priorities)");
475                        SVC_PERROR(rot_rdq(HIGH_PRIORITY));
476                        SVC_PERROR(rot_rdq(MID_PRIORITY));
477                        SVC_PERROR(rot_rdq(LOW_PRIORITY));
478                        break;
479                case 'c':
480                        syslog(LOG_INFO, "#sta_cyc(1)");
481                        SVC_PERROR(sta_cyc(CYCHDR1));
482                        break;
483                case 'C':
484                        syslog(LOG_INFO, "#stp_cyc(1)");
485                        SVC_PERROR(stp_cyc(CYCHDR1));
486                        break;
487                case 'b':
488                        syslog(LOG_INFO, "#sta_alm(1, 5000)");
489                        SVC_PERROR(sta_alm(ALMHDR1, 5000));
490                        break;
491                case 'B':
492                        syslog(LOG_INFO, "#stp_alm(1)");
493                        SVC_PERROR(stp_alm(ALMHDR1));
494                        break;
495                case '@':
496                        ctsk.tskatr = TA_NULL;
497                        ctsk.exinf = 3;
498                        ctsk.task = task;
499                        ctsk.itskpri = MID_PRIORITY;
500                        ctsk.stksz = STACK_SIZE;
501                        ctsk.stk = NULL;
502                        SVC_PERROR(TASK3 = acre_tsk(&ctsk));
503
504                        dtex.texatr = TA_NULL;
505                        dtex.texrtn = tex_routine;
506                        SVC_PERROR(def_tex(TASK3, &dtex));
507
508                        syslog(LOG_NOTICE, "task3 is created with tskid = %d.",
509                                                                                                                (int_t) TASK3);
510                        break;
511                case '!':
512                        syslog(LOG_INFO, "#del_tsk(%d)", tskno);
513                        SVC_PERROR(del_tsk(tskid));
514                        break;
515
516                case 'V':
517#ifdef TOPPERS_SUPPORT_GET_UTM
518                        SVC_PERROR(get_utm(&utime1));
519                        SVC_PERROR(get_utm(&utime2));
520                        syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld",
521                                                                                (ulong_t) utime1, (ulong_t) utime2);
522#else /* TOPPERS_SUPPORT_GET_UTM */
523                        syslog(LOG_NOTICE, "get_utm is not supported.");
524#endif /* TOPPERS_SUPPORT_GET_UTM */
525                        break;
526
527                case 'v':
528                        SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO),
529                                                                                LOG_UPTO(LOG_EMERG)));
530                        break;
531                case 'q':
532                        SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE),
533                                                                                LOG_UPTO(LOG_EMERG)));
534                        break;
535
536#ifdef BIT_KERNEL
537                case ' ':
538                        SVC_PERROR(loc_cpu());
539                        {
540                                extern ER       bit_kernel(void);
541
542                                SVC_PERROR(ercd = bit_kernel());
543                                if (ercd >= 0) {
544                                        syslog(LOG_NOTICE, "bit_kernel passed.");
545                                }
546                        }
547                        SVC_PERROR(unl_cpu());
548                        break;
549#endif /* BIT_KERNEL */
550
551                default:
552                        break;
553                }
554        } while (c != '\003' && c != 'Q');
555
556        syslog(LOG_NOTICE, "Sample program ends.");
557        SVC_PERROR(ext_ker());
558        assert(0);
559}
詳しい使い方は TracBrowser を参照してください。