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

Оптимизация ломает проект.

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

Ну вот например

Spoiler

int __main(void)
{
    /* initialize any hardware specific issues */
    #if BOOTLOADER_INT_WATCHDOG == 1
    WDG_Enable(); 
    #else
    WDG_Disable();
    #endif
    
    // this setup all clock
    INIT_CLOCKS_TO_MODULES
     
      
    boot_magic_number = *((uint32_t *)(0x7FFD8));
    if (boot_magic_number != 0x18072019)
    {  
	  enableBootMode = 0;
      goto EXIT;
    }
  
    //initialize bootloader pin reset
    #if BOOTLOADER_PIN_ENABLE == 1
    BOOTLOADER_PIN_ENABLE_INIT;
    #endif

    //ID PINS
    PORTA_PCR12 = (0|PORT_PCR_MUX(1));
    PORTA_PCR13 = (0|PORT_PCR_MUX(1));
    //LEDS
    PORTC_PCR16 = (0|PORT_PCR_MUX(1));  //SET AS GPIO PIN
    GPIOC_PDDR |= (1<<16);  //SET PTC16 AS OUTPUT
    PORTC_PCR18 = (0|PORT_PCR_MUX(1));  //SET AS GPIO PIN
    GPIOC_PDDR |= (1<<17);  //SET PTC17 AS OUTPUT
    
    //some delay
    for (timeout_cnt = 0; timeout_cnt < 1000; timeout_cnt++) ;
    
    if (ID0 == 0 && ID1 == 0)
    {
       board_type = TYPE_NICA;
       g_UARTx = UART2_BASE_PTR;
       GPIOC_PCOR = (1<<17);
       GPIOC_PSOR = (1<<16);
    }
    else if (ID0 && ID1)
    {
       board_type = TYPE_IO;
       g_UARTx =  UART1_BASE_PTR;
       GPIOC_PCOR = (1<<16);
       GPIOC_PSOR = (1<<17);
    }
    else
    {
        GPIOC_PCOR = (1<<16);
        GPIOC_PCOR = (1<<17);
        while (1) ;
    }
    
    I2C0_Init();
    I2C_MAX7300_Init(board_type);
  
    UART_PIN_CONFIG(board_type);
    UART_Initialization(g_UARTx); 
    
    // initialize variables
    timeout_cnt = 0;
    enableBootMode = 1;
	
    // read the srs register
    if(SRS_REG & SRS_POR_MASK)
        enableBootMode = 1;
  
  // Application is present ?
  if((*(unsigned long*)(RELOCATED_VECTORS + 8)) == 0xffffffff)
    enableBootMode = 1;

  
   // Check external pin if = 0 go to bootloader mode 
  #if BOOTLOADER_PIN_ENABLE == 1
    if((GPIO_PDIR_REG(BOOT_PIN_ENABLE_GPIO_BASE) & (1 << BOOT_PIN_ENABLE_NUM)) == 0) 
      enableBootMode = 1;
  #endif
  
 
  if(enableBootMode)
  {
	 // unsigned long systick_cnt;
	  unsigned char i;    
    
    #if BOOTLOADER_CRC_ENABLE == 1
      CRC_Init();    
    #endif
    
      //  multiplexer setting  to UART alternative
    //BOOT_PIN_INIT_AS_UART;
    //UART_PIN_CONFIG(board_type);

    // init UART module
    //UART_Initialization(g_UARTx); 
    
    // run the timer on 10ms
    SYST_RVR = (unsigned long)(0.01 * BOOT_BUS_CLOCK); // to do add macro to define the initial timeout
    SYST_CSR = (SysTick_CSR_CLKSOURCE_MASK | SysTick_CSR_ENABLE_MASK);
    
    while(1)
    {
        
      #if BOOTLOADER_INT_WATCHDOG == 1
        WDG_Refresh(); /* feeds the dog */
      #endif  

      if(SYST_CSR & SysTick_CSR_COUNTFLAG_MASK)
      {
    	  SYST_CVR = 0; // Finish the clear of the SysTick CountFlag
        
    	  // increment timeout value
		#if defined(__IAR_SYSTEMS_ICC__) || defined(__ARMCC_VERSION)
    	  timeout_cnt++;		
		#elif defined(__CWCC__)
    	  timeout_cnt += 8;	  
		#endif
    	  
    	  if((timeout_cnt & 0x1F) == 0x10)
    		  SendResult(0); 
   	  
    	  if((timeout_cnt > BOOT_WAITING_TIMEOUT) && ((*(unsigned long*)(RELOCATED_VECTORS + 8)) != 0xffffffff))
    	      break;
      }
      
      // check the UART activity
      if(UART_IsChar(g_UARTx))
      {
        //  measuring of brake signal due to using of Internal oscilator..
        //#if BOOTLOADER_AUTO_TRIMMING == 1           
            //SlaveFrequencyCalibration();
        //#endif        

        // init the flash module
        FLASH_Initialization(); 
        enableBootMode++;
        SendResult(0);
        break;
      }  
    }
    
 
    //  Bootloader protocol runs !
    while(enableBootMode > 1)
    {
      // never ending loop - except quit commnad that disable  enableBootMode
      
      #if BOOTLOADER_INT_WATCHDOG == 1
        WDG_Refresh(); /* feeds the dog */
      #endif
        
      #if BOOTLOADER_CRC_ENABLE == 1
        CRC_Reset();
      #endif

      switch(UART_GetChar(g_UARTx))
      {
        case BOOT_CMD_QUIT:                                 // QUIT command
          #if BOOTLOADER_CRC_ENABLE == 1
            CRC_AddByte(BOOT_CMD_QUIT);  
            ReadCrc();
            if(crc_res.Words.low != CRC_GetResult())
            {            
              SendResultCRC(1);
              break;
            }
          #endif
        
          // send the ack
          SendResultCRC(0);
          // reset MCU
          Boot_ResetMCU();

        case BOOT_CMD_ACK:
          SendResult(0);                                   // ACK command
          break;
        
        case BOOT_CMD_IDENT:                               // IDENT command
          //and send the all data with/without CRC 
          #if BOOTLOADER_CRC_ENABLE == 1
            CRC_AddByte(BOOT_CMD_IDENT);  
            CRC_AddByte((BootloaderProtocolType)_BOOTLOADER_PROTOCOL_VERSION);
          #endif
          UART_PutChar(g_UARTx, (BootloaderProtocolType)_BOOTLOADER_PROTOCOL_VERSION);
          #if BOOTLOADER_CRC_ENABLE == 1
            CRC_AddByte(SIM_SDID >> 8);
          #endif
          UART_PutChar(g_UARTx, SIM_SDID >> 8); // high
          #if BOOTLOADER_CRC_ENABLE == 1
            CRC_AddByte(SIM_SDID);
          #endif
          UART_PutChar(g_UARTx, SIM_SDID);      
          
          for(i=0; i < sizeof(bootloaderIdent); i++)
          {
            #if BOOTLOADER_CRC_ENABLE == 1
              CRC_AddByte(((unsigned char*)&bootloaderIdent)[i]);
            #endif              
              UART_PutChar(g_UARTx, ((unsigned char*)&bootloaderIdent)[i]);
          }

          #if BOOTLOADER_CRC_ENABLE == 1
            UART_PutChar(CRC_GetResultHigh());         
            UART_PutChar(CRC_GetResultLow());
          #endif
              
          break;
          
        case BOOT_CMD_ERASE:                                // ERASE command
          // Read Address
          ReadAddress();
          // Check the CRC
          #if BOOTLOADER_CRC_ENABLE == 1
            
            CRC_AddByte(BOOT_CMD_ERASE);
            CRC_AddLong(address.complete);
            
            ReadCrc();
            if(crc_res.Words.low != CRC_GetResult())
            {            
              SendResultCRC(1);
              break;
            }
          #endif
          // Erase the flash and send result
          SendResultCRC(FLASH_EraseSector(address.complete));
          break;
          
        case BOOT_CMD_WRITE:
          // Read Address                                                   // WRITE command
          ReadAddress();
          // Read length
          length = UART_GetChar(g_UARTx);
          
          #if BOOTLOADER_CRC_ENABLE == 1
            CRC_AddByte(BOOT_CMD_WRITE);
            CRC_AddLong(address.complete);
            CRC_AddByte((unsigned char)length);
          #endif
          
          // Load the data to write
          for(i = 0; i<length; i++)
          {
            write_buffer[i] =  UART_GetChar(g_UARTx); 
            #if BOOTLOADER_CRC_ENABLE == 1
              CRC_AddByte(write_buffer[i]);
            #endif  
          }
          
          length >>= 2;    // divide by four
          
          // check the CRC of input data
          
          #if BOOTLOADER_CRC_ENABLE == 1
            ReadCrc();
            if(crc_res.Words.low != CRC_GetResult())
            {            
              SendResultCRC(1);
              break;
            }
          #endif
                
          if(FLASH_PROGRAM(address.complete, (LWord*)write_buffer, length))
          {            
            SendResultCRC(1);
            break;
          }
          
          // Verify flashed data (if enabled)
          #if BOOTLOADER_ENABLE_VERIFY == 1                 
            for(i = 0; i<length; i++)
            {              
              if(((unsigned long*)write_buffer)[i] != ((unsigned long*)address.complete)[i])
              {
                SendResultCRC(1);
                break;
              }
            }
          #endif    
          SendResultCRC(0);
          break;
       
      #if BOOTLOADER_ENABLE_READ_CMD == 1       
          
        case BOOT_CMD_READ:                                   // READ comamnd    
          ReadAddress();
          length = UART_GetChar(g_UARTx);
          
          #if BOOTLOADER_CRC_ENABLE == 1
            ReadCrc();
            
            CRC_AddByte(BOOT_CMD_READ);
            CRC_AddLong(address.complete);
            CRC_AddByte((unsigned char)length);
            
            if(crc_res.Words.low != CRC_GetResult())
            {            
              SendResultCRC(1);
              break;
            }
          #endif
          
          #if BOOTLOADER_CRC_ENABLE == 1
            CRC_Reset();
          #endif
          
          for(i = 0;i<length; i++)
          {
            #if BOOTLOADER_CRC_ENABLE == 1
              CRC_AddByte(((unsigned char*)(address.complete))[i]);
            #endif              
              UART_PutChar(g_UARTx, ((unsigned char*)(address.complete))[i]); 
            
            #if BOOTLOADER_INT_WATCHDOG == 1
              WDG_Refresh(); /* feeds the dog */
            #endif
          }
          
          #if BOOTLOADER_CRC_ENABLE == 1
            UART_PutChar(CRC_GetResultHigh());         
            UART_PutChar(CRC_GetResultLow());
          #endif
          
          break; 
       #endif    
          
      }      
    } 
  }

EXIT:  
      //GPIOC_PSOR = (1<<16);
      //GPIOC_PSOR = (1<<17);
  
    // deinitialization of SysTick
    SYST_CSR = 0;
  
    //  deinitialization of UART
    UART_Deinitialization();
  
    // relocate vector table
    SCB_VTOR = RELOCATED_VECTORS;
    
    // Jump to user application
    JumpToUserApplication(*((unsigned long*)RELOCATED_VECTORS), *((unsigned long*)(RELOCATED_VECTORS+4)));   
    
	return 0;
}

 

