📄 sample1.c
字号:
/*
* TOPPERS/JSP Kernel
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Just Standard Profile Kernel
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
*
* 忋婰挊嶌尃幰偼丆埲壓偺 (1)乣(4) 偺忦審偐丆Free Software Foundation
* 偵傛偭偰岞昞偝傟偰偄傞 GNU General Public License 偺 Version 2 偵婰
* 弎偝傟偰偄傞忦審傪枮偨偡応崌偵尷傝丆杮僜僼僩僂僃傾乮杮僜僼僩僂僃傾
* 傪夵曄偟偨傕偺傪娷傓丏埲壓摨偠乯傪巊梡丒暋惢丒夵曄丒嵞攝晍乮埲壓丆
* 棙梡偲屇傇乯偡傞偙偲傪柍彏偱嫋戻偡傞丏
* (1) 杮僜僼僩僂僃傾傪僜乕僗僐乕僪偺宍偱棙梡偡傞応崌偵偼丆忋婰偺挊嶌
* 尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕偑丆偦偺傑傑偺宍偱僜乕
* 僗僐乕僪拞偵娷傑傟偰偄傞偙偲丏
* (2) 杮僜僼僩僂僃傾傪丆儔僀僽儔儕宍幃側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒傞宍偱嵞攝晍偡傞応崌偵偼丆嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡
* 幰儅僯儏傾儖側偳乯偵丆忋婰偺挊嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰
* 偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (3) 杮僜僼僩僂僃傾傪丆婡婍偵慻傒崬傓側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒側偄宍偱嵞攝晍偡傞応崌偵偼丆師偺偄偢傟偐偺忦審傪枮偨偡偙
* 偲丏
* (a) 嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡幰儅僯儏傾儖側偳乯偵丆忋婰偺挊
* 嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (b) 嵞攝晍偺宍懺傪丆暿偵掕傔傞曽朄偵傛偭偰丆TOPPERS僾儘僕僃僋僩偵
* 曬崘偡傞偙偲丏
* (4) 杮僜僼僩僂僃傾偺棙梡偵傛傝捈愙揑傑偨偼娫愙揑偵惗偠傞偄偐側傞懝
* 奞偐傜傕丆忋婰挊嶌尃幰偍傛傃TOPPERS僾儘僕僃僋僩傪柶愑偡傞偙偲丏
*
* 杮僜僼僩僂僃傾偼丆柍曐徹偱採嫙偝傟偰偄傞傕偺偱偁傞丏忋婰挊嶌尃幰偍
* 傛傃TOPPERS僾儘僕僃僋僩偼丆杮僜僼僩僂僃傾偵娭偟偰丆偦偺揔梡壜擻惈傕
* 娷傔偰丆偄偐側傞曐徹傕峴傢側偄丏傑偨丆杮僜僼僩僂僃傾偺棙梡偵傛傝捈
* 愙揑傑偨偼娫愙揑偵惗偠偨偄偐側傞懝奞偵娭偟偰傕丆偦偺愑擟傪晧傢側偄丏
*
* @(#) $Id: sample1.c,v 1.16 2003/07/01 13:29:39 hiro Exp $
*/
/*
* 僒儞僾儖僾儘僌儔儉(1)偺杮懱
*
* JSP僇乕僱儖偺婎杮揑側摦嶌傪妋擣偡傞偨傔偺僒儞僾儖僾儘僌儔儉丏
*
* 僾儘僌儔儉偺奣梫:
*
* 儐乕僓僀儞僞僼僃乕僗傪庴偗帩偮儊僀儞僞僗僋乮僞僗僋ID: MAIN_TASK丆
* 桪愭搙: MAIN_PRIORITY乯偲丆嶰偮偺暲楍幚峴偝傟傞僞僗僋乮僞僗僋ID:
* TASK1乣TASK3丆弶婜桪愭搙: MID_PRIORITY乯偱峔惉偝傟傞丏傑偨丆婲摦廃
* 婜偑2昩偺廃婜僴儞僪儔乮廃婜僴儞僪儔ID: CYCHDR1乯傪梡偄傞丏
*
* 暲楍幚峴偝傟傞僞僗僋偼丆task_loop 夞嬻儖乕僾傪幚峴偡傞搙偵丆僞僗僋
* 偑幚峴拞偱偁傞偙偲傪偁傜傢偡儊僢僙乕僕傪昞帵偡傞丏
*
* 廃婜僴儞僪儔偼丆嶰偮偺桪愭搙乮HIGH_PRIORITY丆MID_PRIORITY丆
* LOW_PRIORITY乯偺儗僨傿僉儏乕傪夞揮偝偣傞丏僾儘僌儔儉偺婲摦捈屻偼丆
* 廃婜僴儞僪儔偼掆巭忬懺偵側偭偰偄傞丏
*
* 儊僀儞僞僗僋偼丆僔儕傾儖I/O億乕僩偐傜偺暥帤擖椡傪峴偄乮暥帤擖椡傪
* 懸偭偰偄傞娫偼丆暲楍幚峴偝傟傞僞僗僋偑幚峴偝傟偰偄傞乯丆擖椡偝傟偨
* 暥帤偵懳墳偟偨張棟傪幚峴偡傞丏擖椡偝傟偨暥帤偲張棟偺娭學偼師偺捠傝丏
* Control-C 傑偨偼 'Q' 偑擖椡偝傟傞偲丆僾儘僌儔儉傪廔椆偡傞丏
*
* '1' : 埲崀偺僐儅儞僪偼 TASK1 偵懳偟偰峴偆丏
* '2' : 埲崀偺僐儅儞僪偼 TASK2 偵懳偟偰峴偆丏
* '3' : 埲崀偺僐儅儞僪偼 TASK3 偵懳偟偰峴偆丏
* 'a' : 僞僗僋傪 act_tsk 偵傛傝婲摦偡傞丏
* 'A' : 僞僗僋偵懳偡傞婲摦梫媮傪 can_act 偵傛傝僉儍儞僙儖偡傞丏
* 'e' : 僞僗僋偵 ext_tsk 傪屇傃弌偝偣丆廔椆偝偣傞丏
* 't' : 僞僗僋傪 ter_tsk 偵傛傝嫮惂廔椆偡傞丏
* '>' : 僞僗僋偺桪愭搙傪 HIGH_PRIORITY 偵偡傞丏
* '=' : 僞僗僋偺桪愭搙傪 MID_PRIORITY 偵偡傞丏
* '<' : 僞僗僋偺桪愭搙傪 LOW_PRIORITY 偵偡傞丏
* 'G' : 僞僗僋偺桪愭搙傪 get_pri 偱撉傒弌偡丏
* 's' : 僞僗僋偵 slp_tsk 傪屇傃弌偝偣丆婲彴懸偪偵偝偣傞丏
* 'S' : 僞僗僋偵 tslp_tsk(10昩) 傪屇傃弌偝偣丆婲彴懸偪偵偝偣傞丏
* 'w' : 僞僗僋傪 wup_tsk 偵傛傝婲彴偡傞丏
* 'W' : 僞僗僋偵懳偡傞婲彴梫媮傪 can_wup 偵傛傝僉儍儞僙儖偡傞丏
* 'l' : 僞僗僋傪 rel_wai 偵傛傝嫮惂揑偵懸偪夝彍偵偡傞丏
* 'u' : 僞僗僋傪 sus_tsk 偵傛傝嫮惂懸偪忬懺偵偡傞丏
* 'm' : 僞僗僋偺嫮惂懸偪忬懺傪 rsm_tsk 偵傛傝夝彍偡傞丏
* 'M' : 僞僗僋偺嫮惂懸偪忬懺傪 frsm_tsk 偵傛傝嫮惂夝彍偡傞丏
* 'd' : 僞僗僋偵 dly_tsk(10昩) 傪屇傃弌偝偣丆帪娫宱夁懸偪偵偝偣傞丏
* 'x' : 僞僗僋偵僷僞乕儞 0x0001 偺椺奜張棟傪梫媮偡傞丏
* 'X' : 僞僗僋偵僷僞乕儞 0x0002 偺椺奜張棟傪梫媮偡傞丏
* 'y' : 僞僗僋偵 dis_tex 傪屇傃弌偝偣丆僞僗僋椺奜傪嬛巭偡傞丏
* 'Y' : 僞僗僋偵 ena_tex 傪屇傃弌偝偣丆僞僗僋椺奜傪嫋壜偡傞丏
* 'r' : 嶰偮偺桪愭搙乮HIGH_PRIORITY丆MID_PRIORITY丆LOW_PRIORITY乯偺
* 儗僨傿僉儏乕傪夞揮偝偣傞丏
* 'c' : 廃婜僴儞僪儔傪摦嶌偝偣傞丏
* 'C' : 廃婜僴儞僪儔傪掆巭偝偣傞丏
* 'z' : CPU椺奜傪敪惗偝偣傞丏
* 'Z' : CPU儘僢僋忬懺偱CPU椺奜傪敪惗偝偣傞乮僾儘僌儔儉傪廔椆偡傞乯丏
* 'V' : vxget_tim 偱惈擻昡壙梡僔僗僥儉帪崗傪2夞撉傓丏
* 'v' : 敪峴偟偨僔僗僥儉僐乕儖傪昞帵偡傞乮僨僼僅儖僩乯丏
* 'q' : 敪峴偟偨僔僗僥儉僐乕儖傪昞帵偟側偄丏
*/
#include <t_services.h>
#include "kernel_id.h"
#include "sample1.h"
/*
* 暲峴幚峴偝傟傞僞僗僋傊偺儊僢僙乕僕椞堟
*/
char message[3];
/*
* 儖乕僾夞悢
*/
UW task_loop; /* 僞僗僋撪偱偺儖乕僾夞悢 */
UW tex_loop; /* 椺奜張棟儖乕僠儞撪偱偺儖乕僾夞悢 */
/*
* 暲峴幚峴偝傟傞僞僗僋
*/
void task(VP_INT exinf)
{
volatile UW i;
INT n = 0;
INT tskno = (INT) exinf;
char *graph[] = { "|", " +", " *" };
char c;
ena_tex();
while (1) {
syslog(LOG_NOTICE, "task%d is running (%03d). %s",
tskno, ++n, graph[tskno-1]);
for (i = 0; i < task_loop; i++);
c = message[tskno-1];
message[tskno-1] = 0;
switch (c) {
case 'e':
syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
ext_tsk();
case 's':
syslog(LOG_INFO, "#%d#slp_tsk()", tskno);
syscall(slp_tsk());
break;
case 'S':
syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno);
syscall(tslp_tsk(10000));
break;
case 'd':
syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno);
syscall(dly_tsk(10000));
break;
case 'y':
syslog(LOG_INFO, "#%d#dis_tex()", tskno);
syscall(dis_tex());
break;
case 'Y':
syslog(LOG_INFO, "#%d#ena_tex()", tskno);
syscall(ena_tex());
break;
#ifdef CPUEXC1
case 'z':
syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
RAISE_CPU_EXCEPTION;
break;
case 'Z':
loc_cpu();
syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
RAISE_CPU_EXCEPTION;
unl_cpu();
break;
#endif /* CPUEXC1 */
default:
break;
}
}
}
/*
* 暲峴偟偰幚峴偝傟傞僞僗僋梡偺僞僗僋椺奜張棟儖乕僠儞
*/
void tex_routine(TEXPTN texptn, VP_INT exinf)
{
volatile UW i;
INT tskno = (INT) exinf;
syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ",
tskno, texptn);
for (i = 0; i < tex_loop; i++);
if (texptn & 0x8000) {
syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
ext_tsk();
}
}
/*
* CPU椺奜僴儞僪儔
*/
#ifdef CPUEXC1
void
cpuexc_handler(VP p_excinf)
{
ID tskid;
syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).",
p_excinf);
if (sns_ctx() != TRUE) {
syslog(LOG_WARNING,
"sns_ctx() is not TRUE in CPU exception handler.");
}
if (sns_dpn() != TRUE) {
syslog(LOG_WARNING,
"sns_dpn() is not TRUE in CPU exception handler.");
}
syslog(LOG_DEBUG,
"sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp());
syslog(LOG_DEBUG,
"vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d",
vxsns_loc(p_excinf), vxsns_ctx(p_excinf),
vxsns_dsp(p_excinf), vxsns_dpn(p_excinf));
if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) {
syscall(iget_tid(&tskid));
syscall(iras_tex(tskid, 0x8000));
}
else {
syslog(LOG_NOTICE, "Sample task ends with exception.");
kernel_exit();
}
}
#endif /* CPUEXC1 */
/*
* 廃婜僴儞僪儔
*
* HIGH_PRIORITY丆MID_PRIORITY丆LOW_PRIORITY 偺奺桪愭搙偺儗僨傿僉儏乕
* 傪夞揮偝偣傞丏
*/
void cyclic_handler(VP_INT exinf)
{
irot_rdq(HIGH_PRIORITY);
irot_rdq(MID_PRIORITY);
irot_rdq(LOW_PRIORITY);
}
/*
* 儊僀儞僞僗僋
*/
void main_task(VP_INT exinf)
{
char c;
ID tskid = TASK1;
volatile UW i;
INT tskno = 1;
ER_UINT ercd;
PRI tskpri;
SYSTIM stime1, stime2;
#ifndef OMIT_VGET_TIM
SYSUTIM utime1, utime2;
#endif /* OMIT_VGET_TIM */
vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG));
syslog(LOG_NOTICE, "Sample task starts (exinf = %d).", exinf);
syscall(serial_ctl_por(TASK_PORTID,
(IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
/*
* 儖乕僾夞悢偺愝掕
*/
task_loop = LOOP_REF;
get_tim(&stime1);
for (i = 0; i < task_loop; i++);
get_tim(&stime2);
task_loop = LOOP_REF * 400 / (stime2 - stime1);
tex_loop = task_loop / 5;
/*
* 僞僗僋偺婲摦
*/
act_tsk(TASK1);
act_tsk(TASK2);
act_tsk(TASK3);
/*
* 儊僀儞儖乕僾
*/
do {
syscall(serial_rea_dat(TASK_PORTID, &c, 1));
switch (c) {
case 'e':
case 's':
case 'S':
case 'd':
case 'y':
case 'Y':
case 'z':
case 'Z':
message[tskno-1] = c;
break;
case '1':
tskno = 1;
tskid = TASK1;
break;
case '2':
tskno = 2;
tskid = TASK2;
break;
case '3':
tskno = 3;
tskid = TASK3;
break;
case 'a':
syslog(LOG_INFO, "#act_tsk(%d)", tskno);
syscall(act_tsk(tskid));
break;
case 'A':
syslog(LOG_INFO, "#can_act(%d)", tskno);
syscall(ercd = can_act(tskid));
if (MERCD(ercd) >= 0) {
syslog(LOG_NOTICE, "can_act(%d) returns %d",
tskid, ercd);
}
break;
case 't':
syslog(LOG_INFO, "#ter_tsk(%d)", tskno);
syscall(ter_tsk(tskid));
break;
case '>':
syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno);
chg_pri(tskid, HIGH_PRIORITY);
break;
case '=':
syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno);
chg_pri(tskid, MID_PRIORITY);
break;
case '<':
syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno);
chg_pri(tskid, LOW_PRIORITY);
break;
case 'G':
syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno);
syscall(ercd = get_pri(tskid, &tskpri));
if (MERCD(ercd) >= 0) {
syslog(LOG_NOTICE, "priority of task %d is %d",
tskid, tskpri);
}
break;
case 'w':
syslog(LOG_INFO, "#wup_tsk(%d)", tskno);
syscall(wup_tsk(tskid));
break;
case 'W':
syslog(LOG_INFO, "#can_wup(%d)", tskno);
syscall(ercd = can_wup(tskid));
if (MERCD(ercd) >= 0) {
syslog(LOG_NOTICE, "can_wup(%d) returns %d",
tskid, ercd);
}
break;
case 'l':
syslog(LOG_INFO, "#rel_wai(%d)", tskno);
syscall(rel_wai(tskid));
break;
case 'u':
syslog(LOG_INFO, "#sus_tsk(%d)", tskno);
syscall(sus_tsk(tskid));
break;
case 'm':
syslog(LOG_INFO, "#rsm_tsk(%d)", tskno);
syscall(rsm_tsk(tskid));
break;
case 'M':
syslog(LOG_INFO, "#frsm_tsk(%d)", tskno);
syscall(frsm_tsk(tskid));
break;
case 'x':
syslog(LOG_INFO, "#ras_tsk(%d, 0x0001)", tskno);
syscall(ras_tex(tskid, 0x0001));
break;
case 'X':
syslog(LOG_INFO, "#ras_tsk(%d, 0x0002)", tskno);
syscall(ras_tex(tskid, 0x0002));
break;
case 'r':
syslog(LOG_INFO, "#rot_rdq(three priorities)");
rot_rdq(HIGH_PRIORITY);
rot_rdq(MID_PRIORITY);
rot_rdq(LOW_PRIORITY);
break;
case 'c':
sta_cyc(CYCHDR1);
break;
case 'C':
stp_cyc(CYCHDR1);
break;
#ifndef OMIT_VGET_TIM
case 'V':
syscall(vxget_tim(&utime1));
syscall(vxget_tim(&utime2));
syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d",
(UINT) utime1, (UINT) utime2);
break;
#endif /* OMIT_VGET_TIM */
case 'v':
vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG));
break;
case 'q':
vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG));
break;
default:
break;
}
} while (c != '\003' && c != 'Q');
syslog(LOG_NOTICE, "Sample task ends.");
kernel_exit();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -