hi, TI experts
我阅读了tiovx里面的framework/vx_target.c文件,第573行和第234行,关于node_desc_obj->flags的读写问题.
分别对应了两个函数:tivxTargetNodeDescNodeMarkComplete和tivxTargetNodeDescCanNodeExecute。
第573行执行了这条代码:tivxFlagBitSet(&node_obj_desc->flags, TIVX_NODE_FLAG_IS_EXECUTED)
第234行执行了这条代码:tivxFlagIsBitSet(prev_node_obj_desc->flags, TIVX_NODE_FLAG_IS_EXECUTED)
假如有NodeA和NodeB,它俩分别在DSP0和DSP1,有这样的情况:
NodeA完成了之后,自己需要将node_desc_obj->flags置成TIVX_NODE_FLAG_IS_EXECUTED。
NodeB在DSP1上,要检查NodeA的node_desc_obj->flags,这个时候应该读取NodeA的这个flags。
我认为这两个在不同的CPU上,这俩关于同一目标内存的读写应该需要同步,比如用TI提供的全局的spin_lock进行互斥。
但是,我不明白为什么这两个地方没有去做这个互斥?
node_desc_obj全是uncache的share_mem,所以就不需要加锁互斥了,是这样的吗?
或者说出于别的什么考虑,就不需要互斥了?
希望TI的专家能够帮忙解释一下。
补充一下,vx_target.c第573行(在tivxTargetNodeDescNodeMarkComplete里面)附近的代码如下:
static void tivxTargetNodeDescNodeMarkComplete(tivx_obj_desc_node_t *node_obj_desc, uint16_t *blocked_node_id)
{
/* check if any node is blocked on this node to get unblocked and complete execution
* This will be a node from next pipeline instance
*/
*blocked_node_id = node_obj_desc->blocked_node_id;
node_obj_desc->blocked_node_id = (vx_enum)TIVX_OBJ_DESC_INVALID;
node_obj_desc->state = TIVX_NODE_OBJ_DESC_STATE_IDLE;
tivxFlagBitSet(&node_obj_desc->flags, TIVX_NODE_FLAG_IS_EXECUTED); //my confused code
}
vx_target.c第234行(在tivxTargetNodeDescCanNodeExecute里面)附近的代码如下:
static vx_bool tivxTargetNodeDescCanNodeExecute(
const tivx_obj_desc_node_t *node_obj_desc)
{
tivx_obj_desc_node_t *prev_node_obj_desc;
uint16_t prev_node_obj_desc_id;
uint16_t i;
vx_bool can_execute = (vx_bool)vx_true_e;
for(i=0; i<node_obj_desc->num_in_nodes; i++)
{
prev_node_obj_desc_id = node_obj_desc->in_node_id[i];
prev_node_obj_desc = (tivx_obj_desc_node_t*)tivxObjDescGet(prev_node_obj_desc_id);
if( tivxObjDescIsValidType( (tivx_obj_desc_t*)prev_node_obj_desc, TIVX_OBJ_DESC_NODE) != 0)
{
if( tivxFlagIsBitSet(prev_node_obj_desc->flags,
TIVX_NODE_FLAG_IS_EXECUTED) == (vx_bool)vx_false_e) //my confused
{
can_execute = (vx_bool)vx_false_e;
}
}
}
return can_execute;
}