//----初始化中断--------------------------------------------------------------- //功能?初始化中断硬件,初始化中断线数据结构 // 2.异步信号保持禁止,它会在虚拟机启动引擎中打开. // 3.总中断允许? // 用户初始化过程应该遵守如下规则: // 1.系统开始时就已经禁止所有异步信号,用户初始化时无须担心异步信号发生. // 2.初始化过程中如果需要操作总中断/实时中断/异步信号,应该成对使用.禁止使 // 异步信号实际处于允许状态(即异步和总中断开关同时允许). // 3.可以操作中断线,比如连接、允许、禁止等,但应该成对使用. // 4.建议使用save/restore函数对,不要使用enable/disable函数对. //参数?无 //返回?无 //----------------------------------------------------------------------------- void Int_Init(void) { ufast_t ufl_line; InitializeCriticalSection(&int_cs); tg_pIntSrcTable = malloc(tg_IntUsedNum * sizeof(struct tagIntLine)); if(tg_pIntSrcTable == NULL) return; __Int_InitHard(); __Int_ClearAllLine(); for(ufl_line=0;ufl_line <= CN_INT_LINE_LAST;ufl_line++) { tg_int_lookup_table[ufl_line] = (ufast_t)CN_LIMIT_UFAST; } for(ufl_line = 0; ufl_line < tg_IntUsedNum; ufl_line++) { tg_int_lookup_table[tg_IntUsed[ufl_line]] = ufl_line; tg_pIntSrcTable[ufl_line].en_counter = 1; //禁止中断,计数为1 tg_pIntSrcTable[ufl_line].int_type = CN_ASYN_SIGNAL; //设为异步信号 tg_pIntSrcTable[ufl_line].clear_type = CN_INT_CLEAR_PRE;//设为调用ISR前应答 //所有中断函数指针指向空函数 tg_pIntSrcTable[ufl_line].ISR = (u32 (*)(ufast_t))NULL_func; tg_pIntSrcTable[ufl_line].sync_event = NULL; //同步事件空 tg_pIntSrcTable[ufl_line].my_evtt_id = CN_EVTT_ID_INVALID; //不弹出事件 } for(ufl_line=0; ufl_line < CN_INT_BITS_WORDS; ufl_line++) { //属性位图清零,全部置为异步信号方式 tg_int_global.property_bitmap[ufl_line] = 0; //中断使能位图清0,全部处于禁止状态 tg_int_global.enable_bitmap[ufl_line] = 0; } tg_int_global.nest_asyn_signal = 0; tg_int_global.nest_real = 0; // tg_int_global.en_asyn_signal = false; Int_CutAsynSignal(); tg_int_global.en_asyn_signal_counter = 1; //异步信号计数 // tg_int_global.en_trunk = true; tg_int_global.en_trunk_counter = 0; //总中断计数 Int_ContactTrunk(); //接通总中断开关 }
//----初始化中断硬件相关部分--------------------------------------------------- //功能: 如标题 //参数: 无 //返回: 无 //注: 移植敏感,与硬件相关,也与软件策略有关 //----------------------------------------------------------------------------- void __Int_InitHard(void) { u32 i; int_disable_arm_int(); //禁止ARM的中断 pg_int_reg->CR = (0<<4) //读取中断号等寄存器时,不锁定相关寄存器 +(1<<2); //中断独立嵌套控制 __Int_ClearAllLine(); //系统启动前如果有中断挂起,应答掉 pg_int_reg->ECR[0] = 0xffffffff; //以下4行除能所有中断号 pg_int_reg->ECR[1] = 0xffffffff; pg_int_reg->ECR[2] = 0xffffffff; pg_int_reg->ECR[3] = 0xffffffff; pg_int_reg->SECR[0] = 0xffffffff; //以下4行清除所有中断标志 pg_int_reg->SECR[1] = 0xffffffff; pg_int_reg->SECR[2] = 0xffffffff; pg_int_reg->SECR[3] = 0xffffffff; pg_int_reg->HIER = 0; //禁止L138的中断控制器中断 pg_int_reg->VBR = NULL; //我们并不适用中断基址寄存器, pg_int_reg->VSR = 0; pg_int_reg->VNR = (u32)NULL_func; //无效中断号置空 for(i = 0; i<26; i++) //所有中断设为异步信号的最低优先级 pg_int_reg->CMR[i] = 0x1f1f1f1f; int_enable_arm_int(); //使能ARM的中断 }