static FUNC_P2VAR(uint8, NVM_APPL_DATA, NVM_CODE) NvM_MainFun_GetRomBlockAddr(void) { uint8 dateIndexTemp = NVM_INIT_0; uint8* retValue = NULL_PTR; Nvm_BlockManagment_st *blockMngmnt; const NvM_Block_Descriptor_Table_st blockTab; / Get managment information of current job. / blockMngmnt = &NvM_gstaBlockVar[NvM_QueueCrrntJob.CurBlockId]; / Get block definition of current jobc / blockTab = &NvM_Block_Descriptor_Table[NvM_QueueCrrntJob.CurBlockId]; / Check if the dataset point the NV for dataset NVRAM. / if( (NVM_BLOCK_MANAGENMENT_DATASET == blockTab->ManagementType) && (blockMngmnt->DataIndex >= blockTab->NvBlockNum) ) { / Get date index of rom block. / dateIndexTemp = blockMngmnt->DataIndex - blockTab->NvBlockNum; } else if( blockTab->RomAddr != NULL_PTR ) { retValue = blockTab->RomAddr; } else { / Do nothing. / } / Check if the rom block is configed. / if( (dateIndexTemp < blockTab->RomBlockNum) && (blockTab->RomAddr != NULL_PTR) ) { / Check the data index for block type of DATASET and the index is ponits to nv block. */ if( (blockTab->ManagementType == NVM_BLOCK_MANAGENMENT_DATASET) && (blockMngmnt->DataIndex >= blockTab->NvBlockNum) ) { retValue = blockTab->RomAddr + (dateIndexTemp * (blockTab->NvBlockLength - Nvm_CrcCalc_Size_Table[blockTab->CrcType] - NVM_STATICID_LENGTH) ); } } return retValue; }逐句解释代码
时间: 2024-02-01 09:02:23 浏览: 140
这段代码是 NvM 模块中的一个函数,用于获取 ROM 块的地址。下面逐句解释每一行代码的作用:
```c
static FUNC_P2VAR(uint8, NVM_APPL_DATA, NVM_CODE) NvM_MainFun_GetRomBlockAddr(void) {
```
这是函数的定义,表示这个函数返回一个指向 uint8 类型的指针,该指针指向的内容位于 NVM_APPL_DATA 段中,并且该函数位于 NVM_CODE 段中。
```c
uint8 dateIndexTemp = NVM_INIT_0;
uint8* retValue = NULL_PTR;
Nvm_BlockManagment_st *blockMngmnt;
const NvM_Block_Descriptor_Table_st blockTab;
```
这里定义了一些变量,dateIndexTemp 用于存储数据索引,retValue 用于存储返回值,blockMngmnt 和 blockTab 用于存储当前作业的块管理信息和块描述信息。
```c
blockMngmnt = &NvM_gstaBlockVar[NvM_QueueCrrntJob.CurBlockId];
blockTab = &NvM_Block_Descriptor_Table[NvM_QueueCrrntJob.CurBlockId];
```
这里获取当前作业的块管理信息和块描述信息。
```c
if( (NVM_BLOCK_MANAGENMENT_DATASET == blockTab->ManagementType) && (blockMngmnt->DataIndex >= blockTab->NvBlockNum) ) {
dateIndexTemp = blockMngmnt->DataIndex - blockTab->NvBlockNum;
} else if( blockTab->RomAddr != NULL_PTR ) {
retValue = blockTab->RomAddr;
} else {
// Do nothing.
}
```
这里根据块描述信息中的管理类型和块管理信息中的数据索引,判断 ROM 块是否存储在 NVRAM 中。如果 ROM 块存储在 NVRAM 中,则计算出 ROM 块在 NVRAM 中的索引。否则,如果块描述信息中的 ROM 地址不为空,则将 ROM 地址存储到 retValue 中。
```c
if( (dateIndexTemp < blockTab->RomBlockNum) && (blockTab->RomAddr != NULL_PTR) ) {
if( (blockTab->ManagementType == NVM_BLOCK_MANAGENMENT_DATASET) && (blockMngmnt->DataIndex >= blockTab->NvBlockNum) ) {
retValue = blockTab->RomAddr + (dateIndexTemp * (blockTab->NvBlockLength - Nvm_CrcCalc_Size_Table[blockTab->CrcType] - NVM_STATICID_LENGTH) );
}
}
```
如果 ROM 块存在且当前作业的块管理信息中的数据索引指向了 NVRAM 中的块,则计算出该 ROM 块在 NVRAM 中的地址,并将其存储到 retValue 中。最后将 retValue 返回。
阅读全文