野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17121|回复: 2

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

[复制链接]
发表于 2021-7-13 12:57:42 | 显示全部楼层 |阅读模式
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 */
回复

使用道具 举报

 楼主| 发表于 2021-7-13 15:21:14 | 显示全部楼层
经过调试   若直接在main函数中调用xTaskCreate创建所有的任务可以用   但是通过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)
        {
        }
}

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-14 08:40:47 | 显示全部楼层
已经解决  是创建函数中的 关闭临界函数调用错了   导致中断一直没有打开  所以滴答定时器中断一直没有进去  导致任务不能调度。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 15:36 , Processed in 0.026838 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表