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.

[参考译文] CC2652P:解决中断效率过低的问题

Guru**** 2589245 points
Other Parts Discussed in Thread: CC2652P

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1017501/cc2652p-on-the-problem-of-too-low-interrupt-efficiency

器件型号:CC2652P

大家好、我使用这个芯片 CC2652P。在测试期间、我发现使用 SDK 提供的中断回调函数、中断响应为70us、时间太长、因此我使用了 IOCINT 注册(void (* PFNHandler) 库中的函数、以重新处理来自中断源的调用。当触发中断时、我使用 GPIO_clearMultiDio 函数删除中断标志位。但在长时间快速休息后、中断无法继续、 我想知道中断源中是否有任何我没有完成的操作、同时、我更改了中断源的触发函数、 但中断响应时间仍然太长。我在 interr_doc.h 上看到贵公司的描述、即在中断源之前添加了一个小延迟。我想知道是否有其他方法来解决这个问题。

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我假设您引用  的是 DriverLib 文档中的 I/O 控制器和中断资源?  以下是一些与您的需求相关的其他 E2E 帖子:

    https://e2e.ti.com/f/1/t/1008629 
    https://e2e.ti.com/f/1/t/789323 
    https://e2e.ti.com/f/1/t/1011192 
    https://e2e.ti.com/f/1/t/855676 

    如果您继续遇到任何困难、请告诉我。  我不熟悉  interr_doc.h、您能否指向可从中找到它的目录?

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Interrupt_doc.h 在 sourcexe/ti/device/ccc13x2_cc26x2/driverlib 中、我在我自己的中断源调用函数中使用了 GPIO_clearMultiDio、但如果发生过快的中断、则该中断源中的一个外部中断没有响应

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    //这是我的代码

    静态内联空
    myIOCIntRegister (void (* pfnHandler)(void))(空)

    //注册中断处理程序。
    IntRegister (INT_AON_GPIO_EDGE、pfnHandler);

    中断优先级拉到最高 μ s
    IntPrioritySet (INT_AON_GPIO_EDGE,0);

    //启用 IO 边缘中断。
    IntEnable (INT_AON_GPIO_EDGE);

    void PIN_IRQ_init (void)

    //IntRegister (INT_I2C_IRQ、IRQ_Hand);
    //IntEnable (INT_I2C_IRQ);
    myIOCIntRegister (IRQ_Hand);

    void IRQ_Hand (void)(空)

    IntDisable (INT_AON_GPIO_EDGE);
    _nop();
    _nop();
    if (hw_resource.gpio_key1!= PIN_Unassigned)

    if (my1GPIO_getEventMultiDio (IOID2PIN (GPIOCC26XX_CONFIG.pinConfigs[HW_resource.GPIO_key1])))

    //if (!myGPIO_readMultiDio (IOID2PIN (GPIOCC26XX_config.pinConfigs[HW_resource.GPIO_key1])))
    //{
    GPIO_key1_ISR (0);
    //myLED_TST_ON ();
    myGPIO_clearMultiDio (IOID2PIN (GPIOCC26XX_config.pinConfigs[HW_resource.GPIO_key1]));
    //GPIO_clearInt (HW_resource.GPIO_key1);
    //}
    //else{
    //GPIO_key1_ISR (0);
    //myLED_TST_OFF ();
    //myGPIO_clearMultiDio (IOID2PIN (GPIOCC26XX_config.pinConfigs[HW_resource.GPIO_key1]));
    //}

    IntEnable (INT_AON_GPIO_EDGE);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现、即使我重新定义了中断源的调用函数、中断的效率仍然大约为60uS、并且 CPU 没有休眠。 您能告诉我如何更快地优化它吗

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您澄清文件名和位置。  我希望您的代码使用 IOC*函数(IOCPortConfigureSet、IOCIntClear、IOCIntEnable 等)进行特定的 GPIO 引脚分配。  您也可以使用"答复"框中的"插入"->"代码"来设置代码片段的格式。  您是否说您能够成功实现 driverlib 解决方案、但这只能将中断延迟降低10us?  您能否通过将 项目用作模板来提供示例?

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #define IOID2PIN (ioID)  (1  << ioID)
    #define key1 GPIOCC26XX_DIO_11
    #define LED1 IOID_6

      IRQ_Handle ()
        GPIO_clearMultiDio (IOID2PIN (key1));
        _nop()
        _nop()
        if (GPIO_readMultiDio (IOID2PIN (key1)))
        {
            GPIO_Write (key1、1);
        }
        其他
        {
            GPIO_Write (key1、0);
        }






    int  main (空)
        GPIO_setConfig (LED1、 GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_setConfig (key1、 GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_INT_Both _edges);

        IOCIntRegister (IRQ_Handle);
        while (1)
        {
            睡眠(1)
        }
        

    这是类似的代码、您可以尝试、我仍然需要为什么清除中断源、但在多次快速中断后、中断不可用、即使如此、延迟也大约为60μs μ s、 这是该函数之前程序延迟的主要原因、我想知道您能否告诉我如何解决它

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我看到与此代码相关的几个方面:IOCIntEnable 从未使用、GPIO_Write 用于配置为输入的引脚、使用*多路复用命令实现单个 DIO、缺少 LED1功能、  µs  µs (1)应进入待机状态1秒并且从待机状态到激活状态的唤醒时间通常为数据表中的160 μ s ( 从空闲到活动状态为14 μ s)。  我建议您参考其他示例以进一步优化您的用例。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、我根据库中的库说明中断程序、在重写完成后、开始了一段时间可以使用、例如一段时间无法使用、 我发现、在我获得 I/O 异常状态的寄存器并清除寄存器的状态后、 我发现、无论如何读取还是写入、都使用1 in 标志来完成、因此我猜该寄存器不是真正的硬件寄存器、而是固定的合法存储器、这是否会影响我自己的中断操作、 现在我不知道中断无法触发时中断程序是否会进入、因为如果中断源程序正在进入、我无法在中断源程序中打印、但因为我使用 GPIO_getEventMultidio 函数来获取标志位不可用、 我无法执行相应的 I/O 处理程序函数,您能给我一个解决方案吗? 非常感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不完全理解您的解释、您能否提供代码片段来帮助澄清问题?

    此致、
    Ryan