Хочу еще раз подчеркнуть то что я говорил выше: в описателе структуры не надо объявлять тип памяти, ведь вы можете создать структуру как во флэш, так и в еепроме, или в статической памяти. Тип памяти указывается при объявлении переменной. Естественно, что и все члены структуры будут расположенны в том типе памяти, в котором созданна переменная с данным типом структуры. Но никто вам не запрещает через переопределение типов обратится через одного из членов структуры (если это указатель) к другому типу памяти. Немного запутанно, но я пытаюсь сказать то что пытаюсь))))
Ну вот вам еще пример, правда, работающий на IARe:
Код
typedef struct MBS_Data_Block_Type
{
UCHAR Ext_Type;
UCHAR Int_Type;
UINT Ext_Addr;
UINT Int_Addr;
UINT Size;
}
MBS_Data_Block;
__flash MBS_Data_Block Coil_Array[];
__flash MBS_Data_Block Input_Array[];
__flash MBS_Data_Block Hold_Array[];
__flash MBS_Data_Block Reg_Array[];
__flash MBS_Data_Block __flash *DB_Array[4] =
{
Coil_Array,
Input_Array,
Hold_Array,
Reg_Array,
};
Обратите внимание на объявление массива DB_Array - первый __flash указывает, что массив расположен в о флэше, второй __flash говорит что указатели содержат адерса структур, расположенных во флэше.
Возмем структуру MBS_Data_Block. В ней адреса представленны вообще как integer. Но с помощью преобразований я в коде могу указать компилятору как работать с данным адерсом, и на какой тип памяти он указывает...Допустим:
Код
void main(void)
{
MBS_Data_Block db;
(UCHAR *)db.Ext_Addr = 5;// пишем в SRAM
(__eeprom UCHAR *) db.Ext_Addr = 5; // пишем в EEPROM
}
Такое проще конечно вытворять в Си++, где для структуры можно написать методы работы с членами структуры для разных типов памяти.
Вот о чем я хотел сказать)))