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

Do you have a question? Post it now! No Registration Necessary

Threaded View
Hi All,

Вот такой код
volatile struct Msg {
  long a;
  long b;
  long c;
  long d;
  unsigned char Buf[40];
} MsgOut;
....
*((short int *)&MsgOut.Buf[4+16]) = 0x7ff7;
*((int *)      &MsgOut.Buf[4+18]) = 0x87654321;
 упорно записывает 0x87654321 по смещению 20.

И как это побороть ? #pragma pack(1) нарисовать ? А куда ? Я разве что не "на
бумажке печатал и насквозь смотрел"

SY,
EK


Re: Выравнивание вKeil'е
pack(1) и bytealign вписать в опции компилятора "Misc Controls". Можно для
всего проекта или только для данного файла, смотря как надо.

--
С уважением
Мясоедов Андрей

We've slightly trimmed the long signature. Click to see the full one.
Re: Выравнивание вKeil'е
Wed Mar 29 2006 17:20, Myasoedov Andrey wrote to Evgeny Kotsuba:


 MA> pack(1) и bytealign вписать в опции компилятора "Misc Controls". Можно
 MA> для всего проекта или только для данного файла, смотря как надо.

литовский национальный прадник в индейском национальном жилище.

#pragma bytealign встречается только в хелпе, во всех остальных местах на
bytealign ругается..
 >>
 >> Вот такой код
 >> volatile struct Msg {
 >>   long a;
 >>   long b;
 >>   long c;
 >>   long d;
 >>   unsigned char Buf[40];
 >> } MsgOut;
 >> ....
 >> *((short int *)&MsgOut.Buf[4+16]) = 0x7ff7;
 >> *((int *)      &MsgOut.Buf[4+18]) = 0x87654321;
 >>  упорно записывает 0x87654321 по смещению 20.
 >>
 >> И как это побороть ? нарисовать ? А куда ? Я разве что не "на
   >И как это побороть ? #pragma pack(1) нарисовать ? А куда ? Я разве что не
                         ^^^^^^^^^^^^^^^^^^^^^^^^ вот это я для кого писал ??

 >> бумажке печатал и насквозь смотрел"

SY,
EK


Re: Выравнивание вKeil'е
Quoted text here. Click to load it

Версия Кейла какая? У меня Кейл С166 V6.02, все работает. В опциях проекта
выбираем С166, в Misc Controls пишем  BYTEALIGN PACK(1). Все работает.
Кстати, рекомендуется указывать оба ключа - и BYTEALIGN и PACK(1).

--
С уважением
Мясоедов Андрей

We've slightly trimmed the long signature. Click to see the full one.
Re: Выравнивание вKeil'е
Thu Mar 30 2006 09:33, Myasoedov Andrey wrote to Evgeny Kotsuba:


 >> #pragma bytealign встречается только в хелпе, во всех остальных местах на
 >> bytealign ругается..

 MA> Версия Кейла какая? У меня Кейл С166 V6.02, все работает. В опциях
 MA> проекта выбираем С166, в Misc Controls пишем  BYTEALIGN PACK(1). Все
 MA> работает.
 MA> Кстати, рекомендуется указывать оба ключа - и BYTEALIGN и PACK(1).

Может этих Кейлов много ? :-/

mVision3 V3.21
C Compiler CA.Exe V2.40a
Assembler  AA.Exe V2.40a

Target процессор - Phillips LPC21xx

SY,
EK


Re: Выравнивание вKeil'е
Quoted text here. Click to load it

Да вроде свежий...

Quoted text here. Click to load it

Дык кто и на что ругается-то? Бывает, ругается линкер, если разные файлы,
использующие одну и ту же переменную, скомпилированы один с ключами, другой
без (Different data types, говорит).

--
С уважением
Мясоедов Андрей

We've slightly trimmed the long signature. Click to see the full one.
Re: Выравнивание вKeil'е
Thu Mar 30 2006 15:51, Myasoedov Andrey wrote to Evgeny Kotsuba:


 >> C Compiler CA.Exe V2.40a

 MA> Да вроде свежий...

 >>> во всех остальных местах на bytealign ругается..

 MA> Дык кто и на что ругается-то? Бывает, ругается линкер, если разные файлы,
 MA> использующие одну и ту же переменную, скомпилированы один с ключами,
 MA> другой без (Different data types, говорит).

варант 1:

#pragma bytealign

TST.C(9): warning C2: 'BYTEALIGN': unknown #pragma/control, line ignored


вариант 2:

ARM COMPILER V2.40a - SN: Eval Version
COPYRIGHT KEIL ELEKTRONIK GmbH 2003 - 2005
CARM FATAL-ERROR -
ACTION:  PARSING INVOKE-/#PRAGMA-LINE
  LINE:    C:\Keil\ARM\BIN\CA.exe upr_net.c ARM WARNINGLEVEL(3)
OPTIMIZE(8,SPEED) BROWSE BYTEALIGN
  ERROR:   UNKNOWN CONTROL
CARM TERMINATED.
Target not created
 MA> --
 MA> С уважением
 MA> Мясоедов Андрей

 >>
 >>  >> #pragma bytealign встречается только в хелпе, во всех остальных местах

 MA> на

 >>  >> bytealign ругается..
 >>
 >>  MA> Версия Кейла какая? У меня Кейл С166 V6.02, все работает. В опциях
 >>  MA> проекта выбираем С166, в Misc Controls пишем  BYTEALIGN PACK(1). Все
 >>  MA> работает.
 >>  MA> Кстати, рекомендуется указывать оба ключа - и BYTEALIGN и PACK(1).
 >>
 >> Может этих Кейлов много ? :-/
 >>
 >> mVision3 V3.21
 >> C Compiler CA.Exe V2.40a
 >> Assembler  AA.Exe V2.40a
 >>
 >> Target процессор - Phillips LPC21xx
 >>
 >> SY,
 >> EK
 >>


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

Quoted text here. Click to load it

Насколько тут писали, Keil для ARM - умело прикрученный GCC. Видимо именно
в районе GCC надо искать описание правильного написания #pragma pack()
вот это не поможет?
http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

  С уважением,
   Сергей Борщ

--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

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

Quoted text here. Click to load it

  В GCC -- читать info до просветления. Там много познавательного и
интересного. В частности, атрибуты.


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

Quoted text here. Click to load it

  Не надо без острой на то нужды использовать упакованные структуры.
Ибо там граблей разложено, больше чем битов в ней умещается.
НЕ надо хакерскими методами приводить типы -- для этого есть union.
Размерность типа int -- 16 бит. Нужна конкретная размерность --
используй int32_t, например, и другие типы для этого предназначенные.
Не уверен что влезет в 16 бит -- используй long.

Quoted text here. Click to load it

  18+4 == 22. А sizeof(char) точно >= 1.
Такого быть не может.

Quoted text here. Click to load it

  Если формат пофиг -- оставить как есть. Если не пофиг -- писать
сериализатор этой структуры в упакованный вид.


Re: Выравнивание вKeil'е
Sat Apr 01 2006 03:05, Kirill Frolov wrote to Evgeny Kotsuba:


 KF> On Wed, 29 Mar 2006 13:43:19 +0400, Evgeny Kotsuba wrote:

 >> Вот такой код

 KF>   Hе надо без острой на то нужды использовать упакованные структуры.
 KF> Ибо там граблей разложено, больше чем битов в ней умещается.
 KF> HЕ надо хакерскими методами приводить типы -- для этого есть union.
 KF> Размерность типа int -- 16 бит. Hужна конкретная размерность --
 KF> используй int32_t, например, и другие типы для этого предназначенные.
 KF> Hе уверен что влезет в 16 бит -- используй long.

 >> *((int *)      &MsgOut.Buf[4+18]) = 0x87654321;
 >>  упорно записывает 0x87654321 по смещению 20.

 KF>   18+4 == 22. А sizeof(char) точно >= 1.
 KF> Такого быть не может.

 >> И как это побороть ? #pragma pack(1) нарисовать ? А куда ? Я разве что не
 >> "на  бумажке печатал и насквозь смотрел"

 KF>   Если формат пофиг -- оставить как есть. Если не пофиг -- писать
 KF> сериализатор этой структуры в упакованный вид.

Я ж указывал процессор. оно 32 битное. И sizeof(int) = 4, а sizeof(char) = 1,
т.е. все как у взрослых ;-)

И запись вида *((int *) &MsgOut.Buf[4+18]) = 0x87654321; у взрослых никаким
хакерством не считается.
 KF> HЕ надо хакерскими методами приводить типы -- для этого есть union.
 union - не метод приведения типа, если _так_ типы приводить, то неудивительно
что потом начинаются стоны про грабли.

Короче, постановлено что в части #pragma pack() keil глюкав, как минимум для
32 битных процов и "все выравнивать на 4 байта".

SY,
EK

ЗЫ: Кстати, никто не может сказать, почему у них на сайте мю-вижен относится
уже к чему-то древнему, и толкается нечто новое ?

 


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

Quoted text here. Click to load it

  sizeof(int) в среднем где-то равен трём. Чему он равен на конкретном
процессоре не имеет никакого значения. Нужны 32-битные числа --
используй int32_t.

Quoted text here. Click to load it

  Взрослые используют в таком случае union.

Quoted text here. Click to load it

  union -- это метод НЕ ИСПОЛЬЗОВАТЬ приведение типов. Потому как оно
небезопасно и глючно.

Quoted text here. Click to load it

  Если, как тут пишут, keil -- это gcc, то тогда никакой pragma pack на
него и не должен действовать. Пиши struct tag {} __attribute__((packed));


Re: Выравнивание вKeil'е
Sat Apr 01 2006 15:39, Kirill Frolov wrote to Evgeny Kotsuba:


 KF> On Sat, 01 Apr 2006 13:16:41 +0400, Evgeny Kotsuba wrote:

 >> KF>   Если формат пофиг -- оставить как есть. Если не пофиг -- писать
 >> KF> сериализатор этой структуры в упакованный вид.
 >> Я ж указывал процессор. оно 32 битное. И sizeof(int) = 4, а sizeof(char) =
 >> 1,  т.е. все как у взрослых ;-)

 KF>   sizeof(int) в среднем где-то равен трём.
;-)))))))))))))))))))))
 KF>Чему он равен на конкретном
 KF> процессоре не имеет никакого значения. Hужны 32-битные числа --
 KF> используй int32_t.

эт позволь мне самому решать - включать лишние инклюды или ну его нафиг.

 >> И запись вида *((int *) &MsgOut.Buf[4+18]) = 0x87654321; у взрослых
 >> никаким  хакерством не считается.

 KF>   Взрослые используют в таком случае union.
расскажи об этом взрослым; особенно при записи в буфер произвольных данных

 >> KF> HЕ надо хакерскими методами приводить типы -- для этого есть union.
 >>  union - не метод приведения типа, если _так_ типы приводить, то
 >> неудивительно  что потом начинаются стоны про грабли.

 KF>   union -- это метод HЕ ИСПОЛЬЗОВАТЬ приведение типов. Потому как оно
 KF> небезопасно и глючно.
расскажи это всем разработчикам юниксов или программерам интеля

 >> Короче, постановлено что в части #pragma pack() keil глюкав, как минимум
 >> для  32 битных процов и "все выравнивать на 4 байта".

 KF>   Если, как тут пишут, keil -- это gcc, то тогда никакой pragma pack на
 KF> него и не должен действовать. Пиши struct tag {} __attribute__((packed));

на заборе тоже пишут, и что из этого ?

SY,
EK


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

Quoted text here. Click to load it

  Беру и записываю. Поскольку между записями архитектура и опции
компилятора не изменятся -- на выравнивание плюю. Типиный пример
использования union очень хорошо в lex виден.

Quoted text here. Click to load it

  Юниксы вполне успешно на достаточно разных архитектурах работали.
Что вряд ли было бы возможным при описываемом подходе.

Quoted text here. Click to load it

  Не читай.


Re: Выравнивание вKeil'е
Sat Apr 01 2006 22:54, Kirill Frolov wrote to Evgeny Kotsuba:

 >> KF>   union -- это метод HЕ ИСПОЛЬЗОВАТЬ приведение типов. Потому как оно
 >> KF> небезопасно и глючно.
 >> расскажи это всем разработчикам юниксов или программерам интеля

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

Возьми навскидку любой исходник и посмотри, а потом спорь о вкусе булочек с
тем, кто ими питается.

SY,
EK


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

Quoted text here. Click to load it

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


Re: Выравнивание вKeil'е
Sun Apr 02 2006 01:54, Kirill Frolov wrote to Evgeny Kotsuba:


 KF> On Sat, 01 Apr 2006 21:22:59 +0400, Evgeny Kotsuba wrote:

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

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

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

SY,
EK


Выpавнивание вKeil'е
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


Выравнивание вKeil'е
Привет Evgeny.


29 мар 06 14:43, Evgeny Kotsuba -> All:

 EK> Вот такой код
 EK> volatile struct Msg {
 EK>   long a;
 EK>   long b;
 EK>   long c;
 EK>   long d;
 EK>   unsigned char Buf[40];
 EK> } MsgOut;
 EK> ....
 EK> *((short int *)&MsgOut.Buf[4+16]) = 0x7ff7;
 EK> *((int *)      &MsgOut.Buf[4+18]) = 0x87654321;
 EK>  упорно записывает 0x87654321 по смещению 20.

 EK> И как это побороть ? #pragma pack(1) нарисовать ? А куда ? Я разве что
 EK> не "на бумажке печатал и насквозь смотрел"

Проверил твой пример в RVMDK v3.00a взяв за основу их пример Hello.
Используемый компилятор CARM.

...

int main(void)  {                /* execution starts here                    */

#pragma pack(1)     /* byte alignment */
        volatile struct {
                long a;
                long b;
                long c;
                long d;
                unsigned char Buf[40];
        } MsgOut;
#pragma pack()    /* reset to default alignment */

        /* initialize the serial interface   */
        PINSEL0 = 0x00050000;           /* Enable RxD1 and TxD1              
*/
        U1LCR = 0x83;                   /* 8 bits, no Parity, 1 Stop bit      
*/
        U1DLL = 97;                     /* 9600 Baud Rate @ 15MHz VPB Clock  
*/
        U1LCR = 0x03;                   /* DLAB = 0                          
*/

        printf("%p, %p, %p\n", MsgOut.Buf, &MsgOut.Buf[4+16],
&MsgOut.Buf[4+18]);

        *((short int*)&MsgOut.Buf[4+16]) = 0x7ff7;
        *((int*)&MsgOut.Buf[4+18]) = 0x87654321;

        for(;;);
}

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

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

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

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


Kosty K.


Выравнивание вKeil'е
Sat Apr 01 2006 16:47, Konstantin Konstantinov wrote to Evgeny Kotsuba:


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

так где взять ? (У меня - 2.40)  Или оно все-таки сильно от камня зависит ?

SY,
EK


Site Timeline