Перейти к содержанию
    

Здравствуйте!

Хочу поделиться глюком, найденным мной:

 

unsigned short w;

 

w=0x55AA;

uart(w); //Вывод в UART - вижу 55AA

((unsigned char*)&w)[0]=0x33;

uart(w); //Вывод в UART - вижу 0033

 

Съел старший байт (обнулил) !!!

 

Если где-то в программе используется обращение к ((unsigned char*)&w)[1] то все нормально.

Отключал оптимизацию - не помогло.

А так вроде-бы нормальная конструкция для любого С... !?!?!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в данном случае переменная w стала регистровой.. Если объявить её глобально - то всё работает. А вот какого ляда компилятор позволил операции взятия адреса к такой переменной.. (собственно адрес он и не брал, просто проигнорировал сей факт) - это действительно свинство. Если написать например такой код

void foo (unsigned char* p)
{
  *p = 1;
}



int main()
{
unsigned short w;  
  w=0x55AA;  
*((unsigned char*)&w)=0x33;
  foo ((unsigned char*)&w);
  return 0;
}

То все становится нормально, компилятор будет держать w в стеке... А без "foo" он этого не понял =(

А вот компилятор ADS1.2 сделал все нормально...

main PROC
        STMFD    sp!,{r3,lr}
        LDR      r0,|L1.40|
        STRH     r0,[sp,#0]
        MOV      r0,#0x33
        STRB     r0,[sp,#0]
        MOV      r0,#0
        LDMFD    sp!,{r3,pc}
|L1.40|
        DCD      0x000055aa
        ENDP

А если в ADS внагляк написать

register short int w, то получаем недвусмысленное матюгательство ""main.cpp", line 19: Error: C3022E: 'register' attribute for 'w' ignored when address taken

main.cpp: 0 warnings, 1 error, 0 serious errors

Мораль - пора завязывать с IAR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте!

Хочу поделиться глюком, найденным мной:

Жуткие вещи рассказываете..

Привожу к повторяемому виде:

 

unsigned short w;

w=0x55AA;

printf( "%4X", w );

((unsigned char*)&w)[0]=0x33;

printf( "%4X", w );

 

IAR 4.31A работает правильно при любых вариантах оптимизации.

 

register short int w, то получаем недвусмысленное матюгательство ""main.cpp", line 19: Error: C3022E: 'register' attribute for 'w' ignored when address taken

main.cpp: 0 warnings, 1 error, 0 serious errors

Естественно на такое безобразие IAR ругается не менее однозначно

Warning [Pe138] : taking the address of a register variable is not allowed ....

 

Мораль - пора завязывать с IAR

Windows MUSTDIE, тьфу, IAR...

А может проще:

1. Не подавлять warnings;

2. Надо завязывать с использованием антикварного компилятора 2.30.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня 4.31.1.239. Во-первых никакого warning не дал. Во-вторых приведенный Вами вариант с printf тоже распечатал с ошибкой. Вот код

     15          int main()
     16          {
   \                     main:
   \   00000000   10402DE9           STMDB       SP!,{R4,LR}      ;; Push
     17          unsigned short w;
     18          w=0x55AA;
   \   00000004   AA00A0E3           MOV         R0,#+170
   \   00000008   550C80E3           ORR         R0,R0,#0x5500
   \   0000000C   0040A0E1           MOV         R4,R0
     19          printf( "%4X", w );
   \   00000010   0410A0E1           MOV         R1,R4
   \   00000014   080F8FE2           ADR         R0,??main_0      ;; "%4X"
   \   00000018   ........           _BLF        printf,??printf??rA
     20          ((unsigned char*)&w)[0]=0x33;
   \   0000001C   3300A0E3           MOV         R0,#+51
   \   00000020   0040A0E1          MOV         R4,R0 
     21          printf( "%4X", w );
   \   00000024   0410A0E1           MOV         R1,R4
   \   00000028   030F8FE2           ADR         R0,??main_0      ;; "%4X"
   \   0000002C   ........           _BLF        printf,??printf??rA

Смотрим 20-ую строку..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня 4.31. Во-первых никакого warning не дал. Во-вторых приведенный Вами вариант с printf тоже распечатал с ошибкой

Абсолютно такой-же IAR 4.31A и распечатал (оптимизация по скорости полная через 'галочку' в IDE

и без оптимизации) правильно и warning выдал (ну надо warnings включить :-) ). Собственно пишу местами достаточно изощренный код, но на ошибку компилятора наступал только один раз, да и ту поправили еще в патче к 4.30.

 

Ну а код у меня такой:

        LDR         R1,??command_0+0x18 ;; 0x55aa
        MOV         R0,SP
        STRH        R1,[R0, #+10]
        ADR         R4,??command_0+0x1C ;; "%4X"
        MOV         R0,R4
        _BLF        bprintf,??bprintf??rT
        MOV         R0,SP
        MOV         R1,#+51
        STRB        R1,[R0, #+10]
        LDRH        R1,[R0, #+10]
        MOV         R0,R4
??command_19:
        _BLF        bprintf,??bprintf??rT

 

Претензии есть :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я вру что-ли ? Вот terminal IO вывод - "55AA 33". Хотя этот результат и по асму виден

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я вру что-ли ? Вот terminal IO вывод - "55AA 33". Хотя этот результат и по асму виден

Все аналогично :-) только результат "правильный" виден и так и сяк...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тогда не понял.. Вы считаете что после ((unsigned char*)&w)[0]=0x33;

unsigned short w должна стать равна 0x33 ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тогда не понял.. Вы считаете что после ((unsigned char*)&w)[0]=0x33;

unsigned short w должна стать равна 0x33 ???

Посмотрите внимательно. Выдается правильный результат 0x5533.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну как может выдаваться 0x5533, если на момент вызова второго printf переменная w в Watch равна 0x0033 ???? И код у меня другой

   20          ((unsigned char*)&w)[0]=0x33;
   \   0000001C   3300A0E3           MOV         R0,#+51
   \   00000020   0040A0E1          MOV         R4,R0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну как может выдаваться 0x5533, если на момент вызова второго printf переменная w в Watch равна 0x0033 ????

Ассемблерный код получившийся у меня я приводил.

Отличия видны?

 

Warning я тоже приводил. О наличии оного у IAR можете справиться по номеру.

 

Командная строка компилятора:

iccarm.exe D:\ARM_WORK\mt38\MAIN\command.c -D LPC2000_IAR -lC D:\ARM_WORK\mt38\Debug\List\ -lA D:\ARM_WORK\mt38\Debug\List\ --remarks -o D:\ 
ARM_WORK\mt38\Debug\Obj\ -s9 --debug --cpu_mode thumb --endian little --cpu ARM7TDMI-S --stack_align 4 --interwork --warnings_affect_exit_code  
--no_path_in_file_macros -e --require_prototypes --fpu None --dlib_config D:\IAR\Embedded Workbench\arm\LIB\dl4tptinl8n.h -I D:\ARM_WORK\mt38\..\COMMON\ 
RTOS\portable\IAR\LPC2000\ -I D:\ARM_WORK\mt38\..\COMMON\RTOS\include\ -I D:\ARM_WORK\mt38\..\COMMON\include\ -I D:\ARM_WORK\mt38\MAIN\include\ -I D:\IAR\Embedded Workbench\arm\INC\

Что еще?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ПОчему у нас разный код, вот в чем вопрос !!

Без понятия. Работаю в своем обычном устаявшемся за пару десятилетий стиле, проблем с IAR не испытываю.

Свою командную строку со всеми ключами выдал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

положите если Вам несложно тогда весь проект с настройками (я скомпилировал в точности с Вашей ком. строкой, за исключением дополнительных -I , все равно код неверный.. Вобщем вопрос не снят

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

положите если Вам несложно тогда весь проект с настройками (я скомпилировал в точности с Вашей ком. строкой, за исключением дополнительных -I , все равно код неверный.. Вобщем вопрос не снят

Весь - сложно. Отдельный тестовый не делался а упомянутые строки были засунуты в текущую

сборку базы для очередной железки. В принципе, можете всунуть (в command() ) в когда-то давно присланный Вам для разборок с MT-Link проект.

case 'xx':
        {        
            unsigned short w;
            w=0x55AA;
            bprintf( "%4X", w );
            ((unsigned char*)&w)[0]=0x33;
            bprintf( "%4X", w );
            break;
        }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...