|
前言:开发语言没有好与坏,只有适合不适合,希望大家不要开范围炮
MCU:STM32F03RCT6
采样频率:16Mhz
语言:paltformIO(Arduino)
主频:默认,应该是72MHZ
操作IO:PC0-PC7
测试背景:最近折腾一个128*160的8080并口屏,使用arduino写demo测试.库没找到8080并口的,都是IIC和SPI的,就从网上找demo移植了一个,结果刷新速度不尽人意,清一屏差不多1s,明显太不理想了.研究了下最大的原因主要有两点:1.arduino不支持并口操作,只能一位一位的写(我是没找到对应方法),这就导致速度差了8倍 2.arduino在LL库上又进行了多层封装,调用方法本身就有时间开销.
所以测试直接把IO操作换成调用寄存器,结果效果显著,清屏速度差不多能到40帧(速度都是估算,没用精确测试)
以下用逻辑分析仪测试下实际速度
1:digitalToggle切换IO状态
- void loop() {
- digitalToggle(PC0);
- }
复制代码
2:寄存器切换IO状态
- void loop() {
- WRITE_REG(GPIOC->ODR, READ_REG(GPIOC->ODR) ^0x01);
- }
复制代码
可见配置单个IO用digitalToggle用时0.625us,寄存器用时0.3125us,差了一倍,但是这个时间并不准确,因为这个时间还包括了方法调用
3:方法内digitalToggle多次切换IO
- void loop() {
- digitalToggle(PC0);
- digitalToggle(PC0);
- }
复制代码
可见后一次切换明显比前一次时间长,digitalToggle操作实际用时应为0.3125us
4:方法内寄存器多次切换IO
- void loop() {
- WRITE_REG(GPIOC->ODR, READ_REG(GPIOC->ODR) ^0x01);
- WRITE_REG(GPIOC->ODR, READ_REG(GPIOC->ODR) ^0x01);
- }
复制代码
同样两次寄存器操作,可见寄存器操作实际用时62.5ns,差距明显
5:digitalToggle模拟并口操作
- void loop() {
- digitalToggle(PC0);
- digitalToggle(PC1);
- digitalToggle(PC2);
- digitalToggle(PC3);
- digitalToggle(PC4);
- digitalToggle(PC5);
- digitalToggle(PC6);
- digitalToggle(PC7);
- digitalToggle(PC0);
- digitalToggle(PC1);
- digitalToggle(PC2);
- digitalToggle(PC3);
- digitalToggle(PC4);
- digitalToggle(PC5);
- digitalToggle(PC6);
- digitalToggle(PC7);
- }
复制代码
8位操作一次用时2.938us
6:寄存器并口操作
- void loop() {
- WRITE_REG(GPIOC->ODR, READ_REG(GPIOC->ODR) ^0xFF);
- WRITE_REG(GPIOC->ODR, READ_REG(GPIOC->ODR) ^0xFF);
- }
复制代码
用时还是62.5ns,可见和digitalToggle位操作相比写一次并口快了2938/62.5=47倍
后记:
实际上不光是arduino慢,HAL库一样慢,快慢只是相对的,arduino底层也是调用的LL库,自己觉着哪个顺手用哪个就好,需要关注性能的时候可以考虑寄存器混合开发,虽然这样对于arduino来说失去了可移植性,但是实际上特别是搞diy的有几个需要考虑移植呢
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|