В моем внедренного проекта, используя IAR EWARM Dev инструменты (v7.10.3), я следующий кусок кода:Почему компилятор IAR застревает?
/* 1 */ uint32_t packet_sync = 0;
/* 2 */ uint32_t synced = 0;
/* 3 */ uint32_t gpio = 0;
/* 4 */ while (1) {
/* 5 */ if ((packet_sync != 0) && ((packet_sync = gpio) == 0)) {
/* 6 */ if (synced < 2) {
/* 7 */ synced++;
/* 8 */ }
/* 9 */ }
/* 10 */ };
С какой-то причине, когда я компиляции кода, компилятор застревает в в середине компиляции. Я попытался поиграть с различными конструкциями, и, похоже, любые незначительные изменения, которые я делаю, устраняет проблему (но может также сделать код неправильным). Например, добавление NOP в # 6а, а код делает компиляции успешно:
/* 6 */ if (synced < 2) {
/* 6a */ __NOP();
/* 7 */ synced++;
/* 8 */ }
Другие примеры успешных изменений удаления строки # 7 или изменение линии № 5, как:
/* 5 */ if ((packet_sync != 0) && ((gpio) == 0)) {
и еще несколько вариантов.
Я не вижу нарушения правила C в проблемном коде, и он просто компилируется в Visual Studio 2013. Я что-то пропустил? Почему этот код не компилируется?
* Примечание: представленный код является выпиской из фактического кода и является логически бессмысленным.
Update: код компилируется с "High"/"Сбалансированный" уровень оптимизации. При более низких уровнях оптимизации компиляция заканчивается просто отлично.
Он также застревает при использовании «Высокого» уровня, но удаляет параметры оптимизации в поле «Включенные преобразования:». Также застрял для опций «Скорость» и «Размер».
Какие параметры компилятора вы используете, и результаты изменяются, если, например, вы включаете/выключаете оптимизацию или используете компиляцию C++, а не C ?. Поскольку вы не знаете, в чем проблема, как вы можете быть уверены, что представление «абстрактного» является достаточной информацией для воспроизведения проблемы? Код, конечно же, не «SSCCE», как вы утверждаете! – Clifford
В первом фрагменте 'gpio' является инвариантом цикла. Если он может быть изменен в другом контексте, он должен быть объявлен 'volatile'. Другие переменные также могут быть объявлены 'volatile' в зависимости от использования в другом месте кода. – Clifford
@Clifford - я не требовал SSCCE. Один «C» для компиляции был удален, так как этот код необходимо обернуть соответствующей функцией. 'gpio' действительно инвариантен (в коде извлечения). Код был представлен как определено в проекте. Никакие переменные нестабильны. Вы правы в том, что я не упоминал, что код * размер * оптимизирован. К сожалению, трудно удалить оптимизацию без какой-либо масштабной доработки проекта. – ysap