Перейти к содержанию
    

Компилятор IAR 8.5 Си не дает ошибку

18 минут назад, repstosw сказал:

Насколько шланг компилирует более быстрый код по сравнению с GCC?

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

Цитата

Все проекты компилирую с флагом -Ofast.

Я почти всегда на -Obalansed + LTO.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

А ссылки именно "на себя" IAR прекрасно переваривает:

struct sensor_t {
  int (*init_status)(sensor_t *);
};

Компилируется нормально. Даже древним IAR 7.80.4.

Не компилирует:

Spoiler
struct sensor_t {
    sensor_id_t id;             // Sensor ID.
    uint8_t  slv_addr;          // Sensor I2C slave address.
    pixformat_t pixformat;
    camera_status_t status;
    int xclk_freq_hz;

    // Sensor function pointers
    int  (*init_status)         (sensor_t *);
    int  (*reset)               (sensor_t *);
    int  (*set_pixformat)       (sensor_t *, pixformat_t pixformat);
    int  (*set_framesize)       (sensor_t *, framesize_t framesize);
    int  (*set_contrast)        (sensor_t *, int level);
    int  (*set_brightness)      (sensor_t *, int level);
    int  (*set_saturation)      (sensor_t *, int level);
    int  (*set_sharpness)       (sensor_t *, int level);
    int  (*set_denoise)         (sensor_t *, int level);
    int  (*set_gainceiling)     (sensor_t *, gainceiling_t gainceiling);
    int  (*set_quality)         (sensor_t *, int quality);
    int  (*set_colorbar)        (sensor_t *, int enable);
    int  (*set_whitebal)        (sensor_t *, int enable);
    int  (*set_gain_ctrl)       (sensor_t *, int enable);
    int  (*set_exposure_ctrl)   (sensor_t *, int enable);
    int  (*set_hmirror)         (sensor_t *, int enable);
    int  (*set_vflip)           (sensor_t *, int enable);

    int  (*set_aec2)            (sensor_t *, int enable);
    int  (*set_awb_gain)        (sensor_t *, int enable);
    int  (*set_agc_gain)        (sensor_t *, int gain);
    int  (*set_aec_value)       (sensor_t *, int gain);

    int  (*set_special_effect)  (sensor_t *, int effect);
    int  (*set_wb_mode)         (sensor_t *, int mode);
    int  (*set_ae_level)        (sensor_t *, int level);

    int  (*set_dcw)             (sensor_t *, int enable);
    int  (*set_bpc)             (sensor_t *, int enable);
    int  (*set_wpc)             (sensor_t *, int enable);

    int  (*set_raw_gma)         (sensor_t *, int enable);
    int  (*set_lenc)            (sensor_t *, int enable);

    int  (*get_reg)             (sensor_t *, int reg, int mask);
    int  (*set_reg)             (sensor_t *, int reg, int mask, int value);
    int  (*set_res_raw)         (sensor_t *, int startX, int startY, int endX, int endY, int offsetX, int offsetY, int totalX, int totalY, int outputX, int outputY, bool scale, bool binning);
    int  (*set_pll)             (sensor_t *, int bypass, int mul, int sys, int root, int pre, int seld5, int pclken, int pclk);
    int  (*set_xclk)            (sensor_t *, int timer, int xclk);
};

 

Выдаёт  массу ошибок:

Error[Pe020]: identifier "sensor_t" is undefined \sensor.h 213

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, repstosw сказал:

Оба варианта не компилируются

Жаль. Тогда остается в Ваши макросы добавить аргумент - тип, и при вызове его передавать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, jcxz said:

Возможно: #include <intrinsics.h>

Да. Теперь нормально.  __CLZ()

2 minutes ago, Arlleex said:

Жаль. Тогда остается в Ваши макросы добавить аргумент - тип, и при вызове его передавать.

Мне повезло - в программе тип фиксированный и он один: unsigned int.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, repstosw сказал:

Не компилирует:

Error[Pe020]: identifier "sensor_t" is undefined \sensor.h 213

В конкретно приведенной структуре, если все другие указанные типы описаны верно, никакого криминала нет.

Удалил sensor_id_tpixformat_t и др. не видные мне типы - компилятор говорит, что все ок и ему все понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, repstosw сказал:

Не компилирует:

Компилировать нужно как си++.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, jcxz said:

Компилировать нужно как си++.

Тоесть IAR'овский Си не осилил,  то что может GCC?

И теперь из-за одного хедера - часть C-исходников переводить в CPP ?  Лучше я выключу этот ворнинг, раз IAR такой убогий.

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, repstosw сказал:

Тоесть IAR'овский Си не осилил,  то что может GCC?

Если хотите pure-Си, то извольте писать struct перед sensor_t, как требует того Сишечка. IAR тут не причем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, Arlleex said:

Если хотите pure-Си, то извольте писать struct перед sensor_t, как требует того Сишечка. IAR тут не причем.

И кстати,  С++ тоже не осилил.   IAR 8.50

5 minutes ago, Arlleex said:

Если хотите pure-Си, то извольте писать struct перед sensor_t, как требует того Сишечка. IAR тут не причем.

Warning[Pe231]: declaration is not visible outside of function \sensor.h 263

 

Почему то, что делает GCC, не делает IAR?

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, Arlleex said:
typedef struct sensor_t sensor_t;

struct sensor_t {

... sensor_t *;

};

Сожрало!

Но теперь из-за этого вот здесь ошибки:

static int set_bank(sensor_t *sensor, ov2640_bank_t bank)
{
    int res = 0;
    if (bank != reg_bank) {
        reg_bank = bank;
        res = SCCB_Write(sensor->slv_addr, BANK_SEL, bank);
    }
    return res;
}

Error[Pe393]: pointer to incomplete class type is not allowed OV2640\ov2640.c 74

 

Забавно, да? 🙂

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забавно: ищите циклические зависимости (include lockup) - где-то Вы накрутили компилятору извилины:wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Arlleex said:

Забавно: ищите циклические зависимости (include lockup) - где-то Вы накрутили компилятору извилины:wink:

Тоесть, вердикт:  GCC - крут, а IAR- нет! :lol:

Автор кода - не я.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, repstosw сказал:

Тоесть, вердикт:  GCC - крут, а IAR- нет! :lol:

Это вряд ли...🙃

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё IAR не может в локальные метки.  Что-то наподобие:

#define TTT(x) \
{ \
 int y; \
 local m1: \
 y=test(x); \
 if(y)goto m1; \
 printf("%d\n",y); \
} \


void main(void)
{
 TTT(2);
 TTT(23);
 TTT(234);
}

Вариант сделать TTT - функцией - не засчитываетя 🙂

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...