А что в выражении u32 * b = (u32 *)( (u32)(&a) ) вы считаете извращением? Я таким уже давно пользуюсь и успешно.
Насчет неправильной формулы - это я случайно когда писал тут вставил адрес периферии, для которой, кстати, я также через битбенд флаги всякие юзаю.
Сейчас временно сделал во так:
Код
MB_ByteCoils MB_Coils[MB_QtyBytesCoils]__attribute__((at(0x2004000))); // массив структур флагов
u32 MB_Addr_BB_Coils = 0x220C8000; // численно адрес зеркала
/*А использую так:*/
<p> *(u32*)(MB_Addr_BB_Coils + NumberOfFlag*4) = 1;
Ну и соответственно на асме это выглядит так:
Код
0x08001AB2 6812 LDR r2,[r2,#0x00]
0x08001AB4 F04F0101 MOV r1,#0x01
0x08001AB8 F8421020 STR r1,[r2,r0,LSL #2]
Куда меньше чем при использовании масок и т.п.
Сообщение отредактировал ISK2010 - Sep 4 2011, 06:58