rt_pin_write的执行时间测试

在正点原子战舰开发板做的测试:

使用位带操作代码:

#define LED0 PBout(5)// PB5
 int main(void)
 {	
	delay_init();	    //延时函数初始化	  
	LED_Init();		  	//初始化与LED连接的硬件接口
	while(1)
	{
		LED0=0;
		LED0=1;
	}
 }

使用位带操作的波形:
在这里插入图片描述

使用std标准库代码:

 int main(void)
 {	
	delay_init();	    //延时函数初始化	  
	LED_Init();		  	//初始化与LED连接的硬件接口
	while(1)
	{
		
		GPIO_ResetBits(GPIOB,GPIO_Pin_5);
		GPIO_SetBits(GPIOB,GPIO_Pin_5);
	}
 }

使用std标准库波形:
在这里插入图片描述
使用HAL库代码:

int main(void)
{
    HAL_Init();                    	 	//初始化HAL库    
    Stm32_Clock_Init(RCC_PLL_MUL9);   	//设置时钟,72M
	delay_init(72);               		//初始化延时函数
	LED_Init();							//初始化LED	
	
	while(1)
	{
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); 	//LED0对应引脚PB5拉低,亮,等同于LED0(0)
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);   	//LED0对应引脚PB5拉高,灭,等同于LED0(1)
	}
}

使用HAL库波形:
在这里插入图片描述
使用rt_pin_write接口代码:

#define LED0_PIN    GET_PIN(B, 5)
int main(void)
{
    int count = 1;
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);

    while (count++)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
        //rt_thread_mdelay(500);
        rt_pin_write(LED0_PIN, PIN_LOW);
        //rt_thread_mdelay(500);
    }

    return RT_EOK;
}

使用rt_pin_write接口波形:
在这里插入图片描述
可以得出对比结果:

代码风格执行时间(ns)
位带操作319
std标准库694
HAL标准库736
rt-thread接口4833

分析下代码流程:

void rt_pin_write(rt_base_t pin, rt_base_t value)
{
    RT_ASSERT(_hw_pin.ops != RT_NULL);
    _hw_pin.ops->pin_write(&_hw_pin.parent, pin, value);
}

找到 _hw_pin.ops->pin_write实际上是函数stm32_pin_write

static void stm32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
{
    const struct pin_index *index;

    index = get_pin(pin);
    if (index == RT_NULL)
    {
        return;
    }

    HAL_GPIO_WritePin(index->gpio, index->pin, (GPIO_PinState)value);
}

这里还有一个get_pin(pin);函数,个人觉得是因为这部分代码运行需要时间而造成的。

顺便再做一个测试:

int main(void)
{
    int count = 1;
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);

    while (count++)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
		rt_pin_write(LED0_PIN, PIN_HIGH);
        //rt_thread_mdelay(500);
        rt_pin_write(LED0_PIN, PIN_LOW);
        //rt_thread_mdelay(500);
    }

    return RT_EOK;
}

在这里插入图片描述

int main(void)
{
    delay_init();       //延时函数初始化
    LED_Init();         //初始化与LED连接的硬件接口
    while (1)
    {

        GPIO_ResetBits(GPIOB, GPIO_Pin_5);
        GPIO_SetBits(GPIOB, GPIO_Pin_5);
        GPIO_SetBits(GPIOB, GPIO_Pin_5);
    }
}

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值