FreeRTOS调度任务不执行的原因

#include "FreeRTOS_demo.h"

#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );

#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t    task1_handler;
void task1( void * pvParameters );

#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t    task2_handler;
void task2( void * pvParameters );

void freertos_demo(void)
{    
   xTaskCreate((TaskFunction_t         )   start_task,
                (char *                 )   "start_task",
                (configSTACK_DEPTH_TYPE )   START_TASK_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   START_TASK_PRIO,
                (TaskHandle_t *         )   &start_task_handler );
    vTaskStartScheduler();
}

void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();               /* 进入临界区 */
    xTaskCreate((TaskFunction_t         )   task1,
                (char *                 )   "task1",
                (configSTACK_DEPTH_TYPE )   TASK1_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK1_PRIO,
                (TaskHandle_t *         )   &task1_handler );
                
    xTaskCreate((TaskFunction_t         )   task2,
                (char *                 )   "task2",
                (configSTACK_DEPTH_TYPE )   TASK2_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK2_PRIO,
                (TaskHandle_t *         )   &task2_handler );
                             
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();                /* 退出临界区 */
}

void task1( void * pvParameters )
{
    while(1) 
    {
		printf("hello");
		vTaskDelay(500);
    }
}

void task2( void * pvParameters )
{
    while(1)
    {

    }
}

运行上述代码,为什么串口调试助手不会打印hello,原因在于任务的优先级

freeRTOS调度任务的机制是:优先级高的任务先运行,同优先级的任务时间片轮转运行。

上述代码中task2的优先级大于task1,导致程序中会一直运行task2,不运行task1,所以程序没有任何输出。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当出现FreeRTOS任务执行的情况时,可能存在以下几种原因和解决方法。 首先,可能是由于任务资源调用冲突导致的。当多个任务同时操作同一个资源时,比如串口,在某些情况下可能会发生冲突。这种情况下,其中一个任务可能会被另一个高优先级的任务中断,并导致低优先级的任务无法继续执行。解决方法是在任务调试阶段使用uxTaskGetStackHighWaterMark()函数来查询任务堆栈的使用情况,如果堆栈不够,及时增大堆栈以确保任务的正常运行。 其次,可能是由于中断函数的定义导致的。在FreeRTOS中,有一些特殊的中断函数,比如SVC_Handler、PendSV_Handler和SysTick_Handler,这些中断函数必须正确地定义和配置才能保证任务调度函数的正常执行任务的切换。如果中断函数定义不正确,可能会导致任务无法执行。要解决这个问题,需要检查并确保中断函数的定义和配置正确无误。 另外,还有其他可能的原因,比如任务优先级设置不正确、任务堆栈溢出等,都可能导致FreeRTOS任务执行。解决这些问题的方法包括正确设置任务优先级、增大任务堆栈大小等。可以通过调试工具和函数来定位和解决这些问题,比如使用FreeRTOS提供的任务堆栈使用情况查询函数uxTaskGetStackHighWaterMark()来检查任务堆栈的使用情况。 综上所述,当出现FreeRTOS任务执行的情况时,需要仔细检查任务资源调用冲突、中断函数定义和配置以及其他可能的原因,并采取相应的解决方法来确保任务的正常执行和切换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值