01 ICACHE功能
一、前言
在 STC32F系列的单片机中, 设置了 ICACHE 功能, 也就是高速指令缓冲功能。 这样可以解决内部 指令存储器速度低的问题。 ·下面通过自制的单片机测试版, 测试一下 ICACHE的功能。 测试中,单片机的 IRC频率设置为 56MHz。
二、测量结果
这里利用了NOP命令序列进行测试。 利用 ON,OFF 宏指令, 对P1.0管脚电平进行改变, 通过示波器测量 P1.0 高电平时间便可以测量中间 四十个 NOP 指令执行时间。 需要说明的, 这个时间还应该包括对 P1.0 赋值的时间。 示波器测量的波形为一个方波脉冲, 利用光标测量时间, 可以看到高电平时间为 737 纳秒。 因此对应的指令周期为 18.425纳秒, 相当于54.27 MHz。这与单片机工作频率非常接近了。 如果考虑到 ON,OFF 指令, 可以说,此时内部指令执行速度就是 56MHz。
(资料图)
▲ 图1.2.1 打开ICACHE功能
下面关闭 ICACHE 功能, 在工程文件中将相应功能宏定义设置为 0。 那么在单片机初始化程序中, 这一段打开 ICAHCE 功能的函数就被禁止掉。 这是测量相同 四十个 NOP 指令对应的执行时间。 可以看到时间增加到915纳秒。 这比起 开启 ICACHE功能之后时间增加了 24% 左右。 这是因为其中取指序列中插入了等待时间所致。 由此可见, ICACHE 预取指缓存的功能可以减少取指过程所带来的执行时间延长。
▲ 图1.2.2 关闭ICACHE功能
上面的对比是在MCU时钟为 56MHz, WTST 设置为 1的情况下测量的, 下面为了突出 ICACHE的功能, 有意将 WTST 的时间设置为 10, 这样是否存在 ICACHE的加速效果就会增加。 这是在 ICACHE关闭的情况下, 执行四十个 NOP 指令所消耗的时间。执行时间为 3.59微秒。 将 ICACHE 打开之后, 执行时间就只有 0.737微秒了。 可以看到 ICAHCE 提速的效果非常明显了。
▲ 图1.2.3 设置WTST等于10,ICACHE关闭对应的NOP(40)执行时间
▲ 图1.2.4 设置WTST等于 10, ICACHE打开对应的NOP(40)执行时间
下面测量一下更复杂程序执行的时间, 这里在原来的 NOP 指令基础之上, 增加了浮点与三角函数运算。注意, 这里并没有利用 STC32F12内部的硬件浮点和三角函数运算功能。 这是在 ICACHE打开的情况下, WTST等于1, 对应的执行时间, 大约为 7.46微秒。 在 ICACHE打开的情况下, 执行时间为 6.90微秒。·速度大约提高了 8%左右。
由此可见, 对于复杂的算术运算, ICACHE的功能并不那么明显。 对于 NOP 等普通的命令, ICACHE提升速度明显。
ON(LED);NOP(40);f1=nSendCount;f2=1.2334;f3=atan(f1*f2);OFF(LED);
▲ 图1.2.5 ICACHE打开情况下执行时间
▲ 图1.2.6 ICACHE关闭情况下执行时间
※ 总 结 ※
本文测试了 STC32F12 中的指令高速缓冲功能, 可以看到在 WTST 不等于 0 的情况下, 它对于普通指令序列存在明显的提速功能。