This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TDA4VM: 关于tiovx状态互斥的问题

Part Number: TDA4VM


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;
}