PB
По завершении описания абстракции фрейма можно подумать о том, как хотелось бы работать с драйвером протокола. Можно хоть руками заполнять структуру, а можно добавить функции, которые извлекают из фрейма полезную нагрузку, считают контрольные суммы, репортят ошибки и так далее.
"Критерий абстрактности" - код компилируется без включения специфических для платформы хедеров, в нем нет упоминания ни одного регистра. Еще хорошо компилировать разными компиляторами с разными уровнями warning'ов. Я обычно компилирую через GCC -wall и MSVC. Тесты абстракций тоже обычно гоняю на x86 машине.
Короче - стек берет данные из RAM и выводит их в RAM. То есть RAM является буфером, посредником, чем угодно. Никаких регистров периферии. Это не идеальный подход, поскольку иногда можно некоторые задачи решать значительно эффективнее за счет периферии. CRC считать, например. В этом случае можно использовать указатели на функции и обязывать юзера "скармливать" стеку код функций, которые иногда лучше реализовывать средствами, специфическими для платформы.