搜索
bottom↓
回复: 19

实测的FreeRTOS在STM32F103上面的事件响应速度

[复制链接]

出0入0汤圆

发表于 2015-1-28 11:56:54 | 显示全部楼层 |阅读模式
环境:FreeRTOS 8.1.2, MCU STM32F103ZET6 @72MHz, Keil MDK 4.72, STM Lib 3.5. Code running in Flash.

方法:仅仅定义了5个任务,两个任务是每隔一秒去toggle不同的LED,一个任务是用FreeRTOS的utility来每隔5秒统计各个任务状态以及CPU占用率,还有一个TaskButton是等待外部中断发来Semaphore并进行处理的任务,最后一个是负责printf到串口的守护任务。然后启动一个STM32内部定时器,计数频率为1MHz,就是计数器每1uS加一。安装并启动一个外部中断,连接到一个按钮,设为上升沿触发。在中断ISR里面,一进去就清零定时器,然后发semaphore给任务TaskButton,之后强制任务切换并立即退出。任务TaskButton收到semaphore后立刻读出计数器的值,这时这个值就可以认为是事件处理任务对对中断响应处理的反应时间,以uS为单位,通过printf打印出来。所以,每次按按钮就会触发中断并打印响应时间。

结果:绝大部分时候打印出来的结果在10-12uS。由于按钮未作任何软硬件消抖,可能会有重入,这时按一次会看到连续多次打印,第一次正常在10-12uS,后面几次的结果会偏大很多,甚至达到80uS。

分析:觉得这个10-12uS的时间基本上就是FreeRTOS发送Semaphore、中断退出、做任务切换调度、TaskButton任务中接收semaphore的过程的时间。也可以看作是FreeRTOS的任务对中断事件的响应速度。
注意:由于打开了FreeRTOS的统计功能,在任务切换时会消耗一些额外的时间。
就是说,如果要求对中断事件响应速度要小于10uS,相应的处理就必须在中断ISR里面做掉。
常用的做法是在ISR里面做需要快速反应的事情,同时做最基本的数据收集处理,然后尽快退出,发送信令给某个处理任务让其处理需要较多时间和资源的工作。

大家有何看法?

出0入4汤圆

发表于 2015-1-28 14:51:11 | 显示全部楼层
最近在玩FreeRTOS,还不是很娴熟,跟着学习

出0入0汤圆

发表于 2015-1-30 15:22:05 | 显示全部楼层
FreeRTOS学习中

出0入0汤圆

