Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR EWARM 5.11
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Dir
То ли я где-то вирей набрался, то ли совсем крыша едет, но у меня компиллер вылетает на этом простейшем примере с грозным предупреждением о неизвестной фатальной ошибке.
Причем на низких уровнях оптимизации все ОК. Также перестает вылетать, если раскомментарить закоментаренный код.
Что это может быть: баг компилятора, погрызенный вирем комп, глюки лицензионного менеджера? Проверьте у кого 5.11 и подскажите, что делать. Глючит аналогично на двух компах. Но поиск вирей пока ничего не дал.

Пардон, с файлом что-то не получилось. Код вот:

Код
typedef unsigned short WORD;
typedef struct
{
    float fKp;
    float fKi;
    float fKd;
    float fLastProcessValue;
    float fLastIterm;
    float fSumError;
    float fMaxPID;
    float fMinPID;
} PID_DATA;

WORD ControllPID(float fSetPoint, float fProcessValue, PID_DATA *pid)
{
static float fmProcessValue[16], fmError[16], fmPterm[16], fmDterm[16], fmIterm[16], fmRet[16];
static int index=0;
float fError, fPterm, fDterm, fIterm, fRetPD, fRet;

    fError = fSetPoint - fProcessValue;
    fmProcessValue[index] = fProcessValue;
    fmError[index] = fError;
    fPterm = pid->fKp * fError;
    fmPterm[index] = fPterm;
    fDterm = pid->fKd * (fProcessValue - pid->fLastProcessValue);
    fmDterm[index] = fDterm;
    pid->fLastProcessValue = fProcessValue;
    fIterm = pid->fKi * (pid->fSumError + fError);
    fmIterm[index] = fIterm;
    fRetPD = fPterm + fDterm + pid->fMinPID;
    fRet = fRetPD + fIterm;
    fmRet[index] = fRet;
/*
    if (++index == 16)
        return (WORD)pid->fMinPID;
*/
    if (fRet > pid->fMaxPID)
        return (WORD)pid->fMaxPID;
    else if (fRet < pid->fMinPID)
        return (WORD)pid->fMinPID;
    pid->fLastIterm = fIterm;
    pid->fSumError += fError;
    return (WORD)fRet;
}
IgorKossak
Предполагаю, что это баг оптимизатора.
Как обходной манёвр могу предложить вынести static определения за пределы функции и убрать static.
Таким образом заработало.
Dir
Спасибо! Cняли подозрения в том, что это вирус smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.