[APM32F1] 用DWT分析APM32F103ZE Keil中states的代表什么意思及作用

[复制链接]
 楼主| zjh20070904 发表于 2022-6-15 09:50 | 显示全部楼层 |阅读模式
本帖最后由 zjh20070904 于 2022-6-15 09:53 编辑

1 概述
最近处理测试软件执行时间、分析MCU性能,是通过同相对比Keildebug有个参数states实现,对该数据的理解很浅,,在网上查找了资料,暂无明确数据说明,网上有用51单片机作举例的,但是我用的芯片是M3内核的,同时也没有详细的数据。

于是乎!自己用DWT测量代码运行时间,统计数据、分析states和程序运行时间的关系。


2 DWT是什么
DWT是内核的一个模块,有一个功能是统计CPU的执行周期数,。
在应用可以用来测量某一段代码的执行时间、延时功能,单位是系统时钟的周期。

具体资料可以到网上查找。在这里是用DWT测量代码执行的时间,并和Keil 中的states作比较,通过数据分析states的单位是什么、在实际应用中有什么作用。

说明:DWT的配置方法参考了野火的DWT例程配置方法。


3 测试代码
  1. volatile uint32_t tick = 0;

  2. #define  DWT_CR      *(uint32_t *)0xE0001000
  3. #define  DWT_CYCCNT  *(uint32_t *)0xE0001004
  4. #define  DEM_CR      *(uint32_t *)0xE000EDFC

  5. #define  DEM_CR_TRCENA                   (1 << 24)
  6. #define  DWT_CR_CYCCNTENA                (1 <<  0)

  7. void SoftDelay(uint32_t m)
  8. {
  9.         while(m--);        
  10. }

  11. void SysTick_Delay_ms(__IO uint32_t ms)
  12. {
  13.     tick = 0;
  14.     SysTick_Config(SystemCoreClock / 1000);
  15.     while(tick < ms);
  16.         SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;        
  17. }

  18. //为了方便在调试中显示数值,定义为全局变量
  19. uint32_t CNT_Start = 0,CNT_End = 0 ,CNT_Use = 0, time_us=0;
  20. int main(void)
  21. {
  22.         //初始化DWT的计数系统时钟个数功能,参考了野火的例程
  23.         DEM_CR |= (uint32_t)DEM_CR_TRCENA;               
  24.         DWT_CYCCNT = (uint32_t)0u;
  25.     DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
  26.         
  27.         //获取当前的计数个数
  28.         CNT_Start=DWT_CYCCNT;        
  29.         //执行测试代码
  30.         SoftDelay(1000000);
  31. //        SysTick_Delay_ms(100);
  32.         CNT_End=DWT_CYCCNT;
  33.         
  34.         CNT_Use = CNT_End-CNT_Start;
  35.         time_us = (CNT_Use) / ( SystemCoreClock / 1000 ); //转化为单位为us的数值
  36.         
  37.     while(1)
  38.     {
  39.     }
  40. }

  41. void SysTick_Handler(void)
  42. {
  43.     tick++;
  44.         
  45. }



4 实验数据与结论4.1 运行SysTick硬件延时
4.1.1 72MHz
1.png

2.png


4.1.2 24MHz
3.png

4.png

  
系统时钟
  
DWT计数器差值  
states差值
72MHz
0x006DDD92
  
转为十进制:7200146
4302167502-4294967310=7200192
24MHz
0X00249F74
  
转为十进制:2400116
4297367465-4294967310=2400155
初步结论
1states记录的数据变化值就是SYSCLK的个数
  
2states的单位是系统时钟的周期

4.2 运行软件延时
4.2.1 72MHz
5.png


6.png


4.2.2 24MHz
7.png

8.png

  
系统时钟
  
DWT计数器差值  
states差值
72MHz
0x0089545B(9000027)
4303967387-4294967310=9000077
24MHz
0x003D0911(4000017)
4298967366-4294967310=4000056
初步结论
1、同样的软件延时在不同的系统时钟下消耗的时间:
  
9000027/72000=125ms
  
4000017/24000=166ms
  
降低系统时钟频率时,同样的代码消耗的系统时钟周期数量减少,但整体运行的时间是延长的
  
2、但消耗的系统时钟周期并不是倍数的关系,不知道是否和M3内核的使用一个3级流水线有关(不理解其原因),还是和Flash的取指令、等待周期、预取缓存设计有关,这个问题先放在这吧,有大神知道的话,请答复,不胜感激。







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

本版积分规则

认证:极海半导体
简介:珠海极海半导体有限公司是一家致力于开发工业级/车规级微控制器、模拟与混合信号IC及系统级芯片的集成电路设计型企业。极海团队拥有20年集成电路设计经验和嵌入式系统开发能力,可为客户提供核心可靠的芯片产品及方案,实现准确感应、安全传输和实时控制,助力客户在智慧家居、高端消费电子、工业控制、汽车电子、智慧能源以及通信设施等领域的拓展创新。

29

主题

68

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部