在正点原子战舰开发板做的测试:
使用位带操作代码:
#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);
}
}