首页 > 其他分享 >rt-thread 性能测试

rt-thread 性能测试

时间:2024-02-21 20:55:23浏览次数:20  
标签:rt thread 中断 调度 GPIOC PendSV 线程 测试 SysTick

  在实时操作系统中,线程调度花费的时间是一个值得关注的影响系统实时性的因素,尤其是在系统需要处理紧急的任务时,线程调度的时间更是不能忽略。我采用了一种测量GPIO输出正脉冲宽度的方法,测量出了RT-Thread系统线程调度所需的时间。
  实验中,我使用了GD32F103系列单片机,单片机的系统时钟为108MHz,内核为Cortex-M3,实时操作系统采用了RT-Thread V3.1.5。实验的目的是测量了SysTick中断引起的线程调度所花费的时间。

实验设计

  为了较准确地测量SysTick中断引起的线程调度所花费的时间,需要保证每次进入Systick中断都会引起线程调度。因此,我把代码中多于的线程都删掉,只保留了main_thread和rt_thread_idle两个线程。介绍一下这两个线程,它们是RT-Thread内核初始化时由系统创建的两个线程,main_thread用于跑main函数(RT-Thread中main函数也是一个线程),idle线程是当其他所有高优先级线程都被挂起时才会运行的线程。RT-Thread内核初始化时还会创建一个timer_thread,但是实验中我把它的创建函数注释掉了。将main_thread和rt_thread_idle两个线程设置成相同优先级,并且都只分配一个时间片,两个线程中的while(1)死循环中不做任何事情,即线程满负荷运行,这样,RT-Thread的时间片轮转机制会使每次SysTick中断都引起一次线程调度,而且只有SysTick中断会产生线程调度。
  RT-Thread的上下文转换代码是用汇编语言写在PendSV中断里。PendSV中断的特点是能够延迟上下文切换的请求,直到其它的中断请求都完成了处理后才执行,处理流程如下图所示。在这里插入图片描述  SysTick中的代码将悬挂一个PendSV中断请求,当SysTick中断返回后就开始执行PendSV中的上下文切换,实现任务调度。我将GPIO输出电平拉高的代码放在SysTick_Handler中断处理函数的最后一行,GPIO输出电平拉低的代码放在了PendSV_Handler中断处理函数返回前,然后用示波器测量正脉冲宽度就可以知道线程调度花费的时间。

