OpenEdv-开源电子网

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

FREERTOS stm32f1系列 多任务

[复制链接]

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-7-19
在线时间
13 小时
发表于 2019-11-3 19:08:11 | 显示全部楼层 |阅读模式
2金钱
最近在学习freertos操作系统,通过移植了一个比较简单的双任务(就点了两个灯),但是第二个任务为什么跑不起来,根据我的理解如果两个任务优先级一样,在一个时间片结束后应该去执行第二个任务啊但是,第二个任务就是跑不起来。

这是主函数部分


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


//?????
#define START_TASK_PRIO                1
//??????       
#define START_STK_SIZE                 128  
//????
TaskHandle_t StartTask_Handler;
//????
void start_task(void *pvParameters);

//?????
#define LED0_TASK_PRIO                2
//??????       
#define LED0_STK_SIZE                 50  
//????
TaskHandle_t LED0Task_Handler;
//????
void led0_task(void *pvParameters);

//?????
#define LED1_TASK_PRIO                2
//??????       
#define LED1_STK_SIZE                 50  
//????
TaskHandle_t LED1Task_Handler;
//????
void led1_task(void *pvParameters);

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//???????????4         
        delay_init();                                            //???????          
        uart_init(115200);                                        //?????
        LED_Init();                                                          //???LED
         
        //??????
    xTaskCreate((TaskFunction_t )start_task,            //????
                (const 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)
{
    taskENTER_CRITICAL();           //?????
    //??LED0??
    xTaskCreate((TaskFunction_t )led0_task,            
                (const char*    )"led0_task",          
                (uint16_t       )LED0_STK_SIZE,
                (void*          )NULL,                               
                (UBaseType_t    )LED0_TASK_PRIO,       

                                                                (TaskHandle_t*  )&LED0Task_Handler);   
    //??LED1??
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);         
    vTaskDelete(StartTask_Handler); //??????
    taskEXIT_CRITICAL();            //?????
}

//LED0????
void led0_task(void *pvParameters)
{
    while(1)
    {
        LED0=~LED0;
                        delay_ms(2);
                       

    }
}   

//LED1????
void led1_task(void *pvParameters)
{
    while(1)
    {
      LED1=1;
                        delay_ms(1);
                        LED1=0;
                        delay_ms(1);

    }
}



QQ截图20191103190647.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-7-19
在线时间
13 小时
 楼主| 发表于 2019-11-6 11:21:56 | 显示全部楼层
回复

使用道具 举报

0

主题

28

帖子

0

精华

高级会员

Rank: 4

积分
762
金钱
762
注册时间
2018-7-25
在线时间
276 小时
发表于 2019-11-6 13:43:40 | 显示全部楼层
本帖最后由 路上捡到一只猫 于 2019-11-6 14:01 编辑

任务函数中需要调用能够让任务放弃CPU的API,比如vTaskDelay(),否则高优先级的任务就一直在执行,当然不会发生任务切换
开始没看清楚,优先级相同,检查下配置项 configUSE_TIME_SLICING 有没使能,开启了时间片调度
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-7-19
在线时间
13 小时
 楼主| 发表于 2019-11-7 09:30:39 | 显示全部楼层
路上捡到一只猫 发表于 2019-11-6 13:43
任务函数中需要调用能够让任务放弃CPU的API,比如vTaskDelay(),否则高优先级的任务就一直在执行,当然不会 ...

时间调度片是默认使能的啊C:\Users\Administrator\Desktop
16.png
回复

使用道具 举报

1

主题

39

帖子

0

精华

高级会员

Rank: 4

积分
812
金钱
812
注册时间
2019-1-31
在线时间
106 小时
发表于 2019-11-7 11:10:17 | 显示全部楼层
delay_ms   这个不会任务切换的,换成vTaskDelay()
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2019-12-27 13:14:54 | 显示全部楼层
兄弟,要用FREERTOS操作系统提供的延时函数vTaskDelay(),这个API函数会进行任务切换。
   你自己编写的delay_ms()不会进行任务切换的呀!其它任务怎么能有获得运行的机会呀!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 23:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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