sample1.h

#include "target_test.h"

ソースコードを見る。

マクロ定義

#define MAIN_PRIORITY   5
#define HIGH_PRIORITY   9
#define MID_PRIORITY   10
#define LOW_PRIORITY   11
#define TASK_PORTID   1
#define STACK_SIZE   4096
#define LOOP_REF   ULONG_C(1000000)

関数

void task (intptr_t exinf)
void main_task (intptr_t exinf)
void tex_routine (TEXPTN texptn, intptr_t exinf)
void cyclic_handler (intptr_t exinf)
void alarm_handler (intptr_t exinf)
void cpuexc_handler (void *p_excinf)


マクロ定義

#define HIGH_PRIORITY   9

sample1.h59 行で定義されています。

参照元 alarm_handler(), cyclic_handler(), と main_task().

#define LOOP_REF   ULONG_C(1000000)

sample1.h76 行で定義されています。

参照元 main_task().

#define LOW_PRIORITY   11

sample1.h61 行で定義されています。

参照元 alarm_handler(), cyclic_handler(), と main_task().

#define MAIN_PRIORITY   5

sample1.h56 行で定義されています。

#define MID_PRIORITY   10

sample1.h60 行で定義されています。

参照元 alarm_handler(), cyclic_handler(), と main_task().

#define STACK_SIZE   4096

sample1.h72 行で定義されています。

#define TASK_PORTID   1

sample1.h68 行で定義されています。

参照元 main_task().


関数

void alarm_handler ( intptr_t  exinf  ) 

sample1.c270 行で定義されています。

参照先 HIGH_PRIORITY, irot_rdq(), LOW_PRIORITY, MID_PRIORITY, と SVC_PERROR.

void cpuexc_handler ( void *  p_excinf  ) 

void cyclic_handler ( intptr_t  exinf  ) 

sample1.c257 行で定義されています。

参照先 HIGH_PRIORITY, irot_rdq(), LOW_PRIORITY, MID_PRIORITY, と SVC_PERROR.

void main_task ( intptr_t  exinf  ) 

sample1.c280 行で定義されています。

参照先 act_tsk(), assert, can_act(), can_wup(), chg_pri(), E_OBJ, ext_ker(), get_pri(), get_tim(), get_utm(), HIGH_PRIORITY, IOCTL_CRLF, IOCTL_FCRCV, IOCTL_FCSND, itron_strerror(), loc_cpu(), LOG_EMERG, LOG_ERROR, LOG_INFO, LOG_NOTICE, LOG_UPTO, LOOP_REF, LOW_PRIORITY, MERCD, message, MID_PRIORITY, ras_tex(), rel_wai(), rot_rdq(), rsm_tsk(), SERCD, serial_ctl_por(), serial_opn_por(), serial_rea_dat(), sta_alm(), sta_cyc(), stp_alm(), stp_cyc(), sus_tsk(), SVC_PERROR, syslog(), syslog_msk_log(), task_loop, TASK_PORTID, ter_tsk(), tex_loop, unl_cpu(), と wup_tsk().

