#include "kernel_impl.h"
#include "check.h"
#include "cyclic.h"
マクロ定義 | |
#define | LOG_CYC_ENTER(p_cyccb) |
#define | LOG_CYC_LEAVE(p_cyccb) |
#define | LOG_STA_CYC_ENTER(cycid) |
#define | LOG_STA_CYC_LEAVE(ercd) |
#define | LOG_STP_CYC_ENTER(cycid) |
#define | LOG_STP_CYC_LEAVE(ercd) |
#define | LOG_REF_CYC_ENTER(cycid, pk_rcyc) |
#define | LOG_REF_CYC_LEAVE(ercd, pk_rcyc) |
#define | tnum_cyc ((uint_t)(tmax_cycid - TMIN_CYCID + 1)) |
#define | INDEX_CYC(cycid) ((uint_t)((cycid) - TMIN_CYCID)) |
#define | get_cyccb(cycid) (&(cyccb_table[INDEX_CYC(cycid)])) |
関数 | |
Inline void | tmevtb_enqueue_cyc (CYCCB *p_cyccb, EVTTIM evttim) |
void | initialize_cyclic (void) |
ER | sta_cyc (ID cycid) |
ER | stp_cyc (ID cycid) |
ER | ref_cyc (ID cycid, T_RCYC *pk_rcyc) |
void | call_cychdr (CYCCB *p_cyccb) |
#define get_cyccb | ( | cycid | ) | (&(cyccb_table[INDEX_CYC(cycid)])) |
#define LOG_CYC_ENTER | ( | p_cyccb | ) |
#define LOG_CYC_LEAVE | ( | p_cyccb | ) |
#define tnum_cyc ((uint_t)(tmax_cycid - TMIN_CYCID + 1)) |
void call_cychdr | ( | CYCCB * | p_cyccb | ) |
参照先 cyclic_handler_initialization_block::cychdr, cyclic_handler_initialization_block::cyctim, cyclic_handler_control_block::evttim, cyclic_handler_initialization_block::exinf, i_get_ipm, i_lock_cpu, i_sense_lock, i_set_ipm, i_unlock_cpu, LOG_CYC_ENTER, LOG_CYC_LEAVE, cyclic_handler_control_block::p_cycinib, と tmevtb_enqueue_cyc().
00239 { 00240 PRI saved_ipm; 00241 00242 /* 00243 * 次回の起動のためのタイムイベントブロックを登録する. 00244 * 00245 * 同じタイムティックで周期ハンドラを再度起動すべき場合には,この 00246 * 関数からsignal_timeに戻った後に,再度この関数が呼ばれることにな 00247 * る. 00248 */ 00249 tmevtb_enqueue_cyc(p_cyccb, p_cyccb->evttim + p_cyccb->p_cycinib->cyctim); 00250 00251 /* 00252 * 周期ハンドラを,CPUロック解除状態で呼び出す. 00253 */ 00254 saved_ipm = i_get_ipm(); 00255 i_unlock_cpu(); 00256 00257 LOG_CYC_ENTER(p_cyccb); 00258 (*((CYCHDR)(p_cyccb->p_cycinib->cychdr)))(p_cyccb->p_cycinib->exinf); 00259 LOG_CYC_LEAVE(p_cyccb); 00260 00261 if (!i_sense_lock()) { 00262 i_lock_cpu(); 00263 } 00264 i_set_ipm(saved_ipm); 00265 }
void initialize_cyclic | ( | void | ) |
参照先 cyclic_handler_initialization_block::cycatr, cyccb_table, cycinib_table, cyclic_handler_initialization_block::cycphs, cyclic_handler_control_block::cycsta, cyclic_handler_control_block::p_cycinib, TA_STA, tmevtb_enqueue_cyc(), と tnum_cyc.
00115 { 00116 uint_t i; 00117 CYCCB *p_cyccb; 00118 00119 for (p_cyccb = cyccb_table, i = 0; i < tnum_cyc; p_cyccb++, i++) { 00120 p_cyccb->p_cycinib = &(cycinib_table[i]); 00121 if ((p_cyccb->p_cycinib->cycatr & TA_STA) != 0U) { 00122 p_cyccb->cycsta = true; 00123 tmevtb_enqueue_cyc(p_cyccb, (EVTTIM)(p_cyccb->p_cycinib->cycphs)); 00124 } 00125 else { 00126 p_cyccb->cycsta = false; 00127 } 00128 } 00129 }
参照先 CHECK_CYCID, CHECK_TSKCTX_UNL, cyclic_handler_control_block::cycsta, t_rcyc::cycstat, E_OK, get_cyccb, t_rcyc::lefttim, LOG_REF_CYC_ENTER, LOG_REF_CYC_LEAVE, t_lock_cpu, t_unlock_cpu, TCYC_STA, TCYC_STP, tmevt_lefttim, と cyclic_handler_control_block::tmevtb.
00205 { 00206 CYCCB *p_cyccb; 00207 ER ercd; 00208 00209 LOG_REF_CYC_ENTER(cycid, pk_rcyc); 00210 CHECK_TSKCTX_UNL(); 00211 CHECK_CYCID(cycid); 00212 p_cyccb = get_cyccb(cycid); 00213 00214 t_lock_cpu(); 00215 if (p_cyccb->cycsta) { 00216 pk_rcyc->cycstat = TCYC_STA; 00217 pk_rcyc->lefttim = tmevt_lefttim(&(p_cyccb->tmevtb)); 00218 } 00219 else { 00220 pk_rcyc->cycstat = TCYC_STP; 00221 } 00222 ercd = E_OK; 00223 t_unlock_cpu(); 00224 00225 error_exit: 00226 LOG_REF_CYC_LEAVE(ercd, pk_rcyc); 00227 return(ercd); 00228 }
参照先 base_time, CHECK_CYCID, CHECK_TSKCTX_UNL, cyclic_handler_control_block::cycsta, cyclic_handler_initialization_block::cyctim, E_OK, get_cyccb, LOG_STA_CYC_ENTER, LOG_STA_CYC_LEAVE, cyclic_handler_control_block::p_cycinib, t_lock_cpu, t_unlock_cpu, cyclic_handler_control_block::tmevtb, tmevtb_dequeue(), と tmevtb_enqueue_cyc().
参照元 main_task().
00140 { 00141 CYCCB *p_cyccb; 00142 ER ercd; 00143 00144 LOG_STA_CYC_ENTER(cycid); 00145 CHECK_TSKCTX_UNL(); 00146 CHECK_CYCID(cycid); 00147 p_cyccb = get_cyccb(cycid); 00148 00149 t_lock_cpu(); 00150 if (p_cyccb->cycsta) { 00151 tmevtb_dequeue(&(p_cyccb->tmevtb)); 00152 } 00153 else { 00154 p_cyccb->cycsta = true; 00155 } 00156 tmevtb_enqueue_cyc(p_cyccb, base_time + p_cyccb->p_cycinib->cyctim); 00157 ercd = E_OK; 00158 t_unlock_cpu(); 00159 00160 error_exit: 00161 LOG_STA_CYC_LEAVE(ercd); 00162 return(ercd); 00163 }
参照先 CHECK_CYCID, CHECK_TSKCTX_UNL, cyclic_handler_control_block::cycsta, E_OK, get_cyccb, LOG_STP_CYC_ENTER, LOG_STP_CYC_LEAVE, t_lock_cpu, t_unlock_cpu, cyclic_handler_control_block::tmevtb, と tmevtb_dequeue().
参照元 main_task().
00174 { 00175 CYCCB *p_cyccb; 00176 ER ercd; 00177 00178 LOG_STP_CYC_ENTER(cycid); 00179 CHECK_TSKCTX_UNL(); 00180 CHECK_CYCID(cycid); 00181 p_cyccb = get_cyccb(cycid); 00182 00183 t_lock_cpu(); 00184 if (p_cyccb->cycsta) { 00185 p_cyccb->cycsta = false; 00186 tmevtb_dequeue(&(p_cyccb->tmevtb)); 00187 } 00188 ercd = E_OK; 00189 t_unlock_cpu(); 00190 00191 error_exit: 00192 LOG_STP_CYC_LEAVE(ercd); 00193 return(ercd); 00194 }
参照先 call_cychdr, cyclic_handler_control_block::tmevtb, と tmevtb_enqueue_evttim().
参照元 call_cychdr(), initialize_cyclic(), と sta_cyc().
00102 { 00103 tmevtb_enqueue_evttim(&(p_cyccb->tmevtb), evttim, 00104 (CBACK) call_cychdr, (void *) p_cyccb); 00105 p_cyccb->evttim = evttim; 00106 }
Copyright © 2008 by Kijineko Inc.