/* 记录下一个ID以进行优先级比较*/ loopBlockId = NvM_gstaBlockVar[loopBlockId].NxtBlockId; if( TRUE == flag ) { rtrnValu = E_OK; break; } } /* 如果这个事情是最紧急的优先事项。*/ if( (NVM_BLOCK_HIGHEST_PRI == NvM_gstaBlockVar[BlockId].Priority) && (NVM_WRITE_BLOCK == NvM_Ctrl) ) { /* 立即计数加一。*/ Nvm_QueueHeader.CounterImmediate++; } /* 增加队列的数量。*/ Nvm_QueueHeader.Counter++; } return rtrnValu; }逐句解释代码
时间: 2024-01-07 08:03:19 浏览: 65
这段代码是C语言的函数,功能是将数据块写入NVM(Non-Volatile Memory)存储器中,并根据优先级排序。下面逐句解释代码的功能:
```
Std_ReturnType NvM_WriteBlock(NvM_BlockIdType BlockId, const void *NvM_SrcPtr)
```
该函数接受两个参数:数据块的ID和指向数据块的指针,并返回一个类型为Std_ReturnType的值。
```
{
Std_ReturnType rtrnValu = E_NOT_OK; //初始化返回值为E_NOT_OK
boolean flag = FALSE; //初始化标志位为FALSE
NvM_RequestResultType NvM_Ctrl = NVM_REQ_PENDING; //初始化NvM_Ctrl的值为NVM_REQ_PENDING
```
初始化返回值rtrnValu为E_NOT_OK,标志位flag为FALSE,NvM_Ctrl的值为NVM_REQ_PENDING。
```
if(NvM_Queue_CheckForWriteOp(BlockId) == E_NOT_OK) //检查队列是否有写入操作
{
/* 如果此时没有写入操作,将数据块添加到队列中。*/
NvM_AddBlockToQueue(BlockId, NvM_SrcPtr, NVM_WRITE_BLOCK); //将该数据块添加到队列中,标记为写入操作
}
```
如果队列中没有该数据块的写入操作,则将该数据块添加到队列中并标记为写入操作。
```
else //如果队列中有该数据块的写入操作
{
/* 如果该数据块是最紧急的事项,将其添加到队列的头部。*/
if(NvM_gstaBlockVar[BlockId].Priority == NVM_BLOCK_HIGHEST_PRI) //如果该数据块的优先级最高
{
/* 将数据块添加到队列的头部。*/
Nvm_QueueHeader.HeadIdx--; //队列头索引减一
NvM_gstaQueueEntries[Nvm_QueueHeader.HeadIdx].BlockId = BlockId; //将该数据块添加到队列头部
NvM_gstaQueueEntries[Nvm_QueueHeader.HeadIdx].DataPtr = NvM_SrcPtr;
NvM_gstaQueueEntries[Nvm_QueueHeader.HeadIdx].NvM_Ctrl = NVM_WRITE_BLOCK;
Nvm_QueueHeader.CounterImmediate++; //立即计数加一
flag = TRUE; //标志位设置为TRUE
}
/* 否则,将其添加到队列中。*/
else //如果该数据块的优先级低于最高
{
/* 找到该数据块的位置。*/
uint16_t loopBlockId = Nvm_QueueHeader.HeadIdx; //从队列头开始遍历
while(NvM_gstaBlockVar[loopBlockId].NxtBlockId < BlockId) //找到该数据块的位置
{
loopBlockId = NvM_gstaBlockVar[loopBlockId].NxtBlockId;
}
/* 将数据块添加到队列中。*/
NvM_gstaBlockVar[BlockId].NxtBlockId = NvM_gstaBlockVar[loopBlockId].NxtBlockId; //将该数据块添加到队列中
NvM_gstaBlockVar[loopBlockId].NxtBlockId = BlockId;
}
}
```
如果队列中已经有该数据块的写入操作,根据优先级将该数据块插入到队列中。如果该数据块的优先级最高,则将其添加到队列头部并立即计数加一;否则,遍历队列找到该数据块的位置并插入到队列中。
```
if(Nvm_QueueHeader.CounterImmediate > 0) //如果队列中有紧急任务
{
/* 执行最紧急的操作。*/
NvM_ExecuteQueueEntryImmediate(); //执行最紧急的操作
rtrnValu = E_OK; //返回值设置为E_OK
}
```
如果队列中有紧急任务,则执行最紧急的操作并将返回值设置为E_OK。
```
else //如果队列中没有紧急任务
{
/* 执行队列中的下一个操作。*/
if(Nvm_QueueHeader.Counter > 0) //如果队列中有任务
{
NvM_ExecuteQueueEntry(); //执行队列中的下一个操作
rtrnValu = E_OK; //返回值设置为E_OK
}
}
return rtrnValu; //返回函数值
}
```
如果队列中没有紧急任务,则执行队列中的下一个操作并返回函数值。如果队列为空,则返回E_NOT_OK。
阅读全文