00281 {
00282     char_t  c;
00283     ID      tskid = TASK1;
00284     volatile ulong_t    i;
00285     int_t   tskno = 1;
00286     ER_UINT ercd;   
00287     PRI     tskpri;
00288     SYSTIM  stime1, stime2;
00289 #ifdef TOPPERS_SUPPORT_GET_UTM
00290     SYSUTM  utime1, utime2;
00291 #endif /* TOPPERS_SUPPORT_GET_UTM */
00292 
00293     SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
00294     syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
00295 
00296     /*
00297      *  シリアルポートの初期化
00298      *
00299      *  システムログタスクと同じシリアルポートを使う場合など,シリアル
00300      *  ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は
00301      *  ない.
00302      */
00303     ercd = serial_opn_por(TASK_PORTID);
00304     if (ercd < 0 && MERCD(ercd) != E_OBJ) {
00305         syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
00306                                     itron_strerror(ercd), SERCD(ercd));
00307     }
00308     SVC_PERROR(serial_ctl_por(TASK_PORTID,
00309                             (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
00310 
00311     /*
00312      *  ループ回数の設定
00313      *
00314      *  TASK_LOOPがマクロ定義されている場合,測定せずに,TASK_LOOPに定
00315      *  義された値を,タスク内でのループ回数とする.
00316      *
00317      *  MEASURE_TWICEがマクロ定義されている場合,1回目の測定結果を捨て
00318      *  て,2回目の測定結果を使う.1回目の測定は長めの時間が出るため.
00319      */
00320 #ifdef TASK_LOOP
00321     task_loop = TASK_LOOP;
00322 #else /* TASK_LOOP */
00323 
00324 #ifdef MEASURE_TWICE
00325     task_loop = LOOP_REF;
00326     SVC_PERROR(get_tim(&stime1));
00327     for (i = 0; i < task_loop; i++);
00328     SVC_PERROR(get_tim(&stime2));
00329 #endif /* MEASURE_TWICE */
00330 
00331     task_loop = LOOP_REF;
00332     SVC_PERROR(get_tim(&stime1));
00333     for (i = 0; i < task_loop; i++);
00334     SVC_PERROR(get_tim(&stime2));
00335     task_loop = LOOP_REF * 400UL / (stime2 - stime1);
00336 
00337 #endif /* TASK_LOOP */
00338     tex_loop = task_loop / 5;
00339 
00340     /*
00341      *  タスクの起動
00342      */
00343     SVC_PERROR(act_tsk(TASK1));
00344     SVC_PERROR(act_tsk(TASK2));
00345     SVC_PERROR(act_tsk(TASK3));
00346 
00347     /*
00348      *  メインループ
00349      */
00350     do {
00351         SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1));
00352         switch (c) {
00353         case 'e':
00354         case 's':
00355         case 'S':
00356         case 'd':
00357         case 'y':
00358         case 'Y':
00359         case 'z':
00360         case 'Z':
00361             message[tskno-1] = c;
00362             break;
00363         case '1':
00364             tskno = 1;
00365             tskid = TASK1;
00366             break;
00367         case '2':
00368             tskno = 2;
00369             tskid = TASK2;
00370             break;
00371         case '3':
00372             tskno = 3;
00373             tskid = TASK3;
00374             break;
00375         case 'a':
00376             syslog(LOG_INFO, "#act_tsk(%d)", tskno);
00377             SVC_PERROR(act_tsk(tskid));
00378             break;
00379         case 'A':
00380             syslog(LOG_INFO, "#can_act(%d)", tskno);
00381             SVC_PERROR(ercd = can_act(tskid));
00382             if (ercd >= 0) {
00383                 syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd);
00384             }
00385             break;
00386         case 't':
00387             syslog(LOG_INFO, "#ter_tsk(%d)", tskno);
00388             SVC_PERROR(ter_tsk(tskid));
00389             break;
00390         case '>':
00391             syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno);
00392             SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY));
00393             break;
00394         case '=':
00395             syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno);
00396             SVC_PERROR(chg_pri(tskid, MID_PRIORITY));
00397             break;
00398         case '<':
00399             syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno);
00400             SVC_PERROR(chg_pri(tskid, LOW_PRIORITY));
00401             break;
00402         case 'G':
00403             syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno);
00404             SVC_PERROR(ercd = get_pri(tskid, &tskpri));
00405             if (ercd >= 0) {
00406                 syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri);
00407             }
00408             break;
00409         case 'w':
00410             syslog(LOG_INFO, "#wup_tsk(%d)", tskno);
00411             SVC_PERROR(wup_tsk(tskid));
00412             break;
00413         case 'W':
00414             syslog(LOG_INFO, "#can_wup(%d)", tskno);
00415             SVC_PERROR(ercd = can_wup(tskid));
00416             if (ercd >= 0) {
00417                 syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd);
00418             }
00419             break;
00420         case 'l':
00421             syslog(LOG_INFO, "#rel_wai(%d)", tskno);
00422             SVC_PERROR(rel_wai(tskid));
00423             break;
00424         case 'u':
00425             syslog(LOG_INFO, "#sus_tsk(%d)", tskno);
00426             SVC_PERROR(sus_tsk(tskid));
00427             break;
00428         case 'm':
00429             syslog(LOG_INFO, "#rsm_tsk(%d)", tskno);
00430             SVC_PERROR(rsm_tsk(tskid));
00431             break;
00432         case 'x':
00433             syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno);
00434             SVC_PERROR(ras_tex(tskid, 0x0001U));
00435             break;
00436         case 'X':
00437             syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno);
00438             SVC_PERROR(ras_tex(tskid, 0x0002U));
00439             break;
00440         case 'r':
00441             syslog(LOG_INFO, "#rot_rdq(three priorities)");
00442             SVC_PERROR(rot_rdq(HIGH_PRIORITY));
00443             SVC_PERROR(rot_rdq(MID_PRIORITY));
00444             SVC_PERROR(rot_rdq(LOW_PRIORITY));
00445             break;
00446         case 'c':
00447             syslog(LOG_INFO, "#sta_cyc(1)");
00448             SVC_PERROR(sta_cyc(CYCHDR1));
00449             break;
00450         case 'C':
00451             syslog(LOG_INFO, "#stp_cyc(1)");
00452             SVC_PERROR(stp_cyc(CYCHDR1));
00453             break;
00454         case 'b':
00455             syslog(LOG_INFO, "#sta_alm(1, 5000)");
00456             SVC_PERROR(sta_alm(ALMHDR1, 5000));
00457             break;
00458         case 'B':
00459             syslog(LOG_INFO, "#stp_alm(1)");
00460             SVC_PERROR(stp_alm(ALMHDR1));
00461             break;
00462         case 'V':
00463 #ifdef TOPPERS_SUPPORT_GET_UTM
00464             SVC_PERROR(get_utm(&utime1));
00465             SVC_PERROR(get_utm(&utime2));
00466             syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld",
00467                                         (ulong_t) utime1, (ulong_t) utime2);
00468 #else /* TOPPERS_SUPPORT_GET_UTM */
00469             syslog(LOG_NOTICE, "get_utm is not supported.");
00470 #endif /* TOPPERS_SUPPORT_GET_UTM */
00471             break;
00472         case 'v':
00473             SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO),
00474                                         LOG_UPTO(LOG_EMERG)));
00475             break;
00476         case 'q':
00477             SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE),
00478                                         LOG_UPTO(LOG_EMERG)));
00479             break;
00480 #ifdef BIT_KERNEL
00481         case ' ':
00482             SVC_PERROR(loc_cpu());
00483             {
00484                 extern ER   bit_kernel(void);
00485 
00486                 SVC_PERROR(ercd = bit_kernel());
00487                 if (ercd >= 0) {
00488                     syslog(LOG_NOTICE, "bit_kernel passed.");
00489                 }
00490             }
00491             SVC_PERROR(unl_cpu());
00492             break;
00493 #endif /* BIT_KERNEL */
00494         default:
00495             break;
00496         }
00497     } while (c != '\003' && c != 'Q');
00498 
00499     syslog(LOG_NOTICE, "Sample program ends.");
00500     SVC_PERROR(ext_ker());
00501     assert(0);
00502 }