работал на оптимизации High пока не добавил

boot_magic_number = *((uint32_t *)(0x7FFD8));
    if (boot_magic_number != 0x18072019)
    {  
	  enableBootMode = 0;
      goto EXIT;
    }

и все. вылетает непонятно куда даже если условие if не выполняется. на High проблему не найти, перевожу в Low - все работает.

Хоть бы генерировали какой нибудь отчет - тут соптимизировали то-то и то-то. а так что можно сделать? сравнивать листинги до и после? это ж в асемблере надо поднатореть.

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


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

Вылетает "непонятно куда"? А подключить внутрисхемную отладку и посмотреть не пробовали? И таки да, для этого нужно с ассемблером хоть немного дружить. Если делаете хоть что-то посерьёзнее адурины, а тем более загрузчик, это знание необходимо.

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


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

1 hour ago, scifi said:

Вылетает "непонятно куда"? А подключить внутрисхемную отладку и посмотреть не пробовали? И таки да, для этого нужно с ассемблером хоть немного дружить. Если делаете хоть что-то посерьёзнее адурины, а тем более загрузчик, это знание необходимо.

что вы называете внутрисхемной отладкой?

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


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

3 часа назад, jenya7 сказал:

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

Ну вот например

работал на оптимизации High пока не добавил

К 2335-му сообщению уже могли бы и усвоить важное правило форума: Телепаты в отпуске!  Вангую, что boot_magic_number объявлен неправильно.

