OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8706|回复: 5

求助!FreeRTOS创建四个任务,为什么始终只有前两个任务执行。

[复制链接]

11

主题

49

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7258
金钱
7258
注册时间
2015-6-7
在线时间
446 小时
发表于 2018-6-10 16:58:31 | 显示全部楼层 |阅读模式
100金钱
本帖最后由 wjx1203020119 于 2018-6-10 17:20 编辑

使用FreeRTOS创建了4个任务,但是始终只有前两个任务执行,如果注释掉第二个任务后,就会第一个和第三个执行,注释掉第一个任务,只有第二个和第三个任务执行,不知道是哪里有问题,还请个位高手指点一下,谢谢!
创建任务原码:static void TESK_LED1(void const *argument);
static void TESK_LED2(void const *argument);
static void TESK_LED3(void const *argument);
static void TESK_LED4(void const *argument);
static void SystemClock_Config(void);
static void Error_Handler(void);
void Start_Task( void * pvParameters );
/* Private functions ---------------------------------------------------------*/
//定义开始任务堆栈大小和任务优先级
#define START_TASK_SIZE  120
#define START_TASK_PRIO  1
//定义LED1任务堆栈大小和任务优先级
#define LED1_TASK_SIZE   120
#define LED1_TASK_PRIO   4
//定义LED2任务堆栈大小和任务优先级
#define LED2_TASK_SIZE   120
#define LED2_TASK_PRIO   5
//定义LED3任务堆栈大小和任务优先级
#define LED3_TASK_SIZE   120
#define LED3_TASK_PRIO   2
//定义LED4任务堆栈大小和任务优先级
#define LED4_TASK_SIZE   120
#define LED4_TASK_PRIO   3

/**
  * @brief  Main program
  * @param  None
  * @retval None
  */
TaskHandle_t START_TASK_Handel_t;//任务句柄
TaskHandle_t LED1_TASK_Handel_t;        
TaskHandle_t LED2_TASK_Handel_t;        
TaskHandle_t LED3_TASK_Handel_t;        
TaskHandle_t LED4_TASK_Handel_t;

int main(void)
{
  /* STM32F4xx HAL library initialization:
       - Configure the Flash prefetch, instruction and Data caches
       - Configure the Systick to generate an interrupt each 1 msec
       - Set NVIC Group Priority to 4
       - Global MSP (MCU Support Package) initialization
     */
  HAL_Init();  

  /* Configure the system clock to 180 MHz */
  SystemClock_Config();

  /* Configure LED1 and LED3 */
  BSP_LED_Init(LED1);
  BSP_LED_Init(LED2);
  BSP_LED_Init(LED3);
  BSP_LED_Init(LED4);
        
        //创建开始任务
        xTaskCreate((TaskFunction_t) Start_Task,
                                                        (char*         ) "start_tesk",
                                                        (uint16_t      ) START_TASK_SIZE,
                                                        (void *        ) NULL,
                                                        (UBaseType_t   ) START_TASK_PRIO,
                                                        (TaskHandle_t *) &START_TASK_Handel_t );
        //开启任务调度器
        vTaskStartScheduler();

}
void Start_Task( void * pvParameters )
    {
                        taskENTER_CRITICAL(); //进入临界区
      //创建TESK_LED1任务
        xTaskCreate((TaskFunction_t) TESK_LED1,
                                                        (char*         ) "LED1_tesk",
                                                        (uint16_t      ) LED1_TASK_SIZE,
                                                        (void *        ) NULL,
                                                        (UBaseType_t   ) LED1_TASK_PRIO,
                                                        (TaskHandle_t *) &LED1_TASK_Handel_t );
                 //创建TESK_LED2任务
        xTaskCreate((TaskFunction_t) TESK_LED2,
                                                        (char*         ) "LED2_tesk",
                                                        (uint16_t      ) LED2_TASK_SIZE,
                                                        (void *        ) NULL,
                                                        (UBaseType_t   ) LED2_TASK_PRIO,
                                                        (TaskHandle_t *) &LED2_TASK_Handel_t );
                        //创建TESK_LED3任务
        xTaskCreate((TaskFunction_t) TESK_LED3,
                                                        (char*         ) "LED3_tesk",
                                                        (uint16_t      ) LED3_TASK_SIZE,
                                                        (void *        ) NULL,
                                                        (UBaseType_t   ) LED3_TASK_PRIO,
                                                        (TaskHandle_t *) &LED3_TASK_Handel_t );
                 //创建TESK_LED4任务
        xTaskCreate((TaskFunction_t) TESK_LED4,
                                                        (char*         ) "LED4_tesk",
                                                        (uint16_t      ) LED4_TASK_SIZE,
                                                        (void *        ) NULL,
                                                        (UBaseType_t   ) LED4_TASK_PRIO,
                                                        (TaskHandle_t *) &LED4_TASK_Handel_t );
                                                        
                                vTaskDelete(START_TASK_Handel_t);//执行1次后删除开始任务
                                taskEXIT_CRITICAL();//退出临界区
    }