void SysTick_Handler(void)
{
	/*如果想测量执行SysTick中断和PendSV中断共需要多长时间,  */
	/*可以吧GPIOC->BOR = GPIO_PIN_11放在SysTick_Handler开头*/
    /* enter interrupt */
    rt_interrupt_enter();
    run_freq++;
    rt_tick_increase();
    /* leave interrupt */
    rt_interrupt_leave();
    /*GPIO初始化代码可以写在main函数进入while(1)之前*/
    /*为了减少IO口电平变化代码的执行时间,提高测量精度,这里直接操作寄存器拉高输出电平*/
    GPIOC->BOR = GPIO_PIN_11;//拉高IO输出电平
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
;PendSV是用汇编写的,这里只贴出一部分
GPIOC_BASE EQU 0x40011000       ;GPIOC寄存器基地址,EQU类似C语言的#define
GPIOC_BCR  EQU GPIOC_BASE+0x14  ;GPIOC的BCR寄存器地址
GPIOC_BOR EQU GPIOC_BASE+0x10
SET_BIT	  EQU 0x0800			;用于寄存器第11位置1

pendsv_exit
    ; restore interrupt
    MSR     PRIMASK, r2

    ORR     lr, lr, #0x04
	LDR		r4, = GPIOC_BCR		
	LDR 	r5, = SET_BIT
	STR 	r5, [r4]			;这句等价于C语言的 *r4 = r5,拉低IO输出电平
    BX      lr
    ENDP
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(关于C语言调用汇编函数的方法可以参考我的另一篇博文
Cortex-M3寄存器组、汇编语言与C语言的接口介绍

实验结果

在这里插入图片描述  上图测量的是PendSV_Handler执行上下文切换所需要的时间,即前面贴出的代码那种写法所产生的正脉冲宽度。图中,示波器水平方向一格为1μs,正脉冲宽度是0.7μs。
在这里插入图片描述  上图测量的是SysTick_Handler和PendSV_Handler执行上下文切换总共需要的时间,图中,示波器水平方向一格为10μs,正脉冲宽度是7.5μs。
  线程调度时间按0.7μs算,SysTick中断频率为1KHz,1s内产生1000次线程调度,共用时0.7ms,CPU有0.07%的时间在进行线程调度。只要合理设计实验,用这种方法还可以测量实时操作系统中各种内核对象运行的时间,比如信号量release到线程恢复运行的时间,阻塞延时的准确性等。

 

标签:rt,thread,中断,调度,GPIOC,PendSV,线程,测试,SysTick
From: https://www.cnblogs.com/zxdplay/p/18026186

相关文章

  • Python:Short Circuiting -- “OR”
    ShortCircuitingOperatorChecksif:Evaluatesfromlefttorightupto:ExampleANDAllvaluesaretrueThefirstfalsevalueFalseand1/0evaluatestoFalseORAtleastonevalueistrueThefirsttruevalueTrueor1/0evaluatestoTrue......
  • WinRT: 可能是 Windows 上最好用的 Native ABI 和远程调用方案
    前言Windows自从很久以来就有一个叫做COM的NativeABI。这是一套面向对象的ABI,在此之上Windows基于COMABI暴露了各种各样的API,例如ManagementAPI、ShellAPI和DirectXAPI就是典型。COM自然不仅局限于进程内调用,跨进程的RPC调用也是不在话下。但无论如何,COM......
  • git reset 命令详解 git revert命令详解。
    https://blog.csdn.net/wangdawei_/article/details/124543824gitreset命令详解reset命令介绍参数使用commit还没有pushcommit已经push补救gitrevert命令revert说明举例命令reset命令介绍gitreset命令格式为:gitreset[--soft|--mixed|--hard][<commitid>]在git......
  • 初三年后集训测试 T2--牛吃草
    初三年后集训测试$T2$牛吃草一言难尽$$HZOI$$$Description$由于现代化进程的加快,农场的养殖业也趋向机械化。\(QZS\)决定购置若干台自动喂草机来减少自己每天的工作量。为了简化问题,\(QZS\)决定将草地建模成一条线段,总长为\(n\),即共有\(n\)个单位长度,编号从......
  • 2024初三年后集训模拟测试3
    前言比赛链接难度不好说,感觉是东拼西凑的题,但是除了\(T1\)都不简单。\(T1~100pts:\)贪心+四边形不等式。\(T2~70pts:\)读假题了,是最大\(w_i\)不是固定\(w_i\),做法是二分答案+DP,不过需要单调队列优化,不会这玩意儿赛后学了好久\(qwq\)。但是读假题了还能拿......
  • 马斯克称首位受试者可凭思维操控鼠标;字节低调推出视频模型丨 RTE 开发者日报 Vol.148
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • secueCRT脚本小试牛刀
    secureCRT可以使用脚本自动化执行操作,如登录脚本。支持vbs、python(目前最高仅3.9)和jscript。据说还可以录制操作,没试过。secureCRT版本为9.10。secureCRT内置了一些对象,入crt,具体用法可见官网,或其他网上资料。尝试了vbs和python,功能一样:#$language="VBScript"#......
  • 2023 re:Invent 用 PartyRock 10 分钟构建你的 AI 应用
    前言一年一度的亚马逊云科技的re:Invent可谓是全球云计算、科技圈的狂欢,每次都能带来一些最前沿的方向标,这次也不例外。在看完一些keynote和介绍之后,我也去亲自体验了一些最近发布的内容。其中让我感受最深刻的无疑是PartyRock了。PartyRock真的算是做到了:能让任何人快速......
  • thread_local的一些用法
    thread_local变量thread_local变量是C++11新引入的一种存储类型。它会影响变量的存储周期(Storageduration),C++中有4种存储周期:automaticstaticdynamicthread有且只有thread_local关键字修饰的变量具有线程周期(threadduration),这些变量(或者说对象)在线程开始的时候......
  • import { flattenKeys } from '.'; 是从哪里导入的flattenKeys
    import{flattenKeys}from'.';这行代码是从当前目录(currentdirectory)导入名为flattenKeys的函数或变量。在Node.js项目中,.表示当前目录的入口文件,通常是index.js或者与当前文件在同一目录下的其他导出模块。这意味着你在这个项目的某个文件夹内有一个文件(例如index.......