硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4298|回复: 15
收起左侧

[FreeRTOS] FreeRTOS在ARM Cortex-M的任务切换问题

[复制链接]

1

主题

9

回帖

1

积分

新手上路

积分
1
发表于 2017-3-12 15:21:44 | 显示全部楼层 |阅读模式
FreeRTOS在ARM Cortex-M的任务切换问题。
想测量一下FreeRTOS的任务切换时间,在官网的介绍中,任务切换时间为84个时钟周期,但是在pendsv中代码如下
360截图20170312142150671.jpg


第416行 会跳转到vTaskSwitchContext( void )中 进行任务切换,我没仔细看,但应该是进行任务调度,查找最高优先级的任务
360截图20170312142615889.jpg

查找优先级任务是一个相对复杂的过程,为什么要放在中断中处理呢?
而且这么长的程序怎么可能只用84个时钟周期就完成呢?
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-3-12 15:22:22 | 显示全部楼层
官网原话
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-3-12 15:24:30 | 显示全部楼层
官网的介绍如下
What is the context switch time?
Context switch times are dependent on the port, compiler and configuration. A context switch time of 84 CPU cycles was obtained under the following test conditions:
FreeRTOS ARM Cortex-M3 port for the Keil compiler
Stack overflow checking turned off
Trace features turned off
Run-time stats feature turned off
Compiler set to optimise for speed
configUSE_PORT_OPTIMISED_TASK_SELECTION set to 1 in FreeRTOSConfig.h
Notes:
Under these test conditions the context switch time is not not dependent on whether a different task was selected to run or the same task was selected to continue running.
The ARM Cortex-M port performs all task context switches in the PendSV interrupt. The quoted time does not include interrupt entry time.
The quoted time includes a short section of C code. It has been determined that 12 CPU cycles could have been saved by providing the entire implementation in assembly code. It is considered that the benefit of maintaining a short section of generic C code (for reasons of maintenance, support, robustness, automatic inclusion of features such as tracing, etc.) outweighs the benefit of removing 12 CPU cycles from the context switch time.
The Cortex-M CPU registers that are not automatically saved on interrupt entry can be saved with a single assembly instruction, then restored again with a further single assembly instruction. These two instructions on their own consume 12 CPU cycles.
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-3-12 15:38:43 | 显示全部楼层
[s:151]
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-3-12 15:39:34 | 显示全部楼层
另外任务切换时间是如何测量的呢?算不算任务调度时间
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2017-3-12 18:25:05 | 显示全部楼层
1. 现在查找高优先级任务很简单的,FreeRTOS里面如果32个任务以下,用CLZ指令就搞定了。
2. 不知道FreeRTOS官方怎么算的,不过他的这个84个时钟周期搞的太少了,估计是计算方式不一样吧。
3. 一般情况下任务切换时间要包括任务调度时间的,测试方法也比较简单,比如你创建两个高低优先级任务,在高优先级任务的延迟函数前加上一个IO翻转,低优先级任务的入口第一个语句再加上一个IO翻转,两个IO翻转就是任务切换时间,一般情况下都是这么算。其它的还有信号量,消息队列等切换时间,测试方法类似。
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-3-12 18:39:33 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 现在查找高优先级任务很简单的,FreeRTOS里面如果32个任务以下,用CLZ指令就搞定了。
2. 不知道FreeRTOS官方怎么算的,不过他的这个84个时钟周期搞的太少了,估计是计算方式不一样吧。
3. 一般情况下任务切换时间要包括任务调度时间的,测试方法也比较简单,比如你创建两个高低 .. (2017-03-12 18:25) 
您说的IO翻转的测试方法,是指IO口连上示波器,然后根据IO口两次翻转的时长吗?用定时器可以吗,高优先级delay之前,开启定时器,然后在低优先级的任务中关闭定时器,并查看定时器记录的时钟周期
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2017-3-12 18:40:13 | 显示全部楼层

回 yuer19900712 的帖子

yuer19900712:您说的IO翻转的测试方法,是指IO口连上示波器,然后根据IO口两次翻转的时长吗?用定时器可以吗,高优先级delay之前,开启定时器,然后在低优先级的任务中关闭定时器,并查看定时器记录的时钟周期 (2017-03-12 18:39)
一般用示波器比较有说服力。写论文什么的,建议示波器。
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-3-14 15:32:19 | 显示全部楼层

回 eric2013 的帖子

eric2013:一般用示波器比较有说服力。写论文什么的,建议示波器。
 (2017-03-12 18:40) 
在FreeRTOS中有两种调度方法,一种普通的,一种使用前导0指令的方法(CM3和CM4内核中),对于普通的方法 我看就是在遍历寻找高优先级任务,这样会不会效率比较低啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2017-3-14 15:40:17 | 显示全部楼层

回 yuer19900712 的帖子

yuer19900712:在FreeRTOS中有两种调度方法,一种普通的,一种使用前导0指令的方法(CM3和CM4内核中),对于普通的方法 我看就是在遍历寻找高优先级任务,这样会不会效率比较低啊 (2017-03-14 15:32) 
一般应用中,能超过20个任务已经是个奇迹,不必担心。
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-3-14 17:22:18 | 显示全部楼层

回 eric2013 的帖子

eric2013:一般应用中,能超过20个任务已经是个奇迹,不必担心。 (2017-03-14 15:40)
是想知道他的普通的调度算法大概如何实现的(现在用的M0核,没有CLZ),能大概说一下吗?

(1)#define taskSELECT_HIGHEST_PRIORITY_TASK()                              \\  
(2){                                                                   \\  
    (3)/* 从就绪列表数组中找出最高优先级列表*/              \\  
   (4) while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) )      \\  
    (5){                                                               \\  
        (6)configASSERT( uxTopReadyPriority );                             \\  
        (7)--uxTopReadyPriority;                                           \\  
    (8)}                                                               \\  
                                                                    \\  
    /* 相同优先级的任务使用时间片共享处理器就是通过这个宏实现*/    \\  
(9)   listGET_OWNER_OF_NEXT_ENTRY(pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) );   \\  
} /* taskSELECT_HIGHEST_PRIORITY_TASK */
这是普通的调度算法的代码第四局代码应该是寻找高优先级的任务了,uxTopReadyPriority 是在任务创建时检查更新的,如果比当前优先级高,就更新这个值。然后任务切换的时候从这个值开始查找。FreeRTOS中介绍说这个值是就绪态最高级优先级的值,那是说在高优先级任务阻塞的时候,这个值会更新成低优先级任务的值,是这样理解吗?但是我没有找到这样的代码。然而,我使用两个高低优先级的任务来测量任务切换时间,更改任务的优先级并不会带来任务切换时间的增长。不知道为何
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2017-3-17 10:16:57 | 显示全部楼层

回 yuer19900712 的帖子

yuer19900712:是想知道他的普通的调度算法大概如何实现的(现在用的M0核,没有CLZ),能大概说一下吗?

(1)#define taskSELECT_HIGHEST_PRIORITY_TASK()                      .. (2017-03-14 17:22) 
3 - 4年前看过源代码,如果没记错的话,FreeRTOS是根据优先级大小,按照顺序存入任务就绪列表的。所以基本不用查找,直接获取就行。耽误的时间就是存入优先级列表的过程。
回复

使用道具 举报

10

主题

90

回帖

120

积分

初级会员

积分
120
发表于 2017-3-22 10:00:54 | 显示全部楼层
特意登上账号来解释一下,FreeRTOST如何实现快速切换,我没有看过FreeRTOS如何实现,只是解释一种实现的可能性!!!!至于FreeRTOST是不是用这种,不重要了,重要的是,这是可以实现的!!!!链表,所有任务都是在一个链表里面....在创建的时候,根据优先级,直接排好顺序。。。那么如果要是任务非常多,创建的时候,是不是要一一比较优先级??不需要,根据对半查找就可以实现了....查询10次,就可以查完1024个以上的任务.....那么切换的时候,直接切换到最高优先级的就可以啦,根本不用去比较,查询!!!不知道讲清楚了没,换一句话说就是:先排好序,然后用的时候,直接拿来用!!!![s:148] [s:148] [s:148]
hah
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2017-3-22 11:23:03 | 显示全部楼层

回 mrjiu 的帖子

mrjiu:特意登上账号来解释一下,FreeRTOST如何实现快速切换,我没有看过FreeRTOS如何实现,只是解释一种实现的可能性!!!!至于FreeRTOST是不是用这种,不重要了,重要的是,这是可以实现的!!!!链表,所有任务都是在一个链表里面....在创建的时候,根据优先级,直接排好顺序。。。 .. (2017-03-22 10:00) 
这个是笨办法,时间都耽误在排序上,而具有时间不确定性。一般32个任务以下还是CLZ指令。

FreeRTOS这两种都有。
回复

使用道具 举报

38

主题

82

回帖

196

积分

初级会员

积分
196
发表于 2017-5-11 15:23:20 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个是笨办法,时间都耽误在排序上,而具有时间不确定性。一般32个任务以下还是CLZ指令。

FreeRTOS这两种都有。 (2017-03-22 11:23) 
CLZ 原话是counting leading zeroes... 能大概说一下什么原理吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2017-5-14 00:23:19 | 显示全部楼层

回 yip_1991 的帖子

yip_1991:CLZ 原话是counting leading zeroes... 能大概说一下什么原理吗? (2017-05-11 15:23)
不好意思啊,刚看到你的问题,这个就是CLZ
11.png
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 13:25 , Processed in 0.340647 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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