И интересно: куда это Вы из main()-а выходите?  :wink2:

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


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

1 hour ago, jcxz said:

К 2335-му сообщению уже могли бы и усвоить важное правило форума: Телепаты в отпуске!  Вангую, что boot_magic_number объявлен неправильно.

И интересно: куда это Вы из main()-а выходите?  :wink2:

объявлял как угодно и volatile и static и вместе и раздельно, не помогло.

из main() бутовой секции я иду в main() програмы.

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


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

43 minutes ago, jenya7 said:

что вы называете внутрисхемной отладкой?

То же, что и всё остальное человечество:

https://www.google.com/search?q=внутрисхемная+отладка

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


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

2 hours ago, scifi said:

Вылетает "непонятно куда"? А подключить внутрисхемную отладку и посмотреть не пробовали? И таки да, для этого нужно с ассемблером хоть немного дружить. Если делаете хоть что-то посерьёзнее адурины, а тем более загрузчик, это знание необходимо.

Бывает внутрисхемная отладка видит не то что видит процессор, эт надо смотреть на каких шинах они сидят. 
Потом есть еще такие вещи как готовность Flash памяти к чтению и записи. Не производится ли чтение в момент записи. 
Не слишком ли быстро после оптимизации начинается обращение к запрещенным областям адресного пространства.  
Тут   внутрисхемная отладка отдыхает.
Нужны просто телепаты с опытом, чтобы могли накидать вариантов возможных траблов. 

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


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