void task ( intptr_t  exinf  ) 

sample1.c139 行で定義されています。

参照先 assert, dis_tex(), dly_tsk(), ena_tex(), ext_tsk(), loc_cpu(), LOG_INFO, LOG_NOTICE, message, RAISE_CPU_EXCEPTION, slp_tsk(), SVC_PERROR, syslog(), task_loop, tslp_tsk(), と unl_cpu().

参照元 makeoffset().

00140 {
00141     volatile ulong_t    i;
00142     int_t       n = 0;
00143     int_t       tskno = (int_t) exinf;
00144     const char  *graph[] = { "|", "  +", "    *" };
00145     char_t      c;
00146 
00147     SVC_PERROR(ena_tex());
00148     while (1) {
00149         syslog(LOG_NOTICE, "task%d is running (%03d).   %s",
00150                                         tskno, ++n, graph[tskno-1]);
00151         for (i = 0; i < task_loop; i++);
00152         c = message[tskno-1];
00153         message[tskno-1] = 0;
00154         switch (c) {
00155         case 'e':
00156             syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
00157             SVC_PERROR(ext_tsk());
00158             assert(0);
00159         case 's':
00160             syslog(LOG_INFO, "#%d#slp_tsk()", tskno);
00161             SVC_PERROR(slp_tsk());
00162             break;
00163         case 'S':
00164             syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno);
00165             SVC_PERROR(tslp_tsk(10000));
00166             break;
00167         case 'd':
00168             syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno);
00169             SVC_PERROR(dly_tsk(10000));
00170             break;
00171         case 'y':
00172             syslog(LOG_INFO, "#%d#dis_tex()", tskno);
00173             SVC_PERROR(dis_tex());
00174             break;
00175         case 'Y':
00176             syslog(LOG_INFO, "#%d#ena_tex()", tskno);
00177             SVC_PERROR(ena_tex());
00178             break;
00179 #ifdef CPUEXC1
00180         case 'z':
00181             syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
00182             RAISE_CPU_EXCEPTION;
00183             break;
00184         case 'Z':
00185             SVC_PERROR(loc_cpu());
00186             syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
00187             RAISE_CPU_EXCEPTION;
00188             SVC_PERROR(unl_cpu());
00189             break;
00190 #endif /* CPUEXC1 */
00191         default:
00192             break;
00193         }
00194     }
00195 }

void tex_routine ( TEXPTN  texptn,
intptr_t  exinf 
)

sample1.c200 行で定義されています。

参照先 assert, ext_tsk(), LOG_INFO, LOG_NOTICE, SVC_PERROR, syslog(), と tex_loop.

00201 {
00202     volatile ulong_t    i;
00203     int_t   tskno = (int_t) exinf;
00204 
00205     syslog(LOG_NOTICE, "task%d receives exception 0x%04x.", tskno, texptn);
00206     for (i = 0; i < tex_loop; i++);
00207 
00208     if ((texptn & 0x8000U) != 0U) {
00209         syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
00210         SVC_PERROR(ext_tsk());
00211         assert(0);
00212     }
00213 }


Copyright © 2008 by Kijineko Inc.

ホームページ制作