首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FreeRTOS匮乏和时间切片

FreeRTOS匮乏和时间切片
EN

Stack Overflow用户
提问于 2019-06-02 16:25:02
回答 1查看 712关注 0票数 1

我在cortex m4处理器上运行FreeRTOS时遇到了问题。我有3个任务:周期性任务和2个连续任务。

代码语言:javascript
复制
static const char text1[] = "Periodic task\r\n";
static const char text2[] = "Continous Task\r\n";
static const char text3[] = "Continous Task 2\r\n";

void periodicTask(void *pvParameter)
{
    TickType_t prevCount;
    char *printText = (char*)pvParameter;

    prevCount= xTaskGetTickCount();

    for(;;)
    {
        printf(printText);

        vTaskDelayUntil(&prevCount,pdMS_TO_TICKS(5));
    }
}

void continousTask(void *pvParameter)
{
    char *printText = (char*)pvParameter;

    for(;;)
    {
        printf(printText);
        vTaskDelay(1);
    }
}

int main(void) 
{

    xTaskCreate(periodicTask,"periodic task",200,(void*)text1,3,NULL);
    xTaskCreate(continousTask,"continous task 1",200,(void*)text2,0,NULL);
    //xTaskCreate(continousTask,"continous task 2",200,(void*)text3,0,NULL);


    vTaskStartScheduler();

    while(1)
    {

    }
    return 0 ;
}

上面的代码运行得很好,但前提是我在continousTask中获得了vTaskDelay(1),如果我删除它,我的连续任务2和周期性任务将会饥饿(或者不在期望的周期内运行),这是不应该发生的,因为周期性任务的优先级更高。连续的任务2也不应该饿死,因为我定义了configUSE_TIME_SLICING 1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-03 04:05:57

最有可能的原因是print语句。它们是如何实现的?如果他们使用半托管,那么调度器将不会正常工作,因为会有硬件冲突。如果它们不使用半托管,则确保它们正在阻塞写入(我的意思是执行写入的任务进入阻塞状态,因此不使用任何cpu时间,并允许其他任务在实际执行IO时运行)。免费书籍(https://www.freertos.org/Documentation/RTOS_book.html )详细介绍了使用printf()的危险。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56413394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档