附录 B 时间基准
B.1 时间基准
本附录描述SYS/BIOS函数的时间基准,解释了值的含义及它是包含是如何获得的,使设计者更好地理解系统性能。
本节在稍后解释每个时间基准的含义。每个节的名称对应于实际基准数据表中基准的名称。
本附录中的解释最好沿实际基准数据查看,因为实际基准数据依赖于目标和内存配置,并且会发生变化,数据在ti.sysbios.benchmarks包的HTML文件中提供(在BIOS_INSTALL_DIR\packages\ti\sysbios\benchmarks目录中)。
基准数据在 Build-Profile设置为“release”并且BIOS.libType配置参数设置为BIOS.LibType_Custom的情况下收集。见2.4.5节获取更多这些设置的详细信息。
B.2 中断延迟
中断延迟基准是SYS/BIOS内核禁用可屏蔽中断期间的最大时钟周期数。为了修改跨多个线程的共享数据,中断被屏蔽。SYS/BIOS尽可能缩小此时间以获得最快中断响应时间。
中断延迟在SYS/BIOS应用上下文控制内部禁用中断的SYS/BIOS API调用时测量。定时器在应用程序中的每个指令边界触发中断,该延迟被计算为以时钟周期为单位的时间,从向量到中断调度器的第一个指令。注意,这不是从时间到用户ISR的第一个指令。
B.3 HWI - 硬件中断基准
Hwi_enalbe():这是Hwi_enable()函数调用的执行时间,通常用于全局地使能硬件中断。
Hwi_disable():这是Hwi_disable()函数调用的执行时间,通常用于全局地禁用硬件中断。
Hwi调度器:这是Hwi调度器指定部分代码的执行时间。此调度器处理响应中断而运行的C代码。基准在以下情况下提供时间:
- C函数调用前的中断序言:这是中断发生直到用户的C函数被调用所花费的时间。
- C函数调用后的中断收尾:这是用户C函数执行完毕直到Hwi调度器完成此项工作并退出所花费的时间。
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img1.ph.126.net/01iy51pSq8dUM9JAePIKDQ==/6632141988559938655.jpg)
硬件中断到软件中断:它计算从ISR提交一个软件中断开始,到执行被提交的最高优先级软件中断的第一个指令结束,期间所使用的时间。
这个持续时间如图B-2所示。Swi 2由ISR提交,优先级高用Swi 1,所以Swi 1被抢占。Swi 2上下文切换在由Hwi调度器调用的Swi运行器中执行,这个时间也被测量。在这种情况下,通过Hwi调度器保存/恢复寄存器相当于“C”调用者保存寄存器。
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img0.ph.126.net/QxNRPWehgmF_TBpyMD4z7A==/6631934180862286818.jpg)
Swi_enable():这是Swi_enable()函数调用的执行时间,用于使能软件中断。
Swi_disable():这是Swi_disable()函数调用的执行时间,用于禁用软件中断。
Swi_post():这是Swi_post()函数调用的执行时间,用于提交软件中断。以下情况的Swi_post()提供基准数据:
- 再次提交软件中断:这种情况对应于:一个Swi已经被提交,但未开始运行,此时再次调用Swi_post()提交它,因为它被更高优先级的Swi提交。图B-3显示了这种情况。高优先级Swi 1提交低优先级Swi 2两次,在第二次提交Swi 2时开始测量时钟周期。
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img1.ph.126.net/sgi7zew4GyJYAwbtZ5u5LA==/6631885802350676080.jpg)
- 无上下文切换的软件中断提交:这是Swi_post()函数调用的测量,当所提交的软件中断的优先级低于当前运行的Swi。图B-4显示了这种情况:
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img0.ph.126.net/qNjsyPIW5HlkrAC8uMPvrQ==/6632092510536697572.jpg)
- 有上下文切换的软件中断提交:此测量计算从一个Swi_post()(导致当前Swi被抢占)开始,到执行更高优先级软件中断的第一个指令结束,期间所使用的时间,如图B-5所示。上下文切换到Swi 2是在Swi运行器内执行的,这个时间也被测量。
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img0.ph.126.net/5-uD8E-1DlGSXK4F4Ny3PA==/6632096908583209212.jpg)
B.5 Task基准
Task_enable():这是Task_enable()函数调用的执行时间,它用于使能SYS/BIOS task调度器。
Task_disable():这是Task_disable()函数调用的执行时间,它用于禁用SYS/BIOS task调度器。
Task_create():这是Task_create()函数调用的执行时间,它用于创建一个准备运行的task。以下情况下Task_create()会提供基准数据:
- 无上下文切换的task创建:正在运行的task创建并准备另一个低或相同优先级task,这不会导致上下文切换。见表B-6:
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img1.ph.126.net/dVR21rKKEqQphvP8JLTlNg==/6631918787699513539.jpg)
- 有上下文切换的task创建:正在运行的task创建另一个更高优先级的task,导致上下文切换。见图B-7:
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img1.ph.126.net/wmF46xdiW4aZWUC_142UNA==/6632032037397167725.jpg)
注意:Task_create()的基准假设为Task对象分配的内存在第一个free列表中是可用的,并无其它task锁住那块内存。另外栈已被预分配并作为一个参数传递。
Task_delete():这是Task_delete()函数调用的执行时间,用于删除一个task。由Task_create()所创建的Task句柄传递给Task_delete() API。
Task_setPri():这是Task_setPri()函数调用的执行时间,用于设置task的运行优先级。以下情况的Task_setPri()提供基准数据:
- 无上下文切换的task优先级设置:当从如图B-8所示的Task1中调用Task_setPri() API时,测量执行时间,并且还需满足以下两个条件:
— Task_setPri()设置的是处于准备状态的低优先级task的优先级。— Task_setPri()的参数小于当前运行task的优先级。
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img1.ph.126.net/kYUqBqGKZatCbWmhLF0A2g==/6631881404304167821.jpg)
- 降低当前task的优先级,上下文切换:当Task_setPri() API用于降低当前运行的任务的优先级,测量它的运行时间。调用Task_setPri()会导致上下文切换至下一个准备中的更高优先级的task。图B-9显示了这种情况:
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img2.ph.126.net/2bJSisErxkBE9-eqjQcaZg==/6632023241304148874.jpg)
- 提升一个准备task的优先级,上下文切换:当从任务Task1调用Task_setPri() API并满足以下两个条件时,测量它的执行时间:
— Task_setPri()设置的是一个更低优先级的准备task的优先级。— Task_setPri()的参数大于当前运行task的优先级。运行时间测量包含上下文切换时间,如图B-10所示:
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img0.ph.126.net/weDiQMYM-1k5OcZVk5g7GA==/6632018843257637973.jpg)
- Task_yield():此测量计算从调用Task_yield()(导致当前task被抢占)开始,直到执行下个优先级相同的等待task的第一个指令结束,期间所经历的时间。如图B-11所示:
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img1.ph.126.net/o7-kk_YAezceRM_Cfo0isg==/6632079316397167615.jpg)
B.6 Semaphore基准
Semaphore基准在内部测量发布Semaphore_post()或
Semaphore_pend()函数到task重新执行之间的时间,兼具有上下文切换和无上下文切换。
Semaphore_post():Semaphore_post()函数调用的执行时间。在以下Semaphore_post()情况下提供基准数据:
- 不等待task的semaphore提交:这种情况下,Semaphore_post()函数调用不会导致上下文切换,因为没有其它task在等待semaphore。如图B-12所示:
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img2.ph.126.net/hgoSYYkjDwRkFrGdBJ4CNg==/6631842921397202018.jpg)
- 无上下文切换的semaphore提交:这是当一个低优先级task在等待semaphore,Semaphore_post()函数调用的测量。这种情况下,Semaphore_post()让低优先级task准备好等待semaphore,并继续执行原来的task,如图B-13所示:
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img2.ph.126.net/6xEJwdMFRbwi304B4i_c1Q==/6632062823722752941.jpg)
- 有上下文切换的semaphore提交:此测量计算从Semaphore_post()函数调用开始(让高优先级task准备等待sempahore导致上下文切换至高优先级task),直到执行高优先级任务的第一个指令结束,期间所经历的时间,如图B-14所示:
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img0.ph.126.net/7vP9Nthokr2erNWyzE73cA==/6632035335932061621.jpg)
Semaphore_pend():这是Semaphore_pend()函数调用的执行时间,用于获得一个semaphore。以下情况的Semaphore_pend()提供基准数据:
- 无上下文切换的semaphore等待:这是无上下文切换(因为semaphore可用)的Semaphore_pend()函数调用的测量,如图B-15所示:
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img2.ph.126.net/FRXghT_t9Ap1ybIAdR-Fhw==/6631934180862299309.jpg)
- 有上下文切换的semaphore等待:此测量计算从Semaphore_pend()函数调用开始(导致当前task被抢占),直到下一个更高优先级准备task的第一个指令执行,期间所经历的时间,如图B-16所示:
![基于TI-RTOS的CC2650DK开发(22)--- 时间基准 - 阿巴睇 - 阿巴睇的博客](http://img0.ph.126.net/JWENEVtToRn0vIPyNZOdig==/6632057326164614448.jpg)