jenya7 0 25 июля, 2019 Опубликовано 25 июля, 2019 · Жалоба Вобщем то любой проект который я компилирую с уровнем оптимизации 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 - все работает. Хоть бы генерировали какой нибудь отчет - тут соптимизировали то-то и то-то. а так что можно сделать? сравнивать листинги до и после? это ж в асемблере надо поднатореть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 25 июля, 2019 Опубликовано 25 июля, 2019 · Жалоба Вылетает "непонятно куда"? А подключить внутрисхемную отладку и посмотреть не пробовали? И таки да, для этого нужно с ассемблером хоть немного дружить. Если делаете хоть что-то посерьёзнее адурины, а тем более загрузчик, это знание необходимо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 июля, 2019 Опубликовано 25 июля, 2019 · Жалоба 1 hour ago, scifi said: Вылетает "непонятно куда"? А подключить внутрисхемную отладку и посмотреть не пробовали? И таки да, для этого нужно с ассемблером хоть немного дружить. Если делаете хоть что-то посерьёзнее адурины, а тем более загрузчик, это знание необходимо. что вы называете внутрисхемной отладкой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 25 июля, 2019 Опубликовано 25 июля, 2019 · Жалоба 3 часа назад, jenya7 сказал: Вобщем то любой проект который я компилирую с уровнем оптимизации High перестает работать. Ну вот например работал на оптимизации High пока не добавил К 2335-му сообщению уже могли бы и усвоить важное правило форума: Телепаты в отпуске! Вангую, что boot_magic_number объявлен неправильно. И интересно: куда это Вы из main()-а выходите? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 июля, 2019 Опубликовано 25 июля, 2019 · Жалоба 1 hour ago, jcxz said: К 2335-му сообщению уже могли бы и усвоить важное правило форума: Телепаты в отпуске! Вангую, что boot_magic_number объявлен неправильно. И интересно: куда это Вы из main()-а выходите? объявлял как угодно и volatile и static и вместе и раздельно, не помогло. из main() бутовой секции я иду в main() програмы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 25 июля, 2019 Опубликовано 25 июля, 2019 · Жалоба 43 minutes ago, jenya7 said: что вы называете внутрисхемной отладкой? То же, что и всё остальное человечество: https://www.google.com/search?q=внутрисхемная+отладка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 25 июля, 2019 Опубликовано 25 июля, 2019 · Жалоба 2 hours ago, scifi said: Вылетает "непонятно куда"? А подключить внутрисхемную отладку и посмотреть не пробовали? И таки да, для этого нужно с ассемблером хоть немного дружить. Если делаете хоть что-то посерьёзнее адурины, а тем более загрузчик, это знание необходимо. Бывает внутрисхемная отладка видит не то что видит процессор, эт надо смотреть на каких шинах они сидят. Потом есть еще такие вещи как готовность Flash памяти к чтению и записи. Не производится ли чтение в момент записи. Не слишком ли быстро после оптимизации начинается обращение к запрещенным областям адресного пространства. Тут внутрисхемная отладка отдыхает. Нужны просто телепаты с опытом, чтобы могли накидать вариантов возможных траблов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 25 июля, 2019 Опубликовано 25 июля, 2019 · Жалоба 11 minutes ago, AlexandrY said: Бывает внутрисхемная отладка видит не то что видит процессор, эт надо смотреть на каких шинах они сидят. Потом есть еще такие вещи как готовность Flash памяти к чтению и записи. Не производится ли чтение в момент записи. Не слишком ли быстро после оптимизации начинается обращение к запрещенным областям адресного пространства. Тут внутрисхемная отладка отдыхает. Нужны просто телепаты с опытом, чтобы могли накидать вариантов возможных траблов. Гораздо чаще бывает неопытность и элементарная ошибка новичка. Вообще не владея ассемблером, замахиваться на загрузчик - каково? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 25 июля, 2019 Опубликовано 25 июля, 2019 · Жалоба IAR отлично генерирует ассемблерные листинги. Посмотреть что он реально делает с и без оптимизации не составляет труда. И поверьте, на таком простом коде глюков оптимизатора быть не может. Кстати, а что за такой магический адрес 0х7FFD8? И почему его чтение без volatile производится? Загляни в заголовочные файлы, все регистры с модификатором _IO (читай volatile) определены. Думаешь это трУсы делали? Правильный код никакой уровень оптимизации сломать не может! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба У вас последняя версия компилятора глючит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 5 hours ago, VladislavS said: Правильный код никакой уровень оптимизации сломать не может! Не всегда так. Ссыль не могу найти. Но один из коллег на форуме высказывался, что в зависимости от компоновки машинных команд компилятором, которая зависиот от уровня оптимизации, железо микроконтроллера вело себя по-разному (вплоть до вылета в hardfault). В документации на МК не было никаких пояснений. На деле, если мне не изменяет память, менялись лишь местами ассемблерные команды, последовательность которых, никаким образом не должна была влиять на алгоритм. Также известны случаи с ошибками компилятора IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 1 час назад, haker_fox сказал: менялись лишь местами ассемблерные команды, последовательность которых, никаким образом не должна была влиять на алгоритм. Если это особенность микроконтроллера и она не учтена в программе, то программа неправильная. 1 час назад, haker_fox сказал: Также известны случаи с ошибками компилятора IAR. Я в эмбедде больше 20 лет и глюк компилятора ловил лишь единожды. Сейчас на таком простом коде это практически нереально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 9 hours ago, VladislavS said: Если это особенность микроконтроллера и она не учтена в программе, то программа неправильная. Особенность - недокументированная, выявленная экспериментально. Как учитывать будете? Сегодня компилятор так скомпилирует, завтра (после обновления версии компилятора или добавлении пары строк кода в соседнем файле) этак. 9 hours ago, VladislavS said: Я в эмбедде больше 20 лет и глюк компилятора ловил лишь единожды. Сейчас на таком простом коде это практически нереально. Ну 20 лет это не показатель. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 1 час назад, haker_fox сказал: Особенность - недокументированная, выявленная экспериментально Выявили? Значит обязаны учитывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться