Пример #1
0
//----初始化中断---------------------------------------------------------------
//功能?初始化中断硬件,初始化中断线数据结构
//      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();                //接通总中断开关
}
Пример #2
0
//----初始化中断硬件相关部分---------------------------------------------------
//功能: 如标题
//参数: 无
//返回: 无
//注: 移植敏感,与硬件相关,也与软件策略有关
//-----------------------------------------------------------------------------
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的中断
}