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; }