野火电子论坛

标题: FreeRTOS 任务调度不起来 [打印本页]

作者: ID-nNngjx    时间: 2020-5-15 11:22
标题: FreeRTOS 任务调度不起来
写了一个极简单的程序,控制一个LED灯的闪烁,Keil环境,使用FreeRTOS系统。烧录到板上后,发现LED灯没有按照预期的闪烁。任务应该是创建成功了,感觉好像是任务调度器没工作起来。请大家指导一下是啥原因。

#include "FreeRTOS.h"
#include "task.h"
#include "stm32f10x.h"

static void BSP_Init(void)
{
                NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
       
                GPIO_InitTypeDef GPIO_InitStructure;

                RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);

                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;       

                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

                GPIO_Init(GPIOB, &GPIO_InitStructure);       
               
                GPIO_ResetBits(GPIOB, GPIO_Pin_0);
}

void LED_ON()                //点亮LED
{
        GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}

void LED_OFF()               //关闭LED
{
        GPIO_SetBits(GPIOB,GPIO_Pin_0);
}

/*********************LED任务函数*************************/
static void LED_Task()
{       
    while (1)
    {
        LED_ON();
        vTaskDelay(500);

        LED_OFF();
        vTaskDelay(500);                                
    }
}

static TaskHandle_t LED_Task_Handle = NULL;    //创建LED任务句柄

int main(void)
{       
  BaseType_t xReturn = pdPASS;

  BSP_Init();                //初始化硬件
       
/**********************************创建LED任务***********************************/
  xReturn = xTaskCreate((TaskFunction_t )LED_Task,                  //任务入口函数
                        (const char*    )"LED_Task",                        //任务名称
                        (uint16_t       )512,                                          //任务栈大小
                        (void*          )NULL,                                        //任务入口函数参数
                        (UBaseType_t    )1,                                         //任务的优先级
                        (TaskHandle_t*  )&LED_Task_Handle);                //任务控制块指针

  if(pdPASS == xReturn)
        {
                vTaskStartScheduler();         //启动任务调度器
        }
  else
    return -1;  

  while(1);   
}




作者: lx12138    时间: 2020-5-20 00:08
用串口输出   看看哪里没有成功
作者: sunhuayang    时间: 2020-6-9 17:47
去掉行尾的while(1);
作者: ba_wang_mao    时间: 2020-6-12 08:55
sunhuayang 发表于 2020-6-9 17:47
去掉行尾的while(1);

if(pdPASS == xReturn)
        {
                vTaskStartScheduler();         //启动任务调度器
        }

  如果调度成功,程序是不会走到行尾的while(1);的
  是其它原因导致的
作者: ba_wang_mao    时间: 2020-6-12 08:58
参见:
      FreeRTOS和FreeMODBUS移植到STM32F407傻瓜教程(Keil5)
     链接为   https://download.csdn.net/download/ba_wang_mao/12054262

    FreeRTOS和FreeMODBUS移植到STM32F103傻瓜教程(Keil5)
     链接为     https://download.csdn.net/download/ba_wang_mao/12054217

手把手教你一步步移植成功,图文并茂。先从大的方向讲解应该如何移植,要移植哪些,然后着重将移植过程中感到困惑的、容易忽略的地方进行了讲解,每一步关键点都有截屏。

作者: 林李    时间: 2020-10-30 20:04
xtaskcreat返回值不是任务句柄





欢迎光临 野火电子论坛 (https://www.firebbs.cn/) Powered by Discuz! X3.4