![MTK中的nvram的操作實(shí)現(xiàn)_第1頁(yè)](http://file4.renrendoc.com/view11/M00/10/03/wKhkGWWOEQ2ATw8zAAFIPnm1s5I262.jpg)
![MTK中的nvram的操作實(shí)現(xiàn)_第2頁(yè)](http://file4.renrendoc.com/view11/M00/10/03/wKhkGWWOEQ2ATw8zAAFIPnm1s5I2622.jpg)
![MTK中的nvram的操作實(shí)現(xiàn)_第3頁(yè)](http://file4.renrendoc.com/view11/M00/10/03/wKhkGWWOEQ2ATw8zAAFIPnm1s5I2623.jpg)
![MTK中的nvram的操作實(shí)現(xiàn)_第4頁(yè)](http://file4.renrendoc.com/view11/M00/10/03/wKhkGWWOEQ2ATw8zAAFIPnm1s5I2624.jpg)
![MTK中的nvram的操作實(shí)現(xiàn)_第5頁(yè)](http://file4.renrendoc.com/view11/M00/10/03/wKhkGWWOEQ2ATw8zAAFIPnm1s5I2625.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
NVRAM讀寫操作詳解在MTK中,NVRAM是作為一個(gè)獨(dú)立的task來(lái)運(yùn)行的。在nvram_main.c文件中,(代碼有刪減,注釋部分用黃色標(biāo)出,便于閱讀)voidnvram_task_main(task_entry_struct*task_entry_ptr){kal_get_my_task_index(&my_index);/*nvramspecialservice*/nvram_special_service();while(1){//從Q中得到消息receive_msg_ext_q(task_info_g[task_entry_ptr->task_indx].task_ext_qid,¤t_ilm);stack_set_active_module_id(my_index,current_ilm.dest_mod_id); //處理消息nvram_main(¤t_ilm); //釋放消息free_ilm(¤t_ilm);}}Nvram_main函數(shù),處理NVRAM相關(guān)的消息voidnvram_main(ilm_struct*ilm_ptr){if(ilm_ptr!=NULL){if((ilm_ptr->msg_id>=MSG_ID_NVRAM_CODE_BEGIN)&&(ilm_ptr->msg_id<=MSG_ID_NVRAM_CODE_END)){if(ilm_ptr->msg_id==MSG_ID_NVRAM_STARTUP_REQ){ //STARTUP消息nvram_startup_handler(ilm_ptr);}elseif(ilm_ptr->msg_id==MSG_ID_NVRAM_RESET_REQ){ //RESET消息nvram_reset_handler(ilm_ptr);}elseif(ilm_ptr->msg_id==MSG_ID_NVRAM_READ_REQ){ nvram_read_handler(ilm_ptr); //READ消息}elseif(ilm_ptr->msg_id==MSG_ID_NVRAM_WRITE_REQ){nvram_write_handler(ilm_ptr);//WRITE消息}elseif(ilm_ptr->msg_id==MSG_ID_NVRAM_SET_LOCK_REQ){nvram_set_lock_handler(ilm_ptr);//LOCK消息,比較多用在TST中}}}/*endofmodulemainfunction*/也可以看到NVRAMtask處理幾個(gè)消息.READ流程從NV中讀取一個(gè)數(shù)據(jù),例如讀取語(yǔ)言設(shè)置信息:ReadValue(NVRAM_SETTING_LANG,&data,DS_BYTE,&error);我們需要注明,NVRAM的LID,讀取數(shù)據(jù)存放的指針,數(shù)據(jù)類型,和返回錯(cuò)誤信息的地址.#defineReadValue(nId,pBuffer,nDataType,pError)\ReadValueInt(nId,pBuffer,nDataType,pError,__FILE__,__LINE__)ReadValue精簡(jiǎn)了兩個(gè)參數(shù),不需要注明文件和第多少行,方面了應(yīng)用使用.看一下ReadValueInt這個(gè)函數(shù).我們來(lái)看看這個(gè)函數(shù)到底干了什么事情:S32ReadValueInt(U8nDataItemId,void*pBuffer,U8nDataType,S16*pError,S8*fileName,S32lineNumber){switch(nDataType){caseDS_BYTE:{ //byteDataReadFlag先記住這個(gè)標(biāo)志,它標(biāo)志了byte的數(shù)據(jù)是否已經(jīng)被讀取,所以從這里我們可以猜測(cè),NVRAM的數(shù)據(jù),應(yīng)該不是每次都從硬件讀取的,而是有緩存的(記住這個(gè)假設(shè),稍后驗(yàn)證)/*secondtimereading,italwasyreturnonerequestitem*/if(byteDataReadFlag){ //這個(gè)注釋就更加明白了/*DataiscachednoneedtoreadfromNVRAM*/memcpy(pBuffer,&byte_data[nDataItemId*nDataType],nDataType);status=DS_BYTE;error=NVRAM_READ_SUCCESS;}/*processfirsttimereadingalldataandreturnfirstrequestitemdata*/else{/*ReaddatafromtheNVRAMfile*/ //這才從NVRAM文件中讀取 //這個(gè)BUFFER的大小,8*512=4KU8tempBuffer[NVRAM_CACHE_SIZE]; //這個(gè)函數(shù)重點(diǎn)分析status=ReadRecordInt(NVRAM_EF_CACHE_BYTE_LID,1,tempBuffer,sizeof(tempBuffer),&error,fileName,lineNumber);/*copyoutalltotalreadingdata*/ //把讀取的數(shù)據(jù)copy到byte_data里面去memcpy(byte_data,tempBuffer,sizeof(tempBuffer)); //這個(gè)時(shí)候把這個(gè)flag置上了byteDataReadFlag=1;/*returnfirstrequestitemdata*/memcpy(pBuffer,&byte_data[nDataItemId*nDataType],nDataType);status=DS_BYTE;error=NVRAM_READ_SUCCESS;}break;}/*EndofcaseDS_BYTE*///后面的SHORT,DOUBLE同樣道理caseDS_SHORT:{}/*EndofcaseDS_SHORT*/caseDS_DOUBLE:{}/*EndofcaseDS_DOUBLE*/}*pError=error;returnstatus;}ReadValueInt總結(jié):這個(gè)函數(shù),就是把以前讀好的三個(gè)數(shù)組的數(shù)據(jù)拿出來(lái),如果還沒(méi)有從NVRAM讀取到cashe里面,就讀一次.關(guān)鍵的函數(shù)是:ReadRecordInt.第一次讀BYTE類型的數(shù)據(jù)之前,三個(gè)數(shù)組都是空的,flag也是空的,讀一個(gè)之后,byte數(shù)據(jù)被從NVRAM文件中讀入到cashe中,放在byte的數(shù)組里面,byteflag也被置上了.下次再讀的byte,就只需要從CACHE中讀取就可以了.同理,short和double數(shù)據(jù)也相同.來(lái)看看它是怎么做的#defineReadRecordInt(nFileId,nRecordId,pBuffer,nBufferSize,pError,fileName,lineNumber)\AccessRecordInt(nFileId,nRecordId,pBuffer,nBufferSize,1,pError,MMI_FALSE,MMI_TRUE,fileName,lineNumber)S32AccessRecordInt(U16nFileId,U16nRecordId,void*pBuffer,U16nBufferSize,U16nRecordAmount,S16*pError,pBOOLisWrite,pBOOLisValue,S8*filename,S32lineNumber){MYQUEUEqueueNode;S32status=-1;U32my_index;circularQ_check_enumcircularQ_check_result=circularQ_check_never_check;staticU8nvram_req_count=0;MMI_BOOLtoPush;if(isWrite){//WRITE的先放一下,先看READ的再說(shuō)}else{ //發(fā)了一個(gè)消息 SendNVRAMReadReq(nFileId,nRecordId,nRecordAmount);//這個(gè)函數(shù)調(diào)用了Message.oslMsgId=MSG_ID_MMI_EQ_NVRAM_READ_REQ;//OslMsgSendExtQueue(&Message),發(fā)了一個(gè)REQ消息到Q上去.}in_nvram_procedure++;//REQ消息發(fā)完了,接下來(lái)就等RSP消息來(lái)while(1){/*ifmorethan1accessrequestexist,gothroughthecircularQ*/if((nvram_req_count>0)&&(circularQ_check_result==circularQ_check_never_check)){circularQ_check_result=NVRAMCheckCircularQ(&queueNode,nFileId);}if(circularQ_check_result!=circularQ_check_found){OslReceiveMsgExtQ(mmi_ext_qid,&queueNode);OslGetMyTaskIndex(&my_index);OslStackSetActiveModuleID(my_index,MOD_MMI);}//這個(gè)標(biāo)志位先置空,不管,先記住它toPush=MMI_FALSE;switch(queueNode.msg_id){//這里列出了很多消息,其他不管,先找READ_RSP消息再說(shuō)caseMSG_ID_MMI_EQ_PLAY_AUDIO_RSP:caseMSG_ID_MMI_EQ_STOP_AUDIO_RSP:caseMSG_ID_MMI_EQ_EXE_GPIO_LEVEL_RSP:caseMSG_ID_MMI_EQ_SET_VOLUME_RSP:caseMSG_ID_MMI_EQ_KEYPAD_DETECT_IND:caseMSG_ID_TIMER_EXPIRY://就它了caseMSG_ID_MMI_EQ_NVRAM_READ_RSP:{mmi_eq_nvram_read_rsp_struct*readMessage;readMessage=(mmi_eq_nvram_read_rsp_struct*)queueNode.oslDataPtr;{if(readMessage->result.flag==MMI_OK){ //讀成功了,再比較一下數(shù)據(jù)大小是不是合格if(readMessage->length>nBufferSize){}elseif(readMessage->length<nBufferSize){}else{memcpy(pBuffer,readMessage->data,readMessage->length);*pError=NVRAM_READ_SUCCESS;}status=readMessage->length;}OslFreeInterTaskMsg(&queueNode);}toPush=MMI_TRUE;break;}caseMSG_ID_MMI_EQ_NVRAM_WRITE_RSP:}//這個(gè)flag標(biāo)志是否讀取成功if(toPush==MMI_TRUE){ilm_structilm_ptr;flag=OslWriteCircularQ(&ilm_ptr);OslFreeInterTaskMsg(&queueNode);}}}AccessRecordInt總結(jié):這個(gè)函數(shù)是個(gè)真正的讀取函數(shù),發(fā)REQ消息給NVRAMTASK,等待RSP消息,得到讀取數(shù)據(jù).寫入流程重點(diǎn)分析WriteValueInt這個(gè)函數(shù)S32WriteValueInt(U8nDataItemId,void*pBuffer,U8nDataType,S16*pError,S8*fileName,S32lineNumber){switch(nDataType){//還拿BYTE來(lái)說(shuō)caseDS_BYTE:{ //已經(jīng)從NVRAM到CACHE里面了/*secondtimeaccess,italwayssetstherequestitem*/if(byteDataReadFlag){/*DataiscachednoneedtoreadfromNVRAM*/memcpy(&byte_data[nDataItemId*nDataType],pBuffer,nDataType);/*writeintoNVRAMmodule,ifnotwaitforfalshingdirectly*/if(!byteDataWriteFlashFlag){status=WriteRecordInt(NVRAM_EF_CACHE_BYTE_LID,1,byte_data,NVRAM_CACHE_SIZE,&error,fileName,lineNumber);}status=DS_BYTE;error=NVRAM_WRITE_SUCCESS;} //還沒(méi)有讀到CACHE里面/*processfirsttimeaccessalldataandreturnfirstwriteitemdata*/else{ //那就讀到CACHE/*ReadalldatafromtheNVRAMfile*/status=ReadRecordInt(NVRAM_EF_CACHE_BYTE_LID,1,byte_data,NVRAM_CACHE_SIZE,&error,fileName,lineNumber);memcpy(&byte_data[nDataItemId*nDataType],pBuffer,nDataType); //讀好了,就寫吧/*writeintoNVRAMmodule,ifnotwaitforfalshingdirectly*/if(!byteDataWriteFlashFlag){ //關(guān)鍵還是WriteRecordIntstatus=WriteRecordInt(NVRAM_EF_CACHE_BYTE_LID,1,byte_data,NVRAM_CACHE_SIZE,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金錢與期刊:媒體禁制令及一稿多投禁制
- 區(qū)塊鏈共識(shí)機(jī)制與改進(jìn)算法研究進(jìn)展
- 生長(zhǎng)因子促進(jìn)膝軟骨再生:研究熱點(diǎn)的文獻(xiàn)計(jì)量學(xué)分析
- 基于機(jī)器視覺(jué)的智能車系統(tǒng)設(shè)計(jì)
- 考慮失效相關(guān)性的無(wú)人機(jī)飛控系統(tǒng)可靠性分配與預(yù)計(jì)
- 基于藍(lán)牙的LBS系統(tǒng)攻擊檢測(cè)方法研究
- 基于強(qiáng)化學(xué)習(xí)的圓柱尾跡控制與機(jī)器魚(yú)步態(tài)優(yōu)化研究
- 2025年長(zhǎng)春貨運(yùn)資格證考試70題
- 2025年粵教新版必修1物理下冊(cè)階段測(cè)試試卷含答案
- 機(jī)構(gòu)改革人員協(xié)議書(shū)(2篇)
- 《環(huán)境管理學(xué)》教案
- 2025年蛇年年度營(yíng)銷日歷營(yíng)銷建議【2025營(yíng)銷日歷】
- (一模)寧波市2024學(xué)年第一學(xué)期高考模擬考試 數(shù)學(xué)試卷(含答案)
- 父母贈(zèng)與子女農(nóng)村土地協(xié)議書(shū)范本
- 集團(tuán)母子公司協(xié)議書(shū)
- 中醫(yī)病證診斷療效標(biāo)準(zhǔn)
- 南安市第三次全國(guó)文物普查不可移動(dòng)文物-各鄉(xiāng)鎮(zhèn)、街道分布情況登記清單(表五)
- ITSMS-D-038 問(wèn)題記錄表范本
- 第1課+古代亞非(教學(xué)設(shè)計(jì))【中職專用】《世界歷史》(高教版2023基礎(chǔ)模塊)
- 物業(yè)客服管家的培訓(xùn)課件
- 2024年房地產(chǎn)行業(yè)的樓市調(diào)控政策解讀培訓(xùn)
評(píng)論
0/150
提交評(píng)論