Кстати, __attribute__((at(0x5000))) - это нестандартное расширение языка, то есть работает не на всех компиляторах.
А вот такое
Код
struct data volatile *ptr = (struct data volatile*)(BKPSRAM_BASE + 1234);
будет работать на любом компиляторе.
Да, и я не понимаю, зачем писать __IO вместо volatile. Лишние буквы им лень набивать что ли? Кстати, нужен ли тут volatile - не так уж и очевидно, но лучше перестраховаться.
Да, можете написать
Код
__packed struct data
{
char a;
char b;
};
если жалко байтов для выравнивания. Много байтов не выгадаете, я думаю, зато компилятор будет генерить более толстый код доступа к структуре.