static void TESK_LED1(void const *argument)
{
                while(1)
                {
                        BSP_LED_On(LED1);
                  vTaskDelay(1000);
                        BSP_LED_Off(LED1);
                        vTaskDelay(1000);
                }
}

static void TESK_LED2(void const *argument)
{
                while(1)
                {
                        BSP_LED_On(LED2);
                  vTaskDelay(200);
                        BSP_LED_Off(LED2);
                        vTaskDelay(800);
                }
}

static void TESK_LED3(void const *argument)
{
                while(1)
                {
                        BSP_LED_On(LED3);
                  vTaskDelay(50);
                        BSP_LED_Off(LED3);
                        vTaskDelay(50);
                }
}

static void TESK_LED4(void const *argument)
{
                while(1)
                {
                        BSP_LED_On(LED4);
                  vTaskDelay(100);
                        BSP_LED_Off(LED4);
                        vTaskDelay(800);
                }
}



最佳答案

查看完整内容[请看2#楼]

非常感谢各位的热心解答,问题已解决,是因为我给系统分配的内存不够用了,增加内存就可以了; #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 4 * 1024 ) ) /* 2 Kbytes */ 更改为:以下大小就ok啦; #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) ) /* 2 Kbytes */
学以致用,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

49

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7258
金钱
7258
注册时间
2015-6-7
在线时间
446 小时
 楼主| 发表于 2018-6-10 16:58:32 | 显示全部楼层
非常感谢各位的热心解答,问题已解决,是因为我给系统分配的内存不够用了,增加内存就可以了;
#define configTOTAL_HEAP_SIZE       ( ( size_t ) ( 4 * 1024 ) )          /* 2 Kbytes */
更改为:以下大小就ok啦;
#define configTOTAL_HEAP_SIZE       ( ( size_t ) ( 8 * 1024 ) )          /* 2 Kbytes */
学以致用,
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-6-10 17:09:59 | 显示全部楼层
不贴出相关代码来是打算让大家猜谜吗?
相关的宏定义,任务代码的实现都没有贴出来,怎么分析。
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-6-11 11:42:49 | 显示全部楼层
把四个任务优先级改成一样的试试,或者把延时时间全部设为一样看看。
回复

使用道具 举报

10

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2018-5-25
在线时间
34 小时
发表于 2018-6-11 14:43:18 | 显示全部楼层
看配置文件  #define INCLUDE_vTaskDelay                  1 这个有没有定义为1
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-6-11 14:48:24 | 显示全部楼层
Dluffy 发表于 2018-6-11 14:43
看配置文件  #define INCLUDE_vTaskDelay                  1 这个有没有定义为1

应该不是这个问题。
如果未定义的话,编译不会出错吗?
再者,楼主的4个任务优先级都不一样,如果没有进入阻塞的话,应该只有1个任务可以运行的,与他的描述不符。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 23:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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