请选择 进入手机版 | 继续访问电脑版
搜索
查看: 6373|回复: 20

[求助] 求助STM32F103 FreeRTOS任务调度异常问题

[复制链接]

该用户从未签到

1

主题

8

帖子

0

蝴蝶豆

初级会员

最后登录
2019-6-26
发表于 2018-10-8 10:03:06 | 显示全部楼层 |阅读模式
系统设置2个任务,系统运行时出现一些异常现象,请问有没有遇到过?是什么原因引起的?

方式1:系统运行正常
void Task1_Task(void * pvParameters)
{
                        while(1)
                        {
                                                vTaskDelay(500);                      //延时函数(任务调度)
                                                printf("Task1\r\n");                  //串口打印
                        }
}
void Task2_Task(void * pvParameters)
{
                        while(1)
                        {
                                                Delay_Ms(500);                        //延时函数(无任务调度)
                                                LED_TOGGLE;                          //LED闪烁(取反)
                        }
}


方式2:任务1正常,任务2没反应,LED不闪烁
void Task1_Task(void * pvParameters)
{
                        while(1)
                        {
                                                Delay_Ms(500);                        //延时函数(无任务调度)
                                                printf("Task1\r\n");                  //串口打印
                        }
}
void Task2_Task(void * pvParameters)
{
                        while(1)
                        {
                                                vTaskDelay(500);                      //延时函数(任务调度)
                                                LED_TOGGLE;                          //LED闪烁(取反)
                        }
}


方式3:任务1正常,任务2没反应,LED不闪烁
void Task1_Task(void * pvParameters)
{
                        while(1)
                        {
                                                Delay_Ms(500);                        //延时函数(无任务调度)
                                                printf("Task1\r\n");                  //串口打印
                        }
}
void Task2_Task(void * pvParameters)
{
                        while(1)
                        {
                                                Delay_Ms(500);                        //延时函数(无任务调度)
                                                LED_TOGGLE;                          //LED闪烁(取反)
                        }
}

回复

使用道具 举报

该用户从未签到

8

主题

131

帖子

9

蝴蝶豆

金牌会员

最后登录
2020-9-9
发表于 2018-10-8 11:46:01 | 显示全部楼层
你可以试试把延迟  Delay_Ms(500);      改短,看一下结果吗?

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

8

帖子

0

蝴蝶豆

初级会员

最后登录
2019-6-26
 楼主| 发表于 2018-10-8 12:02:01 | 显示全部楼层
程序员 发表于 2018-10-8 11:46
你可以试试把延迟  Delay_Ms(500);      改短,看一下结果吗?

改为延时50和延时100均不行,异常问题依旧,任务1能正常,任何2不执行
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2017-12-6 11:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    49

    主题

    3724

    帖子

    429

    蝴蝶豆

    论坛元老

    最后登录
    2021-8-7
    发表于 2018-10-8 12:21:00 | 显示全部楼层
    本帖最后由 toofree 于 2018-10-8 12:29 编辑

    Delay_Ms()是软件延时,死等吗?
    在操作系统中最好不要用死等,除非任务之间有些条件,不得不这么做。
    vTaskDelay()是任务阻塞时间,也就是释放当前任务时间,可以在这段时间内可以去执行别的任务。

    任务优先级高的,可以打断优先级低的;但是不能打断同级别或高级别的。
    一旦高优先级任务,来一个死等,那么其它同级或低级别的只能干瞪眼,执行不上任务。

    你把两个任务的优先级掉换一下试试,数值大的优先级高,小的优先级低

    评分

    参与人数 1蝴蝶豆 +3 收起 理由
    STMCU + 3

    查看全部评分

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    609

    帖子

    0

    蝴蝶豆

    金牌会员

    最后登录
    2021-5-25
    发表于 2018-10-8 12:33:04 | 显示全部楼层
    楼上的正解。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    8

    帖子

    0

    蝴蝶豆

    初级会员

    最后登录
    2019-6-26
     楼主| 发表于 2018-10-8 12:33:38 | 显示全部楼层
    toofree 发表于 2018-10-8 12:21
    Delay_Ms()是软件延时,死等吗?
    在操作系统中最好不要用死等,除非任务之间有些条件,不得不这么做。
    vTa ...

    Delay_Ms()是软件延时,死循环等待。
    原来的优先级:
    #define                  TASK1_TASK_PRIO        2
    #define                  TASK2_TASK_PRIO        3

    改为如下:问题依旧
    #define                  TASK1_TASK_PRIO        3
    #define                  TASK2_TASK_PRIO        2

    改为如下:问题依旧
    #define                  TASK1_TASK_PRIO        2
    #define                  TASK2_TASK_PRIO        2
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    198

    帖子

    7

    蝴蝶豆

    金牌会员

    最后登录
    2021-11-3
    发表于 2018-10-8 14:11:13 | 显示全部楼层
    我觉得你的方式2和方式3的结果正常。反而方式1的两个任务都会执行,有点问题。你试一下将LED反转的函数换成printf,在看看结果

    评分

    参与人数 1蝴蝶豆 +2 收起 理由
    STMCU + 2

    查看全部评分

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    8

    帖子

    0

    蝴蝶豆

    初级会员

    最后登录
    2019-6-26
     楼主| 发表于 2018-10-8 14:18:10 | 显示全部楼层
    hu9977 发表于 2018-10-8 14:11
    我觉得你的方式2和方式3的结果正常。反而方式1的两个任务都会执行,有点问题。你试一下将LED反转的函数换成 ...

    为什么方式2和方式3的结果是正常呢?能否解析一下。我把LED反转的函数换成printf,任务1正常,任务2依然没执行,没有串口数据输出
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    198

    帖子

    7

    蝴蝶豆

    金牌会员

    最后登录
    2021-11-3
    发表于 2018-10-8 14:25:28 | 显示全部楼层
    你是刚弄RTOS吗?看看操作系统的基础书籍,有一些概念的认识
    while(1)
                            {
                                                    Delay_Ms(500);                        //延时函数(无任务调度)
                                                    printf("Task1\r\n");                  //串口打印
                            }
    这个不会引起任务调度,会一直执行这个while循环。vTaskDelay会引起任务的调度,任务会交替执行。所以你如果想交替执行,你在上面的任务里加一个vTaskDelay()也可以。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    8

    帖子

    0

    蝴蝶豆

    初级会员

    最后登录
    2019-6-26
     楼主| 发表于 2018-10-8 14:31:37 | 显示全部楼层
    hu9977 发表于 2018-10-8 14:25
    你是刚弄RTOS吗?看看操作系统的基础书籍,有一些概念的认识
    while(1)
                            {

    嗯嗯,我是刚接触RTOS。
    按照您的意思,是不是所有的任务里面都需要有vTaskDelay才会以前任务调度,系统才能正常的跑起来?
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-3-29 18:26 , Processed in 1.188984 second(s), 40 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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