HAL применим только в определенных известных случаях, и означает несколько другое.
Гораздо острее при разработке на микроконтроллере стоит проблема планирования ресурсов периферии микроконтроллера.
HAL нооборот затрудняет планирование ресурсов, поскольку стремится скрыть их ограниченность.
Пример даный выше типа:
void timer_interrupt()
{
halSetTimerCCR1 ( halGetTimerCCR1() + 1 );
HAL-ом не является поскольку в названиях явно указывается на таймерную логику CCR в канале 1.
Это типичный пример организации BSP, а не HAL.
HAL естественно применять в файловых системах или сетевых стеках. И на нижнем уровне HAL-а стоят например такие операции как запись сектора или посылка пакета.
HAL не спускается до уровня регистров. На этом уровне сидит BSP.
И вот в BSP и существует подобный разброд и шатания, куда че сунуть.
Я в BSP всегда стараюсь явно указывать имена регистров без упрятывания регистровых обращений в какие-то оберточные функции.
Лишние функции усложняют броузинг кода и следовательно затрудняют анализ распределения ресурсов периферии.
Ну и конечно по возможности группирую функции с обращениями к регистрам по тематическим группам.
Например все что работает с UART-ами в один файл, все что с I2C в другой и т.д.
В вашем случае я бы оставил прямое обращение к регистрам, но саму процедуру ISR поместил бы в файл работы с таймерами.
Писать прогу с расчетом как можно легче ее портировать на другую платформу это плохой путь, он противоречит цели написать как можно проще для текущей платформы.
Потом оказывается, что простота учит большему чем попытки универсализации под разные платформы. (Не путать с унификацией и абстракцией HAL)
Цитата(rezident @ Sep 3 2008, 21:09)

Оформите его как функцию-драйвер. С командами инициализации, чтения, записи и т.п. Для разных платформ вам нужно будет лишь поправить аппаратно-зависимую часть инициализации таймера. А обращения/вызовы этой функции-драйвера останутся одинаковыми.