/* システム用イベント生成 */ SYSEVT_HANDLE SysEvt_Create(int iAttr) { T_CFLG cflg; ER_ID erid; /* ロック用セマフォ生成 */ cflg.flgatr = TA_TFIFO | ((iAttr & SYSEVT_ATTR_AUTOCLEAR) ? TA_CLR : 0); cflg.iflgptn = 0; erid = acre_flg(&cflg); if ( erid < 0 ) { return SYSEVT_HANDLE_NULL; } return (SYSMTX_HANDLE)erid; }
static ER handle_module_cfg_tab(T_LDM_CAN *ldm_can) { // TODO: check cfg table memory assert(ldm_can->cfg_entry_num > 0 && ldm_can->cfg_table != NULL); assert(probe_ldm_memory(ldm_can->cfg_table, sizeof(MOD_CFG_ENTRY) * ldm_can->cfg_entry_num, ldm_can)); ER_ID ercd = E_OK; // Creation stage for(SIZE i = 0; i < ldm_can->cfg_entry_num && ercd == E_OK; ++i) { MOD_CFG_ENTRY *ent = &ldm_can->cfg_table[i]; switch(ent->sfncd) { case TSFN_CRE_TSK: { syslog(LOG_DEBUG, "%s(): MOD_CFG_ENTRY TSFN_CRE_TSK", __FUNCTION__); assert(probe_ldm_memory(ent->argument, sizeof(T_CTSK), ldm_can)); assert(probe_ldm_memory(ent->retvalptr, sizeof(ID), ldm_can)); T_CTSK pk_ctsk = *(T_CTSK*)ent->argument; assert(probe_ldm_memory(pk_ctsk.stk, pk_ctsk.stksz, ldm_can)); // Check user stack assert(pk_ctsk.sstk == NULL); // Check system stack pk_ctsk.tskatr &= ~TA_ACT; // Clear TA_ACT assert(get_atrdomid(pk_ctsk.tskatr) == TDOM_SELF); // Check original DOMID pk_ctsk.tskatr |= TA_DOM(ldm_can->domid); // Set new DOMID pk_ctsk.task = app_tsk_wrapper; // Use task wrapper pk_ctsk.exinf = (intptr_t)ent->argument; ercd = acre_tsk(&pk_ctsk); assert(ercd > 0); if(ercd > 0) { // Store ID *(ID*)ent->retvalptr = ercd; // Setup task exception routine T_DTEX dtex; dtex.texatr = TA_NULL; dtex.texrtn = app_tex_rtn; ercd = def_tex(ercd, &dtex); assert(ercd == E_OK); #if defined(DEBUG) syslog(LOG_NOTICE, "%s(): Task (tid = %d) created.", __FUNCTION__, *(ID*)ent->retvalptr); #endif ercd = E_OK; } break; } case TSFN_CRE_SEM: { syslog(LOG_DEBUG, "%s(): MOD_CFG_ENTRY TSFN_CRE_SEM", __FUNCTION__); assert(probe_ldm_memory(ent->argument, sizeof(T_CSEM), ldm_can)); assert(probe_ldm_memory(ent->retvalptr, sizeof(ID), ldm_can)); T_CSEM pk_csem = *(T_CSEM*)ent->argument; // TODO: check pk_csem ercd = acre_sem(&pk_csem); assert(ercd > 0); if(ercd > 0) { // Store ID *(ID*)ent->retvalptr = ercd; #if defined(DEBUG) syslog(LOG_NOTICE, "%s(): Semaphore (id = %d) is created.", __FUNCTION__, *(ID*)ent->retvalptr); #endif ercd = E_OK; } break; } case TSFN_CRE_FLG: { syslog(LOG_DEBUG, "%s(): MOD_CFG_ENTRY TSFN_CRE_FLG", __FUNCTION__); assert(probe_ldm_memory(ent->argument, sizeof(T_CFLG), ldm_can)); assert(probe_ldm_memory(ent->retvalptr, sizeof(ID), ldm_can)); T_CFLG pk_cflg = *(T_CFLG*)ent->argument; // TODO: check pk_csem ercd = acre_flg(&pk_cflg); assert(ercd > 0); if(ercd > 0) { // Store ID *(ID*)ent->retvalptr = ercd; #if defined(DEBUG) syslog(LOG_NOTICE, "%s(): Event flag (id = %d) is created.", __FUNCTION__, *(ID*)ent->retvalptr); #endif ercd = E_OK; } break; } default: syslog(LOG_ERROR, "%s(): Unsupported static function code %d.", __FUNCTION__, ent->sfncd); ercd = E_OBJ; } } // Rollback stage // TODO: implement this assert(ercd == E_OK); syslog(LOG_DEBUG, "%s(): text paddr: 0x%x, data paddr: 0x%x", __FUNCTION__, ldm_can->text_mempool, ldm_can->data_mempool); // Acting stage for(SIZE i = 0; i < ldm_can->cfg_entry_num; ++i) { MOD_CFG_ENTRY *ent = &ldm_can->cfg_table[i]; switch(ent->sfncd) { case TSFN_CRE_TSK: { T_CTSK pk_ctsk = *(T_CTSK*)ent->argument; if(pk_ctsk.tskatr & TA_ACT) { ercd = act_tsk(*(ID*)ent->retvalptr); assert(ercd == E_OK); } break; } default: syslog(LOG_ERROR, "%s(): Unsupported static function code %d.", __FUNCTION__, ent->sfncd); } } return ercd; }