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.

[参考译文] LP-EM-CC2340R5:执行附加任务是否会消耗更多功率?

Guru**** 2589265 points
Other Parts Discussed in Thread: SYSCONFIG, CC2340R5

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1384047/lp-em-cc2340r5-does-executing-an-additional-task-consume-more-power

器件型号:LP-EM-CC2340R5
主题中讨论的其他器件:SysConfigCC2340R5

工具与软件:

尊敬的 TI 团队:
我按照示例来创建一个任务、但是我已经注意到添加一个额外的任务会增加功耗。 是否有办法解决此问题?

int main()
{
  /* Register Application callback to trap asserts raised in the Stack */
  halAssertCback = AssertHandler;
  RegisterAssertCback(AssertHandler);

  Board_init();

  /* Update User Configuration of the stack */
  user0Cfg.appServiceInfo->timerTickPeriod = ICall_getTickPeriod();
  user0Cfg.appServiceInfo->timerMaxMillisecond  = ICall_getMaxMSecs();

  /* Initialize all applications tasks */
  appMain();

  sub_proc();
  /* Start the FreeRTOS scheduler */
  vTaskStartScheduler();

  return 0;

}


void *emsThread(void *arg0)
{

    /* Configure the LED pin */
    GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    GPIO_setConfig(CONFIG_GPIO_LED_1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    /* Turn on user LED to indicate successful initialization */
    GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
    GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);



    while(1)
    {
        if(connection_LED == 0)
        {
            if (sem_trywait(&sem) == 0)
            {
                UART2_write(uart, (char*)"device disconnect OK!\r\n", strlen((char*)"device disconnect OK!\r\n"), NULL);

            }

              GPIO_toggle(CONFIG_GPIO_LED_0);
              GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
              //            UART2_write(uart, (char*)"Please connect device\r\n", strlen((char*)"Please connect device\r\n"), NULL);

              usleep(250000);

        }
        else
        {

            if (sem_trywait(&sem) == 0) { //receive to sem
                UART2_write(uart, (char*)"device connect OK!\r\n", strlen((char*)"device connect OK!\r\n"), NULL);
            }
            //GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
            GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);


            sleep(1);
        }


    }
}

