BswM_RequestMode
主要就是分析一下模式请求的过程,这个过程涉及到模式的规则的执行,包括模式的仲裁以及模式的处理。
代码的调用结构
源码解析
1、查找用户索引
for(userHandle = 0; userHandle < BswM_GetSizeOfGenericState(); userHandle++)
{
if (BswM_GetExternalIdOfGenericMapping(userHandle) == requesting_user)
{
}
}
这里匹配userHandle是否在我们的配置表里面,userHandle指的是配置表格的索引值,requesting_user是在配置过程中生成的一个ID号,比如ESH_State的ID号就是230。配置表如下所示:
2、存储请求的状态
BswM_SetGenericState(userHandle, requested_mode);
userHandle代表数组的索引,requested_mode请求的状态存储到BswM_GenericState里面
3、开始仲裁
BSWM_CALL_IMMEDIATE(BswM_GetImmediateUserStartIdxOfGenericMapping(userHandle), BswM_GetImmediateUserEndIdxOfGenericMapping(userHandle), BSWM_REQUESTMODE_ID);
三个入参函数:
startIdx对应的该ModeRequestPort的规则起始点
endIdx对应的该ModeRequestPort的规则结束点
比如BswM_GENERIC_ESH_State对应的Id是230,startIdx为3,endidx是2
4、存储立刻仲裁的请求
BswM_GENERIC_ESH_State对应的start是2,结束是3,其实就是判断对应的规则仲裁是否处于IDLE状态,也就是数组的第二个元素的值的状态,如果是IDLE状态,设置对应的queue的状态,并将BswM_QueueWritten设置为TRUE。
5、处理请求
轮询队列请求,是否存在BSWM_REQUEST_QUEUED状态的规则,刚才设置存储的就是这个状态
根据对应的immediateUserIndex,也就是刚才的start的索引2,找到对应的ESH_State对应的相关的rule,ESH_State对应的RulesIndStartIdx为6,RulesIndEndIdx为14
BswM_GetRulesInd(ruleIndex)
根据6-14的索引找到对应的rule所在的索引
actionListIndex = BswM_GetFctPtrOfRules(BswM_GetRulesInd(ruleIndex))(); /* SBSW_BSWM_RULEFCTPTR */
根据BswM_GetRulesInd(ruleIndex)获取到的索引,找到对应的rule,并执行对应的函数。
比如目前是的状态仲裁的是BswM_Rule_ESH_InitToWakeup,对应的rule逻辑表达式为ESH_State是否等于ESH_INIT,如果为TRUE,则仲裁成立,返回对应的ActionList的索引。
BswM_SetActionListQueue(actionListIndex, BSWM_ACTIONLIST_PENDING);
BswM_SetModeRequestQueue(immediateUserIndex, BSWM_REQUEST_PROCESSED);
如果仲裁成立,返回actionListIndex,将需要执行的ActionList的索引存储下来,为后面执行做准备。
6、执行ActionList
根据actionlist的索引找到对应的actionlist
actionlist会包含配置的action,调用对应的action
BswM_ActionList_ESH_AL_InitToWakeup