Дикое выполнение инструкций происходит, когда оптимизация установлена ​​на высокий уровень в компиляторе IAR MSP430 - PullRequest
1 голос
/ 01 июня 2011

Пожалуйста, обратитесь к моему коду ниже.Когда оптимизация в компиляторе IAR MSP430 установлена ​​на высоком уровне, у меня возникает следующая проблема.Код работает нормально, когда оптимизация низкая.

Проблема: если оператор условия в (B) возвращает false, оператор (A) выполняется вместо оператора (C).


int16_t cpu_flash_read_setting (void * setting, const uint8_t offset, const uint8_t num_of_bytes)
{
    int16_t returnable_status = PASS;
    uint16_t flash_copy_one_address =  FLASH_INFO_SEG_C_ADDR + offset;
    uint16_t flash_copy_two_address =  FLASH_INFO_SEG_D_ADDR + offset;
    if (0U == (num_of_bytes % sizeof(uint16_t))) 
    {
        uint16_t *setting_copy_one = (uint16_t *) flash_copy_one_address;
        uint16_t *setting_copy_two = (uint16_t *) flash_copy_two_address;  
        if (*setting_copy_one == *setting_copy_two)
        {
            setting = setting_copy_one;       
        }
        else
        {
(A)         returnable_status = FAIL;         
        }
    }
    else if (0U == (num_of_bytes % sizeof(uint8_t))) 
    {
        uint8_t *setting_copy_one = (uint8_t *) flash_copy_one_address;
        uint8_t *setting_copy_two = (uint8_t *) flash_copy_two_address;  
(B)     if (*setting_copy_one == *setting_copy_two)
        {
            setting = setting_copy_one;       
        }
        else
        {
(C)        returnable_status = FAIL;         
        }      
    }
    else
    {
        /* No Action */
    }
    return returnable_status;    
}

Ответы [ 2 ]

1 голос
/ 01 июня 2011

Две строки кода A и C идентичны, и пути выполнения объединяются после этих двух строк (следующая строка, которая должна быть выполнена в обоих случаях: return returnable_status;.

Компилятор выполняет оптимизацию слияния хвостов, используя один и тот же блок кода ассемблера для обеих строк исходного кода. Эта оптимизация является ожидаемой и полностью допустимой, и не должна вызывать проблем.

1 голос
/ 01 июня 2011

Это выглядит вполне разумно для меня. Когда у вас повышенная оптимизация, компилятор может и обычно будет дико упорядочивать операторы. Ваши два основных предложения идентичны, за исключением их типизации - так что компилятор вполне правдоподобно объединяет пути выполнения, и они различаются только там, где это действительно важно.

Это проблема, только если фактический наблюдаемый эффект отличается от того, что предполагалось.

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

Кстати, если ваш код взаимодействует с реальным оборудованием, вы можете объявить переменные flash_copy_*_address как volatile. Это подсказка компилятору, что память, на которую они указывают, не обязательно ведет себя нормально и заставляет ее быть более консервативной с ее оптимизацией.

...