在实时操作系统中,线程调度花费的时间是一个值得关注的影响系统实时性的因素,尤其是在系统需要处理紧急的任务时,线程调度的时间更是不能忽略。我采用了一种测量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输出电平
}
;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位置1pendsv_exit; restore interruptMSR     PRIMASK, r2ORR     lr, lr, #0x04LDR       r4, = GPIOC_BCR        LDR     r5, = SET_BITSTR   r5, [r4]            ;这句等价于C语言的 *r4 = r5,拉低IO输出电平BX      lrENDP

(关于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线程调度的时间的方法相关推荐

  1. 基于图像识别测试手机浏览器打开网页首屏时间的方法

    本文涉及性能测试技术,特别是涉及一种基于图像识别的测试手机网页首屏时间的方法,它可以应用在手机浏览器页面加载响应时间的的自动化测试或性能检测中.同时可以应用到其他android的apk的响应时间的测试 ...

  2. RT Thread根据开发板制作BSP方法

    之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...

  3. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  4. RT Thread Free Modbus移植问题整理

    RT Thread Free Modbus移植问题整理 问题描述: 在读写寄存器中,写数据正常,只能读1个寄存器的值,多个值会异常. 在移植过程中发现串口(或RS485)数据接收长度异常. 一.环境描 ...

  5. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

  6. 笔记1:VC获取系统时间的方法

    笔记1:VC 获取系统时间的方法 推荐的获取方法 获取时间方法种类 各种获取时间方法详解 方法1:time_t变量 和 time(time_t*)方法 方法2:system(" time&q ...

  7. 测量中的坐标与时间系统1.3(在大地测量学中)

    上接测量中的坐标与时间系统1.2 -------------------------- 上面我们讨论了在卫星大地测量中的坐标时间系统.之前说过这些是大地测量中的坐标时间系统的子集.那么下面让我们看看大 ...

  8. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

    1.前言     [2014年4月重写该博文]     经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...

  9. RT Thread之 Uart2 操作

    官网连接:https://docs.rt-thread.org/#/rt-thread-version/rt-thread-standard/programming-manual/device/uar ...

最新文章

  1. latex写文章的一些细节问题
  2. SAP Fiori图标(icon)设计原理:一个可以查看 SAP UI5 所有可用图标的工具
  3. Atcoder Keyence Programming Contest 2020 D - Swap and Flip
  4. 让Sql Server也能出现如VS一样的智能提示工具--资源更新
  5. Spring Cloud Stream与RabbitMQ 生产者和消费者位于同一个应用服务
  6. 发布了!2020 年 AI 人才发展报告,最高补助 1000 万!
  7. [转]页面回收的理解
  8. 实验4-1-3 找出最小值 (20 分)
  9. Android 关于图片文件夹后缀错误,使应用在源码下编译通过却无法运行的错误...
  10. paip.html 及css调试工具---debugbar
  11. Linux主机驱动与外设驱动分离思想 1
  12. 源码解析少儿编程微课程9:机械手臂模拟制作
  13. android手机如何隐藏应用程序,三星手机怎么隐藏图标/软件 三星隐藏应用程序设置方法...
  14. win7如何创建宽带连接
  15. obsidian vim模式切换输入法
  16. 电脑双屏显示变单屏后部分程序无法在当前屏幕显示的问题
  17. 如何用vscode替代xshell
  18. 【算法】离散傅里叶变换(DFT)
  19. 灵魂有香气的女子李筱懿:不要用示弱的方式去交往
  20. SRPG游戏开发(二十三)第七章 寻路与地图对象 - 一 A*寻路算法(A* Search Algorithm)

热门文章

  1. 公众号h5获取手机号权限_微信公众号开发之网页授权(获取用户信息)
  2. 如何查询往年国家自然科学基金
  3. Win10安装nodejs 错误代码2502,2503
  4. dz论坛附件在服务器中的位置,discuz x3 如何将头像和帖内等附件分离到远程服务器?...
  5. Golang method 方法详解
  6. 软技能-代码之外的生存指南读后感 学习篇
  7. 【软考】【知识产权与法律法规】
  8. 本地服务器模板网站怎么安装,使用dedecms搭建自己的本地网站(全程图解)
  9. 【OpenHarmony】napi基础知识学习
  10. ClasssLoader