OpenEdv-开源电子网

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

FreeRTOS任务优先级的问题,有几个疑惑,希望各位大神解惑

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-4-6
在线时间
3 小时
发表于 2022-4-9 21:43:30 | 显示全部楼层 |阅读模式
1金钱
问题:我下面的代码中任务1优先级比任务2优先级高,可我实验现象是LED0与LED1的时候他们是同时亮与灭。不应该是任务1中的LED0先亮5秒再灭一秒才到LED1亮5秒再灭一秒吗?C语言不是顺序执行吗?我怎么感觉任务1与任务2同时执行?

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"

void start_task( void * pvParameters );//任务函数
#define        START_TASK_PRIO  1
#define        START_STK_SIZE   120
TaskHandle_t   StartTask_Handler;


void start_task1( void * pvParameters );
#define        START_TASK1_PRIO 3
#define        START_STK1_SIZE   120
TaskHandle_t   StartTask1_Handler;


void start_task2( void * pvParameters );
#define        START_TASK2_PRIO 2
#define        START_STK2_SIZE   120
TaskHandle_t   StartTask2_Handler;


int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4         
        delay_init();                                            //延时函数初始化          
        uart_init(115200);                                        //初始化串口
        LED_Init();                                                          //初始化LED
         

         xTaskCreate( (TaskFunction_t  ) start_task,          //任务函数
                                                                ( char*          ) "start_task",        //任务名称
                                                                ( uint16_t             ) START_STK_SIZE,      //任务堆栈大小
                                                                (void *                       ) NULL,                //传递给任务函数的参数
                                                                (UBaseType_t     ) START_TASK_PRIO,     //任务优先级
                                                                (TaskHandle_t*   ) &StartTask_Handler );//任务句柄


    vTaskStartScheduler();          //开启任务调度        器
}

void start_task( void * pvParameters )
{
        //创建任务1
         xTaskCreate( (TaskFunction_t  ) start_task1,
                                                                ( char*          ) "start_task1",
                                                                ( uint16_t             ) START_STK1_SIZE,
                                                                (void *                       ) NULL,
                                                                (UBaseType_t     ) START_TASK1_PRIO,
                                                                (TaskHandle_t*   ) &StartTask1_Handler );//任务句柄
                                                               
        //创建任务2                                       
         xTaskCreate( (TaskFunction_t  ) start_task2,
                                                                ( char*          ) "start_task2",
                                                                ( uint16_t             ) START_STK2_SIZE,
                                                                (void *                       ) NULL,
                                                                (UBaseType_t     ) START_TASK2_PRIO,
                                                                (TaskHandle_t*   ) &StartTask2_Handler );//任务句柄
         vTaskDelete(StartTask_Handler);//删除任务函数(内为任务句柄)
}


void start_task1( void * pvParameters )
{
  u8 p=0;
        while(1)
        {               
                LED0=0;
                vTaskDelay(5000);
                LED0=1;
                vTaskDelay(1000);
                p++;
                printf("task1 run %d \r\n",p);
        }
}       

void start_task2( void * pvParameters )
{
        u8 i=0;
        while(1)
        {                       
                LED1=0;       
                vTaskDelay(5000);         
                LED1=1;       
                vTaskDelay(1000);                       
                i++;               
                printf("task2 run %d \r\n",i);

        }
}



最佳答案

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

在vTaskDelay里会进行一次任务调度 会切换到已经就绪的任务 如果像你想得那样 你的TASK1是个while循环 不找个机会切出来 任务还怎么切换
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2022-4-9 21:43:31 | 显示全部楼层
在vTaskDelay里会进行一次任务调度 会切换到已经就绪的任务
如果像你想得那样 你的TASK1是个while循环 不找个机会切出来 任务还怎么切换
回复

使用道具 举报

0

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2020-8-24
在线时间
92 小时
发表于 2022-4-11 13:16:08 | 显示全部楼层
vTaskDelay,我记得这个延迟函数在执行的时候,CPU会开始执行别的任务,不会死在这等待。
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4734
金钱
4734
注册时间
2015-1-10
在线时间
591 小时
发表于 2022-4-11 13:26:05 | 显示全部楼层
是否顺序执行与语言无关,单进程永远是顺序执行的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 14:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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