硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1352|回复: 4
收起左侧

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

[复制链接]

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2021-7-13 12:50:41 | 显示全部楼层 |阅读模式
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 */


回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2021-7-14 08:35:50 | 显示全部楼层
eric2013 发表于 2021-7-14 01:33
方便的话,直接上传工程到论坛或者百度网盘看下

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

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 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();                                                                                               
}

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2021-7-14 01:33:35 | 显示全部楼层
方便的话,直接上传工程到论坛或者百度网盘看下
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 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)
        {
        }
}

回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-20 23:29 , Processed in 0.181638 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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