void sub_proc(void)
{
    /* collect data Task. */
    pthread_t thread3;
    pthread_attr_t attrs3;
    struct sched_param priParam3;
    int retc;

    int32_t semStatus;

#if defined(Display_DISABLE_ALL)

    uint32_t status = UART2_STATUS_SUCCESS;
    const char echoPrompt[] = "Echoing characters:\r\n";

    /* Create a UART in CALLBACK read mode */
    UART2_Params_init(&uartParams);
    uartParams.readMode     = UART2_Mode_CALLBACK;
    uartParams.readCallback = callbackFxn;
    uartParams.baudRate     = 115200;

//    uart = UART2_open(CONFIG_UART2_0, &uartParams);

    if (uart == NULL)
    {
        /* UART2_open() failed */
        while (1) {}
    }
    UART2_read(uart, uartReadBuffer, UART_MAX_READ_SIZE, NULL);

    /* Turn on user LED to indicate successful initialization */
    //GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);

    /* Pass NULL for bytesWritten since it's not used in this example */
    UART2_write(uart, echoPrompt, sizeof(echoPrompt), NULL);

#endif

    /* Create semaphore */
    semStatus = sem_init(&sem, 0, 0);

    if (semStatus != 0)
    {
        /* Error creating semaphore */
        while (1) {}
    }

    pthread_attr_init(&attrs3);


    /* Set priority, detach state, and stack size attributes */
    priParam3.sched_priority = 3;
    retc                    = pthread_attr_setschedparam(&attrs3, &priParam3);
    retc |= pthread_attr_setdetachstate(&attrs3, PTHREAD_CREATE_DETACHED);
    retc |= pthread_attr_setstacksize(&attrs3, THREADSTACKSIZE);
    if (retc != 0)
    {
        /* failed to set attributes */
        while (1) {}
    }

    retc = pthread_create(&thread3, &attrs3, emsThread, NULL);
    if (retc != 0)
    {
        /* pthread_create() failed */
        while (1) {}
    }

}



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

    您好!

    如果新任务导致器件处于活动模式的时间长于不执行任务的时间、或者执行任何功耗操作(打开 LED 或运行外设)、则执行附加任务可能会增加功耗。  但是、只执行一个附加任务本身不应增加功耗、除非任务执行的操作消耗更多功耗。 我建议查看随时间推移产生的电流消耗图、以了解是否可以找出电流增加的原因。

    此致、

    1月

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

    您好、Jan:

    感谢您的建议、但如何在完成后使任务进入省电状态? 我已经注意到我的任务持续保持激活状态。


    此致、
    Anthony

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

    Anthony、您好!

    睡眠或生成状态应允许另一个任务运行、如果不需要运行任务、则应将器件置于可能的最低功耗状态(如果没有驱动器使器件保持唤醒状态、则为待机状态)。 我看到您有一个 UART 读取操作。 您的 UART 是始终保持打开状态、还是您在进入待机模式之前将其关闭?

    此致、

    1月

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

    您好、Jan:

    我很抱歉我的回复延迟;我目前正在度假、直到下星期一。 关于该问题、我已经尝试关闭 UART 并在任务中增加睡眠模式、但功耗保持不变。 我想不出任何其他方法来减少它。

    //uart = UART2_open (CONFIG_UART2_0、&uartParams);
    //sleep (1);

    此致、
    Anthony

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

    Anthony、您好!

    不用担心! 您能否分享您正在处理的基本示例是什么? 这是一个 BLE 示例吗? 如果是、可以在 SysConfig 设置中禁用显示吗? 可以在 BLE 模块中找到该内容。 此外、您能分享一下如何测量功耗吗? 您能否分享一下设置的图片? 享受您的假期! :)

    此致、

    1月

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

    您好、Jan:

    我正在根据 basic_ble_LP_EM_CC2340R5_freertos_ticlang 进行一些研究。 我似乎发现了我的问题:我禁用了 UART、但我没有注释掉 IF 内部的内容(UART == NULL)。 进行此更改后、功耗有所改善、但仍感觉有点高(原始广播消耗:6μA;添加任务:120μA 后)。 我已经禁用了 LED 和 UART 并添加了 SLEEP()。 好像在广播中执行任务是不是很合适的? 也许我错了。 如果您能提供一些参考代码、那就太好了! 以前、当使用 MSP430 MCU 时、它可以进入低功耗模式并退出低功耗模式。 我想知道 CC2340R5是否具有类似功能?





    此致、
    Anthony

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

    Anthony、您好!

    同意如果您不打算在单独的任务中做任何事情、120uA 的数字非常高。 您能否分享单独任务的最新代码以确保不会错过任何内容?

    CC2340R5在运行时使用电源管理器来更改器件的电源状态。 当所有任务都产生后、电源管理器将自动将器件置于尽可能低的功耗状态。 可能的最低功耗状态将取决于在给定时间使用的外设。 数据表中的下表详细说明了根据运行的外设可实现的功率级别:

    此致、

    1月

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

    您好、Jan:

    我的代码变化不大;我只注释掉了 UART 检查。 此任务独立运行、因此120uA 的功耗看起来是合理的。 我应该将需要执行的任务放在哪里? 我是否可以参考任何相关的示例代码?

    int main()
    {
      /* Register Application callback to trap asserts raised in the Stack */
      halAssertCback = AssertHandler;
      RegisterAssertCback(AssertHandler);
    
      Board_init();
    
      /* Update User Configuration of the stack */
      user0Cfg.appServiceInfo->timerTickPeriod = ICall_getTickPeriod();
      user0Cfg.appServiceInfo->timerMaxMillisecond  = ICall_getMaxMSecs();
    
      /* Initialize all applications tasks */
      appMain();
    
      sub_proc();
      /* Start the FreeRTOS scheduler */
      vTaskStartScheduler();
    
      return 0;
    
    }


    void *emsThread(void *arg0)
    {
    
        /* Configure the LED pin */
        GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(CONFIG_GPIO_LED_1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        /* Turn on user LED to indicate successful initialization */
        GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
        GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
    
    
    
        while(1)
        {
            if(connection_LED == 0)
            {
                if (sem_trywait(&sem) == 0)
                {
    //                UART2_write(uart, (char*)"device disconnect OK!\r\n", strlen((char*)"device disconnect OK!\r\n"), NULL);
    
                }
    
    //              GPIO_toggle(CONFIG_GPIO_LED_0);
    //              GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
    
                  usleep(250000);
    
            }
            else
            {
    
                if (sem_trywait(&sem) == 0) { //receive to sem
    //                UART2_write(uart, (char*)"device connect OK!\r\n", strlen((char*)"device connect OK!\r\n"), NULL);
                }
                //GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
    //            GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
    
    
                sleep(1);
            }
    
    
        }
    }



    void sub_proc(void)
    {
        /* collect data Task. */
        pthread_t thread3;
        pthread_attr_t attrs3;
        struct sched_param priParam3;
        int retc;
    
        int32_t semStatus;
    
    #if defined(Display_DISABLE_ALL)
    
        uint32_t status = UART2_STATUS_SUCCESS;
    
    
        /* Create a UART in CALLBACK read mode */
        UART2_Params_init(&uartParams);
        uartParams.readMode     = UART2_Mode_CALLBACK;
        uartParams.readCallback = callbackFxn;
        uartParams.baudRate     = 115200;
    
    //    uart = UART2_open(CONFIG_UART2_0, &uartParams);
    
    //    if (uart == NULL)
    //    {
            /* UART2_open() failed */
    //        while (1) {}
    //    }
    //    UART2_read(uart, uartReadBuffer, UART_MAX_READ_SIZE, NULL);
    
    
    #endif
    
        /* Create semaphore */
        semStatus = sem_init(&sem, 0, 0);
    
        if (semStatus != 0)
        {
            /* Error creating semaphore */
            while (1) {}
        }
    
        pthread_attr_init(&attrs3);
    
    
        /* Set priority, detach state, and stack size attributes */
        priParam3.sched_priority = 3;
        retc                    = pthread_attr_setschedparam(&attrs3, &priParam3);
        retc |= pthread_attr_setdetachstate(&attrs3, PTHREAD_CREATE_DETACHED);
        retc |= pthread_attr_setstacksize(&attrs3, THREADSTACKSIZE);
        if (retc != 0)
        {
            /* failed to set attributes */
            while (1) {}
        }
    
        retc = pthread_create(&thread3, &attrs3, emsThread, NULL);
        if (retc != 0)
        {
            /* pthread_create() failed */
            while (1) {}
        }
    
    }



    此致、
    Anthony

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

    Anthony、您好!

    我认为您提供的代码看起来不错。 如果任务运行频繁、那么这可能是平均电流增加的原因。 确认方法是使用功率分析仪并查看电流随时间变化图。

    此致、

    1月

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

    您好、Jan:

    我将重新评估整体架构、以达到最大能效的目标。 非常感谢您的帮助。

    此致、
    Anthony