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
std标准库 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);函数,个人觉得是因为这部分代码运行需要时间而造成的。

顺便再做一个测试:

扫描二维码关注公众号,回复: 9330130 查看本文章
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);
    }
}

在这里插入图片描述

发布了323 篇原创文章 · 获赞 63 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/qq_27508477/article/details/102253334