Да, я регулярно вижу какие-то проблемы только сделай шаг влево или вправо от i386. И что из этого следует?
Да, я регулярно вижу какие-то проблемы только сделай шаг влево или вправо от i386. И что из этого следует?
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
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 у меня вроде другой глюк пропал
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
Бугага. Доприводился. Вставь в 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; \ }
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
Привет 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.
Привет 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.
Это в отличии от, работает. Везде. Там где это медленно, громоздко, что-то ещё -- следует использовать ассемблер. Один хрен непереносимо.
Т.е. этот код можно использовать в лучшем случае, только с этим компилятором, только на этой платформе, и только с конкретными версиями компилятора даже.
Смутно догадываюсь, что пакет данных летает с одного ЦПУ на другой. Где тоно такой же код, с такими же граблями, но под другой ЦПУ и компилятор. Ржинимаги.
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.