发表于 2015-1-30 16:36:13 | 显示全部楼层
建议一下楼主,FreeRTOS的8.2.0版本开始,提供了更轻量级的信号量交换方式:RTOS Task Notifications(参见:http://www.freertos.org/RTOS-task-notifications.html),可以测试下,换成这种方式后,速度是多少。

出0入0汤圆

发表于 2015-1-30 16:47:30 | 显示全部楼层
Free rtos 还是不错的

出0入0汤圆

发表于 2015-1-30 19:22:54 来自手机 | 显示全部楼层
freertos资料很少,尤其是中文资料

出0入16汤圆

发表于 2015-1-31 09:21:31 | 显示全部楼层
正想学Freertos中。。。

出0入0汤圆

发表于 2015-1-31 09:40:31 | 显示全部楼层
FreeRTOS是不错的......

出0入0汤圆

 楼主| 发表于 2015-2-1 20:45:14 | 显示全部楼层
twitter 发表于 2015-1-30 16:36
建议一下楼主,FreeRTOS的8.2.0版本开始,提供了更轻量级的信号量交换方式:RTOS Task Notifications(参见 ...

嗯,最近在做个紧急的项目,等有空试一下这个Notification的响应。按照其官方说法应该会快很多。

出0入0汤圆

发表于 2016-2-8 22:52:38 | 显示全部楼层
本帖最后由 fnems 于 2016-2-8 22:54 编辑

楼主你好现在还活跃吗?
我最近在Freescale(现在是不是应该说NXP?)的KL02上测试了FreeRTOS的中断响应速度。
FreeRTOS版本是8.2.3,硬件是KL02 Freedom,时钟频率48MHz。
用信号量(BinarySemaphore)从中断发生到响应大概需要630个指令tick(我捕捉Systick的计数差值),改用Notification的话大概585个tick。
感觉这种响应速度太慢了啊…

出100入101汤圆

发表于 2016-2-8 23:18:41 | 显示全部楼层
fnems 发表于 2016-2-8 22:52
楼主你好现在还活跃吗?
我最近在Freescale(现在是不是应该说NXP?)的KL02上测试了FreeRTOS的中断响应速 ...


一个tick是多长时间?

出0入0汤圆

发表于 2016-2-8 23:24:21 | 显示全部楼层
fengyunyu 发表于 2016-2-8 23:18
一个tick是多长时间?

根据Cortex-M系列内核规范,Systick的tick(不是系统的tick)有两个时钟来源:主时钟和外时钟。对于外时钟,内核规范里不做规定。ST公司是主时钟的8分频,FS是16分频。
在FreeRTOS对于Cortex-M0的官方移植中,Systick采用主时钟,所以一个主时钟对应一个Tick,狭义上讲可以认为是一个Tick时间里能执行一条普通单周期指令。

从时间角度讲,由于采用了KL02芯片,主时钟48MHz,一个tick是1/48 us,所以调度占用了12.5us左右的处理器时间,这个响应速度,个人感觉太慢了……

出0入0汤圆

发表于 2016-4-15 21:11:11 | 显示全部楼层
12.5uS,这如果是串口波特率高了,或者SPI接口开了中断,如何响应?全部在中断里做会不会阻塞其他的,导致响应更慢。

出0入0汤圆

发表于 2016-4-15 21:12:39 | 显示全部楼层
fnems 发表于 2016-2-8 23:24
根据Cortex-M系列内核规范,Systick的tick(不是系统的tick)有两个时钟来源:主时钟和外时钟。对于外时 ...

12.5uS这个也太慢了,如果串口的波特率调高或都SPI接口中断使能,那这些东西只能在中断里操作,这样会不会导致阻塞掉系统调用。

出0入0汤圆

发表于 2016-4-17 18:45:48 | 显示全部楼层
本帖最后由 fnems 于 2016-4-17 18:47 编辑
pldjn 发表于 2016-4-15 21:12
12.5uS这个也太慢了,如果串口的波特率调高或都SPI接口中断使能,那这些东西只能在中断里操作,这样会不 ...


如果某个通讯接口的中断里没有调用OS API,那么就看优先级,默认情况下系统调度的优先级应该是Systick,这样没有特殊情况,系统调度优先级是更高的,不会被通讯打断。

另外,个人认为,一个设计良好的程序中中断响应不应该是阻塞的。中断都应该迅速结束。
如果涉及到耗时的响应,则应该放在中断之外,然后用信号量同步处理。

再另外,如果都要上OS了,从实用角度看这个控制器起码要有DMA,因此不应该频繁进入通讯中断进行字节操作,而是应该进行帧操作。

出0入0汤圆

发表于 2016-4-17 20:14:59 | 显示全部楼层
fnems 发表于 2016-4-17 18:45
如果某个通讯接口的中断里没有调用OS API,那么就看优先级,默认情况下系统调度的优先级应该是Systick, ...

当然应该尽量保证中断里面的执行时间短,但实际使用过程中中断执行时间在5uS的话不是很正常的,比如串口中断清中断标志,数据传到Buffer差不多就行3-4个uS了。

出0入0汤圆

发表于 2016-4-25 16:17:45 | 显示全部楼层
pldjn 发表于 2016-4-17 20:14
当然应该尽量保证中断里面的执行时间短,但实际使用过程中中断执行时间在5uS的话不是很正常的,比如串口 ...


“串口中断清中断标志,数据传到Buffer”这些确实要在中断里实现。

但是我还是不太明白,为什么这些操作需要若干微秒才能执行完…
算一下的话,48MHz的主频,3us时间里大概能执行144条指令了,自己写过的应用中中断只有数十条命令啊,10条指令之内都很平常。
不知道是不是自己接触的应用环境都要求太少,功能太简单;也好奇需要3us的中断是什么样子的

出0入0汤圆

发表于 2016-4-27 11:11:46 | 显示全部楼层
fnems 发表于 2016-4-25 16:17
“串口中断清中断标志,数据传到Buffer”这些确实要在中断里实现。

但是我还是不太明白,为什么这些操 ...

可能因为我用的芯片的关系 ,M0的芯片跑到32M,出入栈的时间就差不多1uS了。再加上中断里面的数据收发,就差不多3uS多了。

出0入0汤圆

发表于 2016-4-29 08:55:14 | 显示全部楼层
pldjn 发表于 2016-4-27 11:11
可能因为我用的芯片的关系 ,M0的芯片跑到32M,出入栈的时间就差不多1uS了。再加上中断里面的数据收发, ...

原来如此
ARM寄存器多,入栈是个不小的负担啊

出0入0汤圆

发表于 2016-7-8 14:58:43 | 显示全部楼层
typedef struct QueueDefinition
{
  int8_t * pcHead;
  int8_t * pcTail;
  int8_t * pcWriteTo;
  int8_t * pcReadFrom;
  List_t xTasksWaitingToSend;
  List_t xTasksWaitingToReceive;
  UBaseType_t uxMessagesWaiting;
  UBaseType_t uxLength;
  UBaseType_t uxItemSize;
  int8_t cRxLock;
  int8_t cTxLock;
} xQUEUE;

typedef struct Queue_t;
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 11:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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