ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
22 ноября
138565 Топик полностью
Vit (12.11.2008 01:27, просмотров: 643) ответил Сергей Борщ на если внутри функции приведение не нужно, то на что же ругался компилятор у -=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 показывает, что всё прожевало.