Это обычное нестандартное обозначение для распределения переменной по определенному адресу.В вашем случае он используется для сопоставления аппаратных регистров с переменными C.
В частности, цель @
- позволить компоновщику / отладчику использовать регистры, как если бы они были объектами.Это означает, что вы можете добавить к ним точку останова watch или rw в отладчике, как и в любой другой переменной.
В противном случае, если вам не нужно просматривать их в отладчике, вы можете использовать стандартный эквивалент C:
#define TMR0 (*(volatile uint8_t*)0x01u)
И, разумеется, нет необходимости выделять место для аппаратных регистров, поскольку они уже есть в аппаратном обеспечении независимо от того, что делает программа на Си.
Хорошие отладчики поставляются с MCUподдержка и возможность просмотра регистров, специфичных для MCU, в отдельном окне.Поэтому основная причина использования @
для регистров / карт регистров заключается в том, что в цепочку инструментов входит дрянной отладчик.К сожалению, это мой опыт работы со встроенными цепочками инструментов: чем хуже отладчик, тем сложнее становится карта регистров, предоставляемая компилятором.
Но запись @
также можно использовать для объявления переменных RAM / ROM в определенныхместах.Другие нестандартные расширения других компиляторов используют различные #pragma
, ___declspec(section...
или __attribute__(section...
.Было бы неплохо, если бы существовал стандартный способ, но, к сожалению, его нет.