Vit (12.11.2008 01:27, просмотров: 642) ответил Сергей Борщ на если внутри функции приведение не нужно, то на что же ругался компилятор у -=John=-? __generic - вообще неоправданная трата ресурсов в этом случае. Тип параметра известен заранее.
Понимаю так, что __io это атрибут, порождающий нечто похожее на #define PORTn (*(unsigned char*)(_ADDR+IO_BASE)), где IO_BASE равно известному 0x20, потому у него нет явной типизации, но некоторые действия как с указателями всё-таки применимы. Попробовал без приведения к __io
typedef unsigned char volatile port_t;
void foo(port_t * prt, unsigned char val){
*prt = val;
}
ничего не изменилось - работает.
Вероятно, что, кроме прибавления 0x20 (возможно в сочетании __io с @) и разгребания компилером на ходу способа обращения в зависимости от адреса и камня, ничего другого не делается. Для меги128 что с PORTB (0x18, а это меньше 0x3F), что с PORTG (0x65, а это уже выше 0x3F) симулятор показывает, что оно работает. Хотя есть вероятность, что компилер иногда забывчив или симулятор дурит, потому явное приведение типа/атрибута, ИМХО, честнее.
Попробовал вызов foo(&(*(unsigned char*)(0x03+0x20)),0x04); - с PORTE показывает, что всё прожевало.