高效程式設計---高效的 arm cortex m 的memset
查看了stm32工程裡的memset函式的反彙編程式碼,令人崩潰啊!!!
居然是一個位元組一個位元組地設定,這是什麼效率啊!!!
把stm32工程裡的memset函式的反彙編程式碼貼上:
這庫函式就是任性。簡單!粗暴!
現將自己想得,高效的memset的c程式碼呈上:
void memset_my(uint8_t *src, uint8_t value, uint32_t size_byte)
{
uint32_t align_value;
align_value = (uint32_t)src & 0x03;
if(align_value)
{
align_value = 4 - align_value;
if(size_byte > align_value)
{
while(align_value)
{
*(uint8_t *)src = value;
src += 1;
align_value -= 1;
size_byte -= 1;
}
}
else
{
while(size_byte)
{
*(uint8_t *)src = value;
src += 1;
size_byte -= 1;
}
return;
}
}
align_value = value | (value << 8);
align_value = align_value | (align_value << 16);
while(size_byte >= 4)
{
*(uint32_t *)src = align_value;
src += 4;
size_byte -= 4;
}
while(size_byte)
{
*(uint8_t *)src = value;
src += 1;
size_byte -= 1;
}
}
比stm32庫函式有4倍的效率提升。
更高效的memset函式肯定要用匯編編寫,要利用arm cortex m的載入特性。
彙編程式碼請關注微信公眾號:Jshong