11 minutes ago, AlexandrY said:

Бывает внутрисхемная отладка видит не то что видит процессор, эт надо смотреть на каких шинах они сидят. 
Потом есть еще такие вещи как готовность Flash памяти к чтению и записи. Не производится ли чтение в момент записи. 
Не слишком ли быстро после оптимизации начинается обращение к запрещенным областям адресного пространства.  
Тут   внутрисхемная отладка отдыхает.
Нужны просто телепаты с опытом, чтобы могли накидать вариантов возможных траблов. 

Гораздо чаще бывает неопытность и элементарная ошибка новичка. Вообще не владея ассемблером, замахиваться на загрузчик - каково?

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


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

IAR отлично генерирует ассемблерные листинги. Посмотреть что он реально делает с и без оптимизации не составляет труда.

 

И поверьте, на таком простом коде глюков оптимизатора быть не может. 

 

Кстати, а что за такой магический адрес 0х7FFD8? И почему его чтение без volatile производится? Загляни в заголовочные файлы, все регистры с модификатором _IO (читай volatile) определены. Думаешь это трУсы делали?

 

Правильный код никакой уровень оптимизации сломать не может!

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


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

5 hours ago, VladislavS said:

Правильный код никакой уровень оптимизации сломать не может!

Не всегда так. Ссыль не могу найти. Но один из коллег на форуме высказывался, что в зависимости от компоновки машинных команд компилятором, которая зависиот от уровня оптимизации, железо микроконтроллера вело себя по-разному (вплоть до вылета в hardfault). В документации на МК не было никаких пояснений. На деле, если мне не изменяет память, менялись лишь местами ассемблерные команды, последовательность которых, никаким образом не должна была влиять на алгоритм.

 

Также известны случаи с ошибками компилятора IAR.

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


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

1 час назад, haker_fox сказал:

менялись лишь местами ассемблерные команды, последовательность которых, никаким образом не должна была влиять на алгоритм.

Если это особенность микроконтроллера и она не учтена в программе, то программа неправильная.

 

1 час назад, haker_fox сказал:

Также известны случаи с ошибками компилятора IAR.

Я в эмбедде больше 20 лет и глюк компилятора ловил лишь единожды. Сейчас на таком простом коде это практически нереально.

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


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

8 часов назад, VladislavS сказал:

Сейчас на таком простом коде это практически нереально.

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=150954

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=148387

:smile:

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


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

9 hours ago, VladislavS said:

Если это особенность микроконтроллера и она не учтена в программе, то программа неправильная.

Особенность - недокументированная, выявленная экспериментально. Как учитывать будете? Сегодня компилятор так скомпилирует, завтра (после обновления версии компилятора или добавлении пары строк кода в соседнем файле) этак.

9 hours ago, VladislavS said:

Я в эмбедде больше 20 лет и глюк компилятора ловил лишь единожды. Сейчас на таком простом коде это практически нереально.

Ну 20 лет это не показатель.

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


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

1 час назад, haker_fox сказал:

Особенность - недокументированная, выявленная экспериментально

Выявили? Значит обязаны учитывать. 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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