主题中讨论的其他部件:Z-stack
我正在将TI Z-Stack Linux网关移植到ARM平台,但有一些问题。
我想知道如何调用zspbProcessEvent()函数,以及在哪里添加调试信息代码。 谢谢。
此致,
彼得。
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.
我正在将TI Z-Stack Linux网关移植到ARM平台,但有一些问题。
我想知道如何调用zspbProcessEvent()函数,以及在哪里添加调试信息代码。 谢谢。
此致,
彼得。
您好,Peter,
您可以从建立此函数的zstackpb.c中调试此函数。
/********************************************************************* * @fn zspbProcessEvent * * @brief ZStack Protobuf Task event processor. This function * is called to process all events for the task. Events * include timers, messages and any other user defined events. * * @param task_id - The OSAL assigned task ID. * @param events - events to process. This is a bit map and can * contain more than one event. * * @return none */
它在osal_ZStack_server_Znp.c中使用,后者 为每个任务调用初始化函数。 在使用 osal_msg_send传输之前,Znp_misc.c中设置了多个相关事件。 示例包括 ZDO_CB_MSG, AF_DATA_CONFIRM_CMD和 AF_INNEING_MSG_CMD。
此致,
Ryan
未调用的zspbProcessEvent()可能是由Hal_ProcessPoll()引发的,在调用带 SYS_EVENT_MSG的osal_msg_send和osal_msg_enqueue_push和osal_set_event后,该调用在osal_run_system()中无法返回。 我通过在 Hal_ProcessPoll()之前和之后添加调试信息进行调试。 在 Hal_ProcessPoll()中,任何原因都可以被阻止,即使osal_set_event DID调用?
OSAL,c代码使用密集 的HAL_ENTER_critical_section和HAL_EXIT_critical_section。 但是我不明白为什么这些API 可以工作,因为它使用使用halInterupts的HAL_DISABLE_Interrupts? 我在移植到ARM平台时没有修改OSAL相关代码,因为它编译正常。
彼得。
HAL_ProcessPoll应该在轮询函数中等待,直到 给出有效的SetPollTimeOut,这应该发生在osal_set_event中。 否则可能表示轮询功能存在问题。
hal_mcu.h显示关键部分对于此平台大多数是良性的,因为它们只影响 HAL_Interrups_are启用使用的本地halInterupts变量,但不会在项目中的任何其他位置引用。
此致,
Ryan
您好,Ryan:
您说:"它们代表着一个占位符,供开发人员根据其平台要求添加自己的用途。" 我认为 应该保护任务,否则可能会出现一些竞争情况。 我还有三个问题。
1.它是否意味着"x86 PC platform"应该具有此占位符的实现? 当前的TI源未实现它。 它怎么会起作用?
2.您是否意味着在移植到ARM平台时必须实施OSAL功能?
3.如何知道此源代码中与平台相关的占位符?
此致,
彼得。
1.如示例所示,此功能不是操作的要求。 在MCU上的Z-Stack实施过程中,在执行关键操作时禁用/恢复硬件中断非常有用。
2. 此API允许独立于操作系统,内核或任务环境(包括控制环路或连接到中断系统)的具体信息来编写Z-stack中的软件组件。 从理论上讲,可能会删除此层,但这将是一项很大的任务,因为项目资源对它的使用非常频繁。
3.这是一个好问题,但本示例的缺点之一是,这些依赖性尚未完全明确。 您可以按照package_builder target_platform定义和Makefile编译标志获取更多信息。
此致,
Ryan
您好,Ryan:
感谢您对(1)和(2)的解释和确认。 我记下(3),并在稍后有时间时进行调查。
我找到了当存在osal_set_event时Hal_ProcessPoll()函数被阻止的原因,但我不知道为什么在我的ARM平台上发生了这种情况。
原因是:使用sigqueue()来表示poly()不工作。 当我用kill() API替换时,这是正常的。
这两个API之间的区别是没有为kill() API传递参数。 但它是有效的。
此致,
彼得。