OpenEdv-开源电子网

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

求助,freertos中任务挂起和恢复实验

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-7-5
在线时间
11 小时
发表于 2020-1-14 15:34:16 | 显示全部楼层 |阅读模式
1金钱
实验中是利用按键实现任务挂起和恢复,代码中的vTaskDelay(10);不加上的话则程序无法运行,这是为什么?按键任务的优先级是所有任务中最大的。

捕获.PNG
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-7-5
在线时间
11 小时
 楼主| 发表于 2020-1-14 15:43:24 | 显示全部楼层
当优先级比其他任务级别低时,不加延时则可以运行。
当优先级比其他任务级别高时,不加延时则无法运行。
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2020-1-15 16:52:45 | 显示全部楼层
兄弟,你的按键是高优先级任务。

  按下时,会调用系统API进行任务切换(调用挂起API函数)。
  释放时,会调用系统API进行任务切换(调用恢复API函数)。
  当没有按键按下时,没有调用任何会导致任务切换的API函数呀!系统怎么会正常的运行呀!
  假如,你也没有中断服务函数(或者有中断服务函数,但是在中断服务函数中没有调用会导致任务切换的API函数),系统就无法进行任务切换,怎么会正常的运行呀!
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2019-5-12
在线时间
168 小时
发表于 2020-2-7 09:55:47 | 显示全部楼层
本帖最后由 hejun96 于 2020-2-7 10:03 编辑

void vTaskDelay( const TickType_t xTicksToDelay )
{
                BaseType_t xAlreadyYielded = pdFALSE;
                //延时时间要大于0
                /* A delay time of zero just forces a reschedule. */
                if( xTicksToDelay > ( TickType_t ) 0U )
                {
                        configASSERT( uxSchedulerSuspended == 0 );
                        vTaskSuspendAll();
                        {
                                traceTASK_DELAY();

                                /* A task that is removed from the event list while the
                                scheduler is suspended will not get placed in the ready
                                list or removed from the blocked list until the scheduler
                                is resumed.

                                This task cannot be in an event list as it is the currently
                                executing task. */
                                prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );
                        }
                        xAlreadyYielded = xTaskResumeAll();
                }
                else
                {
                        mtCOVERAGE_TEST_MARKER();
                }

                /* Force a reschedule if xTaskResumeAll has not already done so, we may
                have put ourselves to sleep. */
                if( xAlreadyYielded == pdFALSE )
                {
                        portYIELD_WITHIN_API();
                }
                else
                {
                        mtCOVERAGE_TEST_MARKER();
                }
}

在task.c中vTaskDelay函数调用了vTaskSuspendAll()挂起任务调度器调用函数xTaskResumeAll()恢复任务调度器
如果函数xTaskResumeAll()没有进行任务调度的话在这里进行任务调度



回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 21:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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