Выравнивание вKeil'е

Да, я регулярно вижу какие-то проблемы только сделай шаг влево или вправо от i386. И что из этого следует?

Reply to
Kirill Frolov
Loading thread data ...

Sun Apr 02 2006 01:54, Kirill Frolov wrote to Evgeny Kotsuba:

KF> From: Kirill Frolov snipped-for-privacy@fk0.pp.ru>

KF> >> KF> Юниксы вполне успешно на достаточно разных архитектурах работали. >> KF> Что вряд ли было бы возможным при описываемом подходе. >> Возьми навскидку любой исходник и посмотри, а потом спорь о вкусе булочек >> с тем, кто ими питается.

KF> Да, я регулярно вижу какие-то проблемы только сделай шаг влево или KF> вправо от i386. И что из этого следует?

да ничего, беспредметный спор получается. Тем более, что булочки с начинкой из гуано :-/

SY, EK

Reply to
Evgeny Kotsuba

Sat Apr 01 2006 16:47, Konstantin Konstantinov wrote to Evgeny Kotsuba:

KK> Результаты по симуляции: KK> Окно Serial #2: KK> 400003d4, 400003e8, 400003ea

KK> Окно Memory #1, дамп памяти: KK> 0x400003D4: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 KK> 0x400003E3: 00 00 00 00 00 F7 7F 21 43 65 87 00 00 00 00

KK> Так что с выравниванием в CARM'е все в порядке. CA v2.51a, LA v2.51a .

KK> 2All: GCC в кейловском пакете давно уже нет, хотя настройки под него и KK> остались, в текущей поставке идут родные и ARM тулзы.

Hичего не понимаю. Взял как раз RVMDK v3.00a, Hello World, компилер - RealView там в проекте.

#pragma pack(1) unsigned char Buf[40];

int main (void) { *((short int *)&Buf[0]) = 0x77ff; *((int *)&Buf[2]) = 0x12345678; /* initialize the serial interface */ PINSEL0 = 0x00050000; U1LCR = 0x83; U1DLL = 97; U1LCR = 0x03;

printf ("Hello World\n"); printf("%x %x %x %x \n", Buf[0],Buf[1],Buf[2],Buf[3]); }

Hello World

78 56 34 12

------------ Что я делаю не так ?

SY, EK

ЗЫ: хотя с RealView у меня вроде другой глюк пропал

Reply to
Evgeny Kotsuba

Hello Evgeny.

01 Apr 06 14:16, Evgeny Kotsuba wrote to Kirill Frolov:

EK> Коpоче, постановлено что в части #pragma pack() keil глюкав, как EK> минимум для 32 битных пpоцов и "все выpавнивать на 4 байта". Кстати, может быть это и глюк. Keil C51 веpсии пpиблизительно 7.5 непpавильно обpащался к стpуктуpе (или юниону), если в стpуктуpу входит массив, а обpащение пpоисходит по указателю. Если интеpесно, попpобую пpимеp поискать такой, чтобы такую ошибку спpовоциpовать.

Sergey

Reply to
Sergey Davydov

Бугага. Доприводился. Вставь в printf такое:

%lx -- (unsigned long)&Buf[2]

%lx -- (unsigned long)((int*)&Buf[2])

первое стало быть Buf+2, а второе --Buf+0.

Вот тебе макрос:

#define serialize_long(addr, value) { \ uint8_t *ptr=addr; \ uint32_t=value; \ ptr[3]=value & 0xff; \ ptr[2]=(value>>0x08) & 0xff; \ ptr[1]=(value>>0x10) & 0xff; \ ptr[0]=value>>0x18; \ }

Reply to
Kirill Frolov

Sun Apr 02 2006 14:57, Kirill Frolov wrote to Evgeny Kotsuba:

KF> From: Kirill Frolov snipped-for-privacy@fk0.pp.ru>

KF> >> #pragma pack(1) >> unsigned char Buf[40];

KF> Бугага. Доприводился. Вставь в printf такое:

KF> %lx -- (unsigned long)&Buf[2]

KF> %lx -- (unsigned long)((int*)&Buf[2])

это нафиг

KF> первое стало быть Buf+2, а второе --Buf+0.

KF> Вот тебе макрос:

KF> #define serialize_long(addr, value) { \ KF> uint8_t *ptr=addr; \ KF> uint32_t=value; \ KF> ptr[3]=value & 0xff; \ KF> ptr[2]=(value>>0x08) & 0xff; \ KF> ptr[1]=(value>>0x10) & 0xff; \ KF> ptr[0]=value>>0x18; \ KF> }

и это тоже. "ржунимагу" Вот как надо: *((__packed int *)&Buf[2]) = 0x12345678;

блин, ну шо за гоблины у них там доки пишут ?

SY, EK

Reply to
Evgeny Kotsuba

Привет Evgeny.

02 апр 06 03:22, Evgeny Kotsuba -> Konstantin Konstantinov: [...skipped...]

EK> Hичего не понимаю. Взял как раз RVMDK v3.00a, Hello World, компилер - EK> RealView там в проекте.

EK> #pragma pack(1) EK> unsigned char Buf[40];

EK> int main (void) EK> { EK> *((short int *)&Buf[0]) = 0x77ff; EK> *((int *)&Buf[2]) = 0x12345678; EK> /* initialize the serial interface */ EK> PINSEL0 = 0x00050000; EK> U1LCR = 0x83; EK> U1DLL = 97; EK> U1LCR = 0x03;

EK> printf ("Hello World\n"); EK> printf("%x %x %x %x \n", Buf[0],Buf[1],Buf[2],Buf[3]); EK> }

EK> Hello World

EK> 78 56 34 12 EK> ------------ EK> Что я делаю не так ?

RV Compiler все-таки не CARM, для него #pragma pack() - пустой звук, см. RV_cc.pdf. Для твоего случая надо в опциях проекта, закладка С/C++ -> Misc Controls прописать --pointer_alignment=1. Кстати, при симуляции в окне вывода (если выравнивание не совпадает) должно выскакивать сообщение: Non-aligned Access: ARM Instruction at xxxxxxxxH, Memory Access xxxxxxxxH .

Kosty K.

Reply to
Konstantin Konstantinov

Привет Konstantin.

02 апр 06 15:55, Konstantin Konstantinov -> Evgeny Kotsuba: [...skipped...]

KK> RV Compiler все-таки не CARM, для него #pragma pack() - пустой звук, KK> см. RV_cc.pdf. Для твоего случая надо в опциях проекта, закладка С/C++ KK> -> Misc Controls прописать --pointer_alignment=1. Кстати, при KK> симуляции в окне вывода (если выравнивание не совпадает) должно KK> выскакивать сообщение: Non-aligned Access: ARM Instruction at KK> xxxxxxxxH, Memory Access xxxxxxxxH .

Либо спецификатор __packed где надо использовать.

Kosty K.

Reply to
Konstantin Konstantinov

Это в отличии от, работает. Везде. Там где это медленно, громоздко, что-то ещё -- следует использовать ассемблер. Один хрен непереносимо.

Т.е. этот код можно использовать в лучшем случае, только с этим компилятором, только на этой платформе, и только с конкретными версиями компилятора даже.

Смутно догадываюсь, что пакет данных летает с одного ЦПУ на другой. Где тоно такой же код, с такими же граблями, но под другой ЦПУ и компилятор. Ржинимаги.

Reply to
Kirill Frolov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.