Programın linux'ta çalıştığını varsayıyorum. Linux altında çalışan bir programın bu şekilde sürekli "polling" yapması hiç de uygun olmaz.Hem işlemcinin daha fazla ısınmasına sebep olur, hem daha yüksek güç sarfiyatına sebep olur, hem de kritik süreçler için daha az işlemci gücü kalır elde.
O %3 ü de nasıl gördün bilmiyorum ama, orada iki ayrı yüklemeye bakman lazım. User ve kernel. En garanti metot, top programını çalıştırmak ve toplam "idle" yüzdesine bakmak. Bunu yaparsan muhtemelen şaşıracaksın, çünkü %3 ten daha fazla işlemci gücü sarfediliyordur.
Şimdi gelelim bunun en etkili bir şekilde nasıl yapılacağına. İki metot kullanabilirsin.
1) GPIO'ları "interrupt" modda tanımlarsın ve /sys/class/gpio altındaki dosyada bir değişim olmasını beklersin. Bunun için de poll fonksiyonunu kullanabilirsin.
2) Linux kernel'deki gpiokeys sistemini kullanarak, o GPIO'yu bir klavye tuşu gibi sisteme tanıtabilirsin. Bunu yaptıktan sonra artık o GPIO'daki bir değişim, bir klavye tuşuna basılma gibi olacaktır. Klavye ile etkileşim için de ya termios veya ncurses kullanabilirsin.
Bana kalırsa en temiz yöntem ikincisi. Ama iş hayatı bu, herşeyi tam olarak olması gerektiği gibi yapmaya her zaman vakit olmuyor. İşi bir an önce bitirip hemen başka bir işe geçmen gerekiyorsa birinci yöntemi kullanabilirsin.