ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
801732
vmp_не_могу_войти (13.12.2017 10:17, просмотров: 2268)
Нашел ошибку в компиляторе IAR EWARM V6.50 Оптимизатор глючит с 64-битной арифметикой. Проверьте пожалуйста на более свежих версиях - осталась ли ошибка. Если да, то прошу многоуважаемую Ксению послать шведам багрепорт. Исходный код: void outll(unsigned long long val); void IARBug(void) { unsigned long long n; unsigned long long step; step = 0x111111111111LL; outll(step); for (n = 0; n < 16; n++) outll(step * n + 0x123456789ABCDLL); } Компилируем с максимальной оптимизацией, для Кортекс-М4 без FPU. Листинг:
###############################################################################
#                                                                             #
# IAR ANSI C/C++ Compiler V6.50.2.4510/W32 for ARM      13/Dec/2017  09:58:09 #
# Copyright 1999-2012 IAR Systems AB.                                         #
#                                                                             #
#    Cpu mode     =  thumb                                                    #
#    Endian       =  little                                                   #
#                 --debug  --endian=little --cpu=Cortex-M4 -e --fpu=None      #
#                 -lCN -Oh                                                    #
[other info skipped]
	
      1          void outll(unsigned long long val);

   \                                 In section .text, align 2, keep-with-next
      2          void IARBug(void)
      3          {
   \                     IARBug:
   \   00000000   0xB5F8             PUSH     {R3-R7,LR}
      4           unsigned long long n;
      5           unsigned long long step;
      6          
      7           step = 0x111111111111LL;
      8           outll(step);
   \   00000002   0xF04F 0x3011      MOV      R0,#+286331153
   \   00000006   0xF241 0x1111      MOVW     R1,#+4369
   \   0000000A   0x.... 0x....      BL       outll
      9           for (n = 0; n < 16; n++)
   \   0000000E   0x.... 0x....      LDR.W    R6,??DataTable57  ;; 0x6789abcd
   \   00000012   0x.... 0x....      LDR.W    R7,??DataTable57_1  ;; 0x12345
   \   00000016   0x2410             MOVS     R4,#+16
   \   00000018   0x2500             MOVS     R5,#+0
     10             outll(step * n + 0x123456789ABCDLL);
   \                     ??IARBug_0:
   \   0000001A   0x4630             MOV      R0,R6
   \   0000001C   0x4639             MOV      R1,R7
   \   0000001E   0x.... 0x....      BL       outll
   \   00000022   0xF116 0x3611      ADDS     R6,R6,#+286331153
   \   00000026   0xF147 0x0700      ADC      R7,R7,#+0
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>!!!! Must be #+4369 !!!
   \   0000002A   0x1E64             SUBS     R4,R4,#+1
   \   0000002C   0xF175 0x0500      SBCS     R5,R5,#+0
   \   00000030   0xD1F3             BNE.N    ??IARBug_0
   \   00000032   0x2C00             CMP      R4,#+0
   \   00000034   0xD1F1             BNE.N    ??IARBug_0
     11          }
   \   00000036   0xBDF1             POP      {R0,R4-R7,PC}    ;; return