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.

[参考译文] RTOS/CC1310:任务延迟至

Guru**** 2539500 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/572732/rtos-cc1310-task-delay-until

器件型号:CC1310

工具/软件:TI-RTOS

您好!

目前,我正在使用 Task_sleep()在给定的时间阻止任务。

但是、我想使用某种"延迟直至"块、就像我以前使用 FreeRTOS 一样。

如何使用 TI-RTOS 实现这一目的?

FreeRTOS 提供了一个执行此操作的函数:

void vTaskDelayUntil ( TickType_t *pxPreviousWakeTime,const TickType_t xTimeIncrement );

将任务延迟到指定的时间。 周期任务可以使用此函数来确保恒定的执行频率。

此函    数与 vTaskDelay ()在一个重要方面不同:vTaskDelay ()指定任务相对于 vTaskDelay ()被调用的时间的解除阻断时间,而 vTaskDelayUntil ()指定任务希望解除阻断的绝对时间。

vTaskDelay ()将使任务从调用 vTaskDelay ()开始阻止指定数量的节拍。 因此,很难单独使用 vTaskDelay()来生成固定的执行频率,因为调用 vTaskDelay()后任务解除阻止与下一个调用 vTaskDelay()任务之间的时间可能不是固定的[任务可能会通过调用之间的代码采用不同的路径, 或者每次执行时可能会被中断或抢占不同的次数]。

vTaskDelay ()指定了相对于函数调用时间的唤醒时间,而 vTaskDelayUntil ()指定了它希望解除阻止的绝对(精确)时间。

//每10个节拍执行一次操作。
void vTaskFunction (void * pvParameters)
{
TickType_t xLastWakeTime;
const TickType_t xFrequency = 10;

//使用当前时间初始化 xLastWakeTime 变量。
xLastWakeTime = xTaskGetTickCount();

for (;;)
{
//等待下一个周期。
vTaskDelayUntil (&xLastWakeTime、xFrequency);

//在此处执行操作
。}
} 

 

 

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

    实现此目的的一种方法是使用时钟和信号量模块。  你将创建一个运行在你所需频率上的 Clock_Object、并且它的函数发布一个任务挂起的信标。

    下面是一些伪代码:

    /*
     * clockFxn 是已有的 Clock_Object 的服务函数
     *创建以在所需频率下运行。
     *
    void clockFxn()

       Semaphore_post (clockSem);

    void taskFxn()

       对于(;;){
           /*等待下一个周期。 *
           Semaphore_pend (clockSem、BIOS_wait_forever);

           /*在此处执行操作。 *
       }

    我不知道 vTaskDelayUtil()在“直到”时间已经发生时调用它的语义,当任务操作花费的时间超过频率时可能会发生这种情况, 但是在上面的代码中、Semaphore_pend()将立即返回(因为时钟函数在没有任务等待时布置了信标)。  我希望 vTaskDelayUtil()也能做同样的事情。

    此致、

    - Rob

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

    [引用用户="Robert Tivy"]

    我不知道 vTaskDelayUtil()在“直到”时间已经发生时调用它的语义,当任务操作花费的时间超过频率时可能会发生这种情况, 但是在上面的代码中、Semaphore_pend()将立即返回(因为时钟函数在没有任务等待时布置了信标)。  我希望 vTaskDelayUtil()也能做同样的事情。

    此致、

    - Rob

    [/报价]

    应该注意的是,如果 vTaskDelayUtil()被用来指定一个已经过去的唤醒时间,它将立即返回(而不进行阻塞)。

    以下方法是否可行?

    #define delay 100
    
    uint32_t startTick;
    uint32_t endTick;
    
    void se_task (void)
    {
    while (1)
    {
    startTick = Clock_getTicks();
    
    /*在此处执行操作*/
    
    endTick = Clock_getTicks();
    
    Task_sleep (milli_To_ticks (delay)-(endTick - startTick));
    }
    }
    
    

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

    是的、这种方法看起来不错。  我在发表我之前的答复后也有同样的想法。

    最好确保您不会将"负"或0值传递给 Task_sleep()。  如果睡眠时间最终小于等于0、则可能意味着是时候再次"在这里做些什么"了。

    此致、

    - Rob