📄 task_manage.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: task_manage.c,v 1.8 2003/06/04 01:46:16 hiro Exp $
*/
/*
* 僞僗僋娗棟婡擻
*/
#include "jsp_kernel.h"
#include "check.h"
#include "task.h"
#include "wait.h"
/*
* 僞僗僋偺婲摦
*/
#ifdef __act_tsk
SYSCALL ER
act_tsk(ID tskid)
{
TCB *tcb;
ER ercd;
LOG_ACT_TSK_ENTER(tskid);
CHECK_TSKCTX_UNL();
CHECK_TSKID_SELF(tskid);
tcb = get_tcb_self(tskid);
t_lock_cpu();
if (TSTAT_DORMANT(tcb->tstat)) {
if (make_active(tcb)) {
// dispatch();
}
ercd = E_OK;
}
else if (!(tcb->actcnt)) {
tcb->actcnt = TRUE;
ercd = E_OK;
}
else {
ercd = E_QOVR;
}
t_unlock_cpu();
exit:
LOG_ACT_TSK_LEAVE(ercd);
return(ercd);
}
#endif /* __act_tsk */
/*
* 僞僗僋偺婲摦乮旕僞僗僋僐儞僥僉僗僩梡乯
*/
#ifdef __iact_tsk
SYSCALL ER
iact_tsk(ID tskid)
{
TCB *tcb;
ER ercd;
LOG_IACT_TSK_ENTER(tskid);
CHECK_INTCTX_UNL();
CHECK_TSKID(tskid);
tcb = get_tcb(tskid);
i_lock_cpu();
if (TSTAT_DORMANT(tcb->tstat)) {
if (make_active(tcb)) {
reqflg = TRUE;
}
ercd = E_OK;
}
else if (!(tcb->actcnt)) {
tcb->actcnt = TRUE;
ercd = E_OK;
}
else {
ercd = E_QOVR;
}
i_unlock_cpu();
exit:
LOG_IACT_TSK_LEAVE(ercd);
return(ercd);
}
#endif /* __iact_tsk */
/*
* 僞僗僋婲摦梫媮偺僉儍儞僙儖
*/
#ifdef __can_act
SYSCALL ER_UINT
can_act(ID tskid)
{
TCB *tcb;
ER_UINT ercd;
LOG_CAN_ACT_ENTER(tskid);
CHECK_TSKCTX_UNL();
CHECK_TSKID_SELF(tskid);
tcb = get_tcb_self(tskid);
t_lock_cpu();
ercd = tcb->actcnt ? 1 : 0;
tcb->actcnt = FALSE;
t_unlock_cpu();
exit:
LOG_CAN_ACT_LEAVE(ercd);
return(ercd);
}
#endif /* __can_act */
/*
* 帺僞僗僋偺廔椆
*/
#ifdef __ext_tsk
SYSCALL void
ext_tsk(void)
{
LOG_EXT_TSK_ENTER();
#ifdef ACTIVATED_STACK_SIZE
/*
* create_context 偲 activate_context 偱丆巊梡拞偺僗僞僢僋椞
* 堟傪攋夡偟側偄傛偆偵丆僗僞僢僋忋偵僟儈乕椞堟傪妋曐偡傞丏
*/
(void) alloca(ACTIVATED_STACK_SIZE);
#endif /* ACTIVATED_STACK_SIZE */
if (sense_context()) {
/*
* 旕僞僗僋僐儞僥僉僗僩偐傜 ext_tsk 偑屇偽傟偨応崌丆
* 僔僗僥儉儘僌偵僄儔乕傪婰榐偟丆偦偺傑傑幚峴傪懕偗傞丏
* 偦偺寢壥丆嫮惂揑偵僞僗僋僐儞僥僉僗僩偵愗傝姺偊偰丆
* 幚峴忬懺偺僞僗僋傪廔椆偝偣傞偙偲偵側傞丏僇乕僱儖偼
* 偦偺傑傑幚峴傪宲懕偡傞偑丆僞乕僎僢僩偵傛偭偰偼丆旕
* 僞僗僋僐儞僥僉僗僩梡偺僗僞僢僋偵僑儈偑巆偭偨傝丆妱
* 崬傒僴儞僪儔偺僱僗僩悢偺娗棟偵柕弬偑惗偠偨傝偡傞応
* 崌偑偁傞丏
*/
syslog_0(LOG_ALERT,
"ext_tsk is called from non-task contexts.");
}
if (sense_lock()) {
/*
* CPU儘僢僋忬懺偱 ext_tsk 偑屇偽傟偨応崌偼丆CPU儘僢僋
* 傪夝彍偟偰偐傜僞僗僋傪廔椆偡傞丏幚憰忋偼丆僒乕價僗
* 僐乕儖撪偱偺CPU儘僢僋傪徣棯偡傟偽傛偄偩偗丏
*/
syslog_0(LOG_WARNING,
"ext_tsk is called from CPU locked state.");
}
else {
if (sense_context()) {
// i_lock_cpu();
}
else {
// t_lock_cpu();
}
}
if (!(enadsp)) {
/*
* 僨傿僗僷僢僠嬛巭忬懺偱 ext_tsk 偑屇偽傟偨応崌偼丆
* 僨傿僗僷僢僠嫋壜忬懺偵偟偰偐傜僞僗僋傪廔椆偡傞丏
*/
syslog_0(LOG_WARNING,
"ext_tsk is called from dispatch disabled state.");
enadsp = TRUE;
}
exit_task();
}
#endif /* __ext_tsk */
/*
* 僞僗僋偺嫮惂廔椆
*/
#ifdef __ter_tsk
SYSCALL ER
ter_tsk(ID tskid)
{
TCB *tcb;
UINT tstat;
ER ercd;
LOG_TER_TSK_ENTER(tskid);
CHECK_TSKCTX_UNL();
CHECK_TSKID(tskid);
tcb = get_tcb(tskid);
CHECK_NONSELF(tcb);
t_lock_cpu();
if (TSTAT_DORMANT(tstat = tcb->tstat)) {
ercd = E_OBJ;
}
else {
if (TSTAT_RUNNABLE(tstat)) {
make_non_runnable(tcb);
}
else if (TSTAT_WAITING(tstat)) {
wait_cancel(tcb);
}
make_dormant(tcb);
if (tcb->actcnt) {
tcb->actcnt = FALSE;
if (make_active(tcb)) {
dispatch();
}
}
ercd = E_OK;
}
t_unlock_cpu();
exit:
LOG_TER_TSK_LEAVE(ercd);
return(ercd);
}
#endif /* __ter_tsk */
/*
* 僞僗僋桪愭搙偺曄峏
*/
#ifdef __chg_pri
SYSCALL ER
chg_pri(ID tskid, PRI tskpri)
{
TCB *tcb;
UINT newpri;
UINT tstat;
ER ercd;
LOG_CHG_PRI_ENTER(tskid, tskpri);
CHECK_TSKCTX_UNL();
CHECK_TSKID_SELF(tskid);
CHECK_TPRI_INI(tskpri);
tcb = get_tcb_self(tskid);
newpri = (tskpri == TPRI_INI) ? tcb->tinib->ipriority
: INT_PRIORITY(tskpri);
t_lock_cpu();
if (TSTAT_DORMANT(tstat = tcb->tstat)) {
ercd = E_OBJ;
}
else if (TSTAT_RUNNABLE(tstat)) {
if (change_priority(tcb, newpri)) {
// dispatch();
}
ercd = E_OK;
}
else {
tcb->priority = newpri;
if ((tstat & TS_WAIT_WOBJCB) != 0) {
wobj_change_priority(((WINFO_WOBJ *)(tcb->winfo))
->wobjcb, tcb);
}
ercd = E_OK;
}
t_unlock_cpu();
exit:
LOG_CHG_PRI_LEAVE(ercd);
return(ercd);
}
#endif /* __chg_pri */
/*
* 僞僗僋桪愭搙偺嶲徠
*/
#ifdef __get_pri
SYSCALL ER
get_pri(ID tskid, PRI *p_tskpri)
{
TCB *tcb;
ER ercd;
LOG_GET_PRI_ENTER(tskid, p_tskpri);
CHECK_TSKCTX_UNL();
CHECK_TSKID_SELF(tskid);
tcb = get_tcb_self(tskid);
t_lock_cpu();
if (TSTAT_DORMANT(tcb->tstat)) {
ercd = E_OBJ;
}
else {
*p_tskpri = EXT_TSKPRI(tcb->priority);
ercd = E_OK;
}
t_unlock_cpu();
exit:
LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
return(ercd);
}
#endif /* __get_pri */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -