ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
1453871 Топик полностью
Nikolay_Po (05.08.2024 12:57, просмотров: 66) ответил reZident на Я конечно не программист, но когда после включения высокого уровня оптимизации программа перестает работать, то часто бывают проблемы с volatile и const переменными. Может они не определены соответствующим образом, может обращения к ним некорректные, но компилятор при оптимизации просто отбрасывает части кода, где идет работа с ними, не понимая, что это делать непозволительно. Задача программиста - объяснить сии нюансы компилятору.
Тут я, мне кажется, уже собаку съел. Все переменные, которе меняются в других контекстах, объявлены должным образом. У меня вся отладка происходит на макс. оптимизации. И все испытания пройдены со сборкой в режиме "Debug" на "отлично", хотя используются несколько уровней приоритетов прерываний. Проект весьма стабилен. Любые вмешательства в код приводят к стабильному, предсказуемому результату. Никаких глюков. Просто не запускается сборка Release. Вот такой startup.c (так как 

символ DEBUG в релизе не определён, соответствующий код выключается:

...
void __attribute__ ((section(".after_vectors"),noreturn,weak)) _start (void) { // Initialise hardware right after reset, to switch clock to higher // frequency and have the rest of the initialisations run faster. // // Mandatory on platforms like Kinetis, which start with the watch dog // enabled and require an early sequence to disable it. // // Also useful on platform with external RAM, that need to be // initialised before filling the BSS section. __initialize_hardware_early (); // Use Old Style DATA and BSS section initialisation, // that will manage a single BSS sections. #if defined(DEBUG) && (OS_INCLUDE_STARTUP_GUARD_CHECKS) __data_begin_guard = DATA_GUARD_BAD_VALUE; __data_end_guard = DATA_GUARD_BAD_VALUE; #endif #if !defined(OS_INCLUDE_STARTUP_INIT_MULTIPLE_RAM_SECTIONS) // Copy the DATA segment from Flash to RAM (inlined). __initialize_data(&_sidata, &_sdata, &_edata); #else // Copy the data sections from flash to SRAM. for (unsigned int* p = &__data_regions_array_start; p < &__data_regions_array_end;) { unsigned int* from = (unsigned int *) (*p++); unsigned int* region_begin = (unsigned int *) (*p++); unsigned int* region_end = (unsigned int *) (*p++); __initialize_data (from, region_begin, region_end); } #endif #if defined(DEBUG) && (OS_INCLUDE_STARTUP_GUARD_CHECKS) if ((__data_begin_guard != DATA_BEGIN_GUARD_VALUE) || (__data_end_guard != DATA_END_GUARD_VALUE)) { for (;;) ; } #endif #if defined(DEBUG) && (OS_INCLUDE_STARTUP_GUARD_CHECKS) __bss_begin_guard = BSS_GUARD_BAD_VALUE; __bss_end_guard = BSS_GUARD_BAD_VALUE; #endif #if !defined(OS_INCLUDE_STARTUP_INIT_MULTIPLE_RAM_SECTIONS) // Zero fill the BSS section (inlined). __initialize_bss(&__bss_start__, &__bss_end__); #else // Zero fill all bss segments for (unsigned int *p = &__bss_regions_array_start; p < &__bss_regions_array_end;) { unsigned int* region_begin = (unsigned int*) (*p++); unsigned int* region_end = (unsigned int*) (*p++); __initialize_bss (region_begin, region_end); } #endif #if defined(DEBUG) && (OS_INCLUDE_STARTUP_GUARD_CHECKS) if ((__bss_begin_guard != 0) || (__bss_end_guard != 0)) { for (;;) ; } #endif // Hook to continue the initialization. Usually compute and store the // clock frequency in the global CMSIS variable, cleared above. __initialize_hardware (); // Get the argc/argv (useful in semihosting configurations). int argc; char** argv; __initialize_args (&argc, &argv); // Call the standard library initialization (mandatory for C++ to // execute the constructors for the static objects). __run_init_array (); // Call the main entry point, and save the exit code. int code = main (argc, argv); // Run the C++ static destructors. __run_fini_array (); _exit (code); // Should never reach this, _exit() should have already // performed a reset. for (;;) ; } // ----------------------------------------------------------------------------