А без оптимизатора задача не имеет решения, иначе нужна отсутствующая вложенность определений. Из-за наличия нескольких очень похожих проектов буквально на днях сделал такое структурирование доступа к портам для MSP: // описание выводов (ввод и вывод могут совпадать, возможны несколько //бит и инверсия порта на вводе)
INPUT ( SdaIn , P2 , 0x01 )
OUTPUT ( Sda , P2 , 0x01 )
ADC ( PowerAdc , ADC12MEM6 , 0x40 )
FUNCTION ( SdaLow , P2DIR, mSda )
...
//описание порта направление-начальное значение - маска //функциональных выводов
PORT ( P1 , mPulseWdt | mBacklight , 0 , mIrdaTx )
Которые разворачиваются в инлайновые:
GetPin(SdaIn);
OnPin(Sda);
OffPin(Sda);
OnFunction(SdaLow);
OffFunction(SdaLow);
Ну и в ConfigPorts(void) включается инициализация регистров DIR, OUT и SEL.
Для конкретного примера с sda OUTPUT можно не определять - управление производится с помощью направления.
Пока проблем нет, всем доволен. Беспокоит, конечно, что все отдано на откуп оптимизатору плюс "инлайнингу".
Кстати, вчера увидел, что версия 421 химичит с инлайном - вроде включает функцию в код, но самостоятельно группирует отдельные фрагменты кода функции. Нужно проверить, что стоит в оптимизаторе, не balanced ли.