void test_for_pmuevent(void)
{   /*lint --e{732, 716 } */
    while (1)
    {
        start_time = bsp_get_elapse_ms();
        while (bsp_get_elapse_ms()-start_time <= busy_time)
        {
            ;
        }
        msleep(idle_time);
        if (!idle_time)
        {
            break;
        }
    }
}
void test_for_pmuevent(void)
{/*lint --e{716 } */
	while (1)
	{
		start_time = bsp_get_elapse_ms();
		while (bsp_get_elapse_ms()-start_time <= busy_time)
		{
			;
		}
		taskDelay((int)idle_time);
		if (!idle_time)
		{
			break;
		}
	}
}
/*****************************************************************************
 函 数 名  : mdrv_loadas
 功能描述  : 对外提供的镜像加载接口
 输入参数  : rat_mode 镜像类型
 输出参数  : 成功返回0,失败返回非0
*****************************************************************************/
int mdrv_loadas ( DRV_RAT_MODE_ENUM rat_mode )
{

    s32 ret = BSP_OK;
    loadps_msg loadps_msg;
    u32 elapsed;
    int overlay_index = 0;
    int magic =0 ;
    int page_left=0;
    struct loadps_header *pheader;
    struct ovly_addr_info *pRat_addr_info, *pOvly_addr_info;

    /*保证一次只有一个任务执行loadps*/
    osl_sem_down ( &loadps_mutex );
    g_loadps_debuginfo.call_cnt++;
    loadps_trace(BSP_LOG_LEVEL_INFO ,"rat_mode  %d\n" ,rat_mode);
    g_loadps_debuginfo.mdrv_start_ms = bsp_get_elapse_ms();

    if ((DRV_RAT_MODE_UMTS_FDD != rat_mode) && (DRV_RAT_MODE_UMTS_TDD != rat_mode))
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"rat_mode ERROR! %d\n" ,rat_mode);
        ret = -1;
        goto sem_up;
    }
    /*判断一下加载的镜像*/
    if (rat_mode == DRV_RAT_MODE_UMTS_TDD)
    {
        overlay_index = 1;
        magic = 0x00736174;
    }
    else if (rat_mode == DRV_RAT_MODE_UMTS_FDD)
    {
        overlay_index = 2;
        magic = 0x00736177;
    }
    g_loadps_debuginfo.rat_mode = rat_mode;
    pRat_addr_info  = _ovly_table + overlay_index;
    pOvly_addr_info = _ovly_table;
    (void)memset_s(&loadps_msg, sizeof(loadps_msg), 0x0, sizeof(loadps_msg));
    loadps_msg.rat_mode = rat_mode;
    /*加载到内存中的地址*/
    loadps_msg.addr = pRat_addr_info->addr;
    g_loadps_debuginfo.load_addr = loadps_msg.addr;
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps_msg.addr  0x%x\n" ,loadps_msg.addr);

    loadps_msg.size = pRat_addr_info->size;
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps_msg.size  0x%x\n" ,loadps_msg.size);

    ret = bsp_icc_send( ICC_CPU_APP, LOADPS_ICC_IFC_ID, (u8*)(&loadps_msg), sizeof(loadps_msg));

    if (sizeof(loadps_msg) != ret )
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"msg_size != ret: msg_size = 0x%x, ret = 0x%x\n", sizeof(loadps_msg), ret);
        ret = -1;
        goto sem_up;
    }
    g_loadps_debuginfo.send_icc_cnt++;
    /*把任务挂起,等待A核把镜像搬运的工作完成*/
    osl_sem_down ( &loadps_wait_complete_mutex );

    /*C核的任务被唤醒后执行*/
    g_loadps_debuginfo.recv_icc_cnt++;
    g_loadps_debuginfo.mdrv_wakeup_byacore_ms = bsp_get_elapse_ms();
    elapsed = g_loadps_debuginfo.mdrv_wakeup_byacore_ms - g_loadps_debuginfo.mdrv_start_ms;

    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps result = 0x%x and icc complete time %d ms\n", g_loadps_status.result,elapsed);
    ret = g_loadps_status.result;
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"loadps result = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps SRE_ICacheInv addr = 0x%x  size= 0x %x\n", pOvly_addr_info->addr, pOvly_addr_info->size);
    ret = SRE_ICacheInv((VOID *)pOvly_addr_info->addr, (UINT32)pOvly_addr_info->size, TRUE);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_ICacheInv error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps SRE_DCacheInv addr = 0x%x  size= 0x %x\n", pOvly_addr_info->addr, pOvly_addr_info->size);
    ret = SRE_DCacheInv((VOID *)pOvly_addr_info->addr, (UINT32)pOvly_addr_info->size, TRUE);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_DCacheInv error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    pheader = (struct loadps_header *)pRat_addr_info->addr;

    if (pheader->magic != magic)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"pheader->magic error = 0x%x\n", pheader->magic);
        ret = -1;
        goto sem_up;
    }
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps pheader->text_start= 0x%x  pheader->text_size= 0x %x\n", pheader->text_start, pheader->text_size);
    /*设置代码段只读可执行属性*/
    ret = SRE_MmuStateSet(pheader->text_start, pheader->text_size, 0, LOADPS_TEXT_MMU_ATTR);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_MmuStateSet TEXT error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    loadps_trace(BSP_LOG_LEVEL_INFO,"loadps pheader->data_start= 0x%x  pheader->data_size= 0x %x\n", pheader->data_start, pheader->data_size);
    if( pheader->data_size % PAGE_SIZE)
    {
        page_left = pheader->data_size % PAGE_SIZE;
        page_left = PAGE_SIZE - page_left;

    }
    /*设置数据段可读写属性*/
    ret = SRE_MmuStateSet(pheader->data_start, pheader->data_size+page_left, 0, LOADPS_DATA_MMU_ATTR);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_MmuStateSet data error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps pheader->bss_start= 0x%x  pheader->bss_size= 0x %x\n", pheader->bss_start, pheader->bss_size);
    /*清除bss段的内容*/
    memset_s((void*)pheader->bss_start, pheader->bss_size, 0x0, pheader->bss_size);

    /*Unwind信息的添加,方便打印私有镜像的调用栈信息*/
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps pheader->unwind_start= 0x%x  pheader->unwind_size= 0x %x\n", pheader->unwind_start, pheader->unwind_size);
    ret = SRE_UnwindTableAdd(pheader->unwind_start, pheader->unwind_start + pheader->unwind_size,\
                          pheader->text_start, pheader->text_start + pheader->text_size);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_UnwindTableAdd error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }
    /*符号表信息增加*/
    loadps_trace(BSP_LOG_LEVEL_INFO ,"loadps pheader->symbol_start= 0x%x  pheader->symbol_size= 0x %x\n", pheader->symbol_start, (pheader->symbol_size)/sizeof(OS_SYMBOL_NODE_S));
    /* Add Symbol table for this overlay section */
    ret = SRE_SymbolTableAdd((OS_SYMBOL_NODE_S*)pheader->symbol_start, (pheader->symbol_size)/sizeof(OS_SYMBOL_NODE_S), \
                          pRat_addr_info->addr, pRat_addr_info->addr + pRat_addr_info->size);
    if(ret != 0)
    {
        loadps_trace(BSP_LOG_LEVEL_ERROR ,"SRE_SymbolTableAdd error = 0x%x\n", ret);
        ret = -1;
        goto sem_up;
    }

sem_up:
    osl_sem_up ( &loadps_mutex );
    g_loadps_debuginfo.mdrv_SymbolTableAdd_ms = bsp_get_elapse_ms();
    elapsed = g_loadps_debuginfo.mdrv_SymbolTableAdd_ms - g_loadps_debuginfo.mdrv_start_ms;
    loadps_trace(BSP_LOG_LEVEL_ERROR ,"loadps total load time %d ms ret = %d\n", elapsed, ret);
    g_loadps_debuginfo.mdrv_total_elapsed_ms = elapsed;
    if(!ret)
    {
        g_loadps_debuginfo.succ_cnt++;
    }
    return ret;
}