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; }
Cherry Zhou:
您好,您的问题我们需要升级到英文论坛看下,链接如下。由于国外假期,给到答复的时间可能会有所延迟,敬请谅解:
https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1244102/tda4vm-tiovx-state-mutex-issue
,
霄 吴:
非常感谢支持呀,
还有一个要求,我看了您在英文论坛发的提问,有这么一句话:“such as mutexes with global SPI_lock. But there's no mutex here”
能不能改一下?应该是global spin_lock, 而不是global SPI_lock,这两个的意思应该差很远的。
在TI内部,是用SPI_lock简写"SPIN_lock"的吗?如果是的话,那就算我多操心了。
,
Cherry Zhou:
您好,请看以下答复:
同一节点会执行函数 tivxTargetNodeDescNodeMarkComplete 和 tivxTargetNodeDescCanNodeExecute。 只有在调用第一个函数后,才会调用第二个函数。 在这里,它们是由同一个节点调用的。 例如,node A 调用 tivxTargetNodeDescNodeMarkComplete,然后node A 本身调用 tivxTargetNodeDescCandodeExecute(),即从node A 的对象描述符中提取下一个节点信息。 只有在这之后,node B 才会被触发。
TIOVX framework 已经过多次测试,有些客户已经使用该框架投入生产。所以此处并不会有问题。
详情请见英文论坛答复。
,
霄 吴:
hi,cherry
前天我在英文论坛直接回复了,你们的同事似乎没看到,
能帮忙问一下进展吗?
,
Cherry Zhou:
好的我们来问下看。