xhli 发表于 2021-7-13 12:50:41

FreeRTOS移植完成后 系统任务无法调度

FreeRTOS移植完成后 系统任务无法调度
main.c
#include "includes.h"



static TaskHandle_t AppTaskCreateHandle = NULL;
static TaskHandle_t LedTaskHandle = NULL;
static TaskHandle_t Task1Handle = NULL;
static TaskHandle_t Task2Handle = NULL;



unsigned char Task1Flag;
unsigned char Task2Flag;

void LedInit(void);
void LedTask(void *parameter);
void Task1Task(void *parameter);
void Task2Task(void *parameter);

void LedInit(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
       
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStruct);
       
//        GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
       
        GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
}

void LedTask(void *parameter)
{
        while(1)
        {
                GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
                vTaskDelay(500);
                GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
                vTaskDelay(500);
        }
}

void Task1Task(void *parameter)
{
        while(1)
        {
                Task1Flag = 1;
                vTaskDelay(100);
                Task1Flag = 0;
                vTaskDelay(100);
        }
}


void Task2Task(void *parameter)
{
        while(1)
        {
                Task2Flag = 1;
                vTaskDelay(100);
                Task2Flag = 0;
                vTaskDelay(100);
        }
}

void AppTaskCreate(void)
{
        taskENTER_CRITICAL();
       
        xTaskCreate((TaskFunction_t        )LedTask,
                                                        (char *                                        )"LedTask",
                                                        (uint16_t                                )300,
                                                        (void *                                        )NULL,
                                                        (UBaseType_t                )3,
                                                        (TaskHandle_t *        )&LedTaskHandle);
                                                                                               
        xTaskCreate((TaskFunction_t        )Task1Task,
                                                        (char *                                        )"Task1Task",
                                                        (uint16_t                                )configMINIMAL_STACK_SIZE,
                                                        (void *                                        )NULL,
                                                        (UBaseType_t                )2,
                                                        (TaskHandle_t *        )&Task1Handle);

        xTaskCreate((TaskFunction_t        )Task2Task,
                                                        (char *                                        )"Task2Task",
                                                        (uint16_t                                )configMINIMAL_STACK_SIZE,
                                                        (void *                                        )NULL,
                                                        (UBaseType_t                )1,
                                                        (TaskHandle_t *        )&Task2Handle);               
                                                                                               
        vTaskDelete(AppTaskCreateHandle);
        taskENTER_CRITICAL();                                                                                               
}


int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
        LedInit();
       
        xTaskCreate((TaskFunction_t        )AppTaskCreate,
                                                        (char *                                        )"AppTaskCreate",
                                                        (uint16_t                                )configMINIMAL_STACK_SIZE,
                                                        (void *                                        )NULL,
                                                        (UBaseType_t                )4,
                                                        (TaskHandle_t *        )&AppTaskCreateHandle);

        vTaskStartScheduler();

       
        while(1)
        {
        }
}



FreeRTOSConfig.h

/*
* FreeRTOS Kernel V10.3.1
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates.All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* http://www.FreeRTOS.org
* http://aws.amazon.com/freertos
*
* 1 tab == 4 spaces!
*/

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
* Application specific definitions.
*
* These definitions should be adjusted for your particular hardware and
* application requirements.
*
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
*
* See http://www.freertos.org/a00110.html
*----------------------------------------------------------*/

#define configUSE_PREEMPTION                1
#define configUSE_IDLE_HOOK                        0
#define configUSE_TICK_HOOK                        0
#define configCPU_CLOCK_HZ                        ( ( unsigned long ) 72000000 )       
#define configTICK_RATE_HZ                        ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES                ( 5 )
#define configMINIMAL_STACK_SIZE        ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE                ( ( size_t ) ( 17 * 1024 ) )
#define configMAX_TASK_NAME_LEN                ( 16 )
#define configUSE_TRACE_FACILITY        0
#define configUSE_16_BIT_TICKS                0
#define configIDLE_SHOULD_YIELD                1

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES                 0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_vTaskPrioritySet                1
#define INCLUDE_uxTaskPriorityGet                1
#define INCLUDE_vTaskDelete                                1
#define INCLUDE_vTaskCleanUpResources        0
#define INCLUDE_vTaskSuspend                        1
#define INCLUDE_vTaskDelayUntil                        1
#define INCLUDE_vTaskDelay                                1




/* This is the raw value as per the Cortex-M3 NVIC.Values can be 255
(lowest) to 0 (1?) (highest). */
#define configKERNEL_INTERRUPT_PRIORITY                 255
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY         191 /* equivalent to 0xb0, or priority 11. */


/* This is the value being used as per the ST library which permits 16
priority values, 0 to 15.This must correspond to the
configKERNEL_INTERRUPT_PRIORITY setting.Here 15 corresponds to the lowest
NVIC value of 255. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY        15



#ifndef __NVIC_PRIO_BITS
#define configPRIO_BITS                                                                                                 __NVIC_PRIO_BITS
#else
#define configPRIO_BITS                                                                                                 4
#endif

#define vPortSVCHandler                                                                                                 SVC_Handler
#define xPortPendSVHandler                                                                                         PendSV_Handler
#define xPortSysTickHandler                                                                                 SysTick_Handler

#define INCLUDE_xTaskGetCurrentTaskHandle                         1


#endif /* FREERTOS_CONFIG_H */


xhli 发表于 2021-7-14 08:35:50

eric2013 发表于 2021-7-14 01:33
方便的话,直接上传工程到论坛或者百度网盘看下

初学者是创建函数里边的打开临界区的函数调用错了已经解决了谢谢拉。

xhli 发表于 2021-7-14 08:33:18

解决了   
void AppTaskCreate(void)
{
      taskENTER_CRITICAL();
      
      xTaskCreate((TaskFunction_t      )LedTask,
                                                      (char *                                        )"LedTask",
                                                      (uint16_t                              )300,
                                                      (void *                                        )NULL,
                                                      (UBaseType_t                )3,
                                                      (TaskHandle_t *      )&LedTaskHandle);
                                                                                             
      xTaskCreate((TaskFunction_t      )Task1Task,
                                                      (char *                                        )"Task1Task",
                                                      (uint16_t                              )configMINIMAL_STACK_SIZE,
                                                      (void *                                        )NULL,
                                                      (UBaseType_t                )2,
                                                      (TaskHandle_t *      )&Task1Handle);

      xTaskCreate((TaskFunction_t      )Task2Task,
                                                      (char *                                        )"Task2Task",
                                                      (uint16_t                              )configMINIMAL_STACK_SIZE,
                                                      (void *                                        )NULL,
                                                      (UBaseType_t                )1,
                                                      (TaskHandle_t *      )&Task2Handle);               
                                                                                             
      vTaskDelete(AppTaskCreateHandle);
      taskENTER_CRITICAL();                                                                                             
}

这个写错了导致一直关闭了中断进不去滴答定时器中断所以无法调度谢谢拉

eric2013 发表于 2021-7-14 01:33:35

方便的话,直接上传工程到论坛或者百度网盘看下

xhli 发表于 2021-7-13 15:18:30

通过调试创建任务直接在main函数中创建可以使用但是通过xTaskCreate创建一个任务在任务中创建剩余的任务不可以使用。
#include "includes.h"

TaskHandle_t AppTaskCreateHandle;
TaskHandle_t LedTaskHandle;
TaskHandle_t Task1Handle;
TaskHandle_t Task2Handle;

unsigned int TaskFlag1 = 0;
unsigned int TaskFlag2 = 0;

void LedInit(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
       
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStruct);
       
//        GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
       
        GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
}

void LedTask(void *parameter)
{
        while(1)
        {
                GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
                vTaskDelay(500);
                GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
                vTaskDelay(500);
        }
}


void Task1(void *parameter)
{
        while(1)
        {
                TaskFlag1 = 1;
                vTaskDelay(500);
                TaskFlag1 = 0;
                vTaskDelay(500);
        }
}


void Task2(void *parameter)
{
        while(1)
        {
                TaskFlag2 = 1;
                vTaskDelay(500);
                TaskFlag2 = 0;
                vTaskDelay(500);
        }
}

void AppTaskCreate(void)
{
        taskENTER_CRITICAL();
       
        xTaskCreate((TaskFunction_t        )LedTask,
                                                        (char *                                        )"LedTask",
                                                        (uint16_t                                )128,
                                                        (void *                                        )NULL,
                                                        (UBaseType_t                )1,
                                                        (TaskHandle_t *        )&LedTaskHandle);
                                                       
        xTaskCreate((TaskFunction_t        )Task1,
                                                        (char *                                        )"Task1",
                                                        (uint16_t                                )128,
                                                        (void *                                        )NULL,
                                                        (UBaseType_t                )2,
                                                        (TaskHandle_t *        )&Task1Handle);
                                                       
        xTaskCreate((TaskFunction_t        )Task2,
                                                        (char *                                        )"Task2",
                                                        (uint16_t                                )128,
                                                        (void *                                        )NULL,
                                                        (UBaseType_t                )3,
                                                        (TaskHandle_t *        )&Task2Handle);
                                                       
        vTaskDelete(AppTaskCreateHandle);
        taskENTER_CRITICAL();                                                                                               
}


int main(void)
{
        LedInit();
       
        //可以用
        AppTaskCreate();
       
        //不可以用
//        xTaskCreate((TaskFunction_t        )AppTaskCreate,
//                                                        (char *                                        )"Create",
//                                                        (uint16_t                                )configMINIMAL_STACK_SIZE,
//                                                        (void *                                        )NULL,
//                                                        (UBaseType_t                )1,
//                                                        (TaskHandle_t *        )&AppTaskCreateHandle);

        vTaskStartScheduler();

       
        while(1)
        {
        }
}

页: [1]
查看完整版本: FreeRTOS移植完成后 系统任务无法调度