ИМХО, нет здесь универсальных подходов. Наиболее разумно, на мой взгляд, просто вынести "низкоуровневую" работу с переферией в отдельные блоки ("spi.c", "i2c.c" и т.д.), но не заморачиваться при этом чрезмерной стандартизацией процедур. По опыту могу сказать, что перенос весьма объемного проекта (несколько десятков тысяч строк) с одной платформы на другую (в моем случае AT91R40008 -> S3C44B0X), занимает 1-2 дня. А вот стандартизация структур данных может быть очень полезна: например, модуль FIFO, написанный несколько лет назад, использую без изменений до сих пор, и практически во всех проектах общение с UARTом осуществляется именно через этот модуль (тоже своего рода HAL).
|