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

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

4 hours ago, ericN said:

косвенно оскорбляя по профессиональному признаку, а это нарушение п.2.1.а и 2.1.д.

 

4 hours ago, ericN said:

А это не предвзятый ответ, намекая на то, что razrab83 дальше 1-ой страницы справочник не читал? (опять нарушение п 2.1.а)

Модератор: @ericN, Вы пока не модерируете данный раздел. Также Вы не являетесь адвокатом уважаемого @razrab83 Он - взрослый человек, и если ему понадобится, сам разберётся в ситуации, для этого есть множество способов. Например, подать жалобу модератору. Т.е. мне. Поэтому, заканчивайте защиту другого лица. Дальнейшее продолжение дискуссии в данном ключе будет рассмотрено как флуд. Выношу Вам устное предупреждение.

 

Также обращаюсь ко всем пользователям. Не флудим. Общаемся по теме. Переходы на личности не продолжаем! При продолжении выяснений отношений или общению по "замкнутому кругу" - закрою тему, как исчерпавшую себя.

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


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

Ещё пара минусов в репу IAR:

1) отсутствует поддержка бинарных литералов - создаёт неудобства при переносе кода с GCC:

#define MIPI_CSI2_VCDT_RX_REG_VCDT(vc, dt) (((vc & 3 /*0b11*/ ) << 6) | (dt & 0x3F /*0b111111*/ )) /* IAR не понимает бинарных литералов */

2) На объявления структуры со ссылками на себя - выдаёт предупреждение:

Quote

Warning[Pe301]: typedef name has already been declared (with same type)

typedef struct _sensor sensor_t;
typedef struct _sensor {
//...
    // Sensor function pointers
    int  (*init_status)         (sensor_t *sensor);
    int  (*reset)               (sensor_t *sensor);
//...
} sensor_t;

Или я ошибаюсь?  IAR 8.50

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


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

1 hour ago, repstosw said:

1) отсутствует поддержка бинарных литералов - создаёт неудобства при переносе кода с GCC:

Где-то с IAR 9.10 появилась поддержка таких литералов. Вот код, который компилируется IAR 9.30, но такие литералы я использую довольно давно.

oid Exti9_5IrqHandler() {
    CsSpi::set(false);
    while (SPI_STAT(SPI3) & 1 << 0)
        volatile auto dummy = SPI_DATA(SPI3);
    exti_interrupt_flag_clear(EXTI_8);
    DMA_INTC1(DMA1) = 1 << 5 | 1 << 4;
    DMA_INTC0(DMA1) = 1 << 5 | 1 << 4;
    SPI_CTL0(SPI3) &= ~( 0b111 << 3 );
    SPI_CTL0(SPI3) |= 0b010 << 3;

 

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


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

1 hour ago, haker_fox said:

Где-то с IAR 9.10 появилась поддержка таких литералов.

Ломаная версия 9.10 или старше есть в интернете?  Для себя пишу на GCC, но некоторые требуют IAR.

Вот ещё несколько недостатков IAR:

3) Встроенные функции подсчёта ведущих нулей или нулей с конца:  __builtin_clz(), __builtin_ctz().  Встречаются в некоторых проектах.

Нашёл имплементацию здесь: https://embeddedgurus.com/state-space/tag/clz

4) Нет поддержки typeof

5) Нет поддержки выравнивания членов структуры

 

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

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


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

1 hour ago, repstosw said:

Ломаная версия 9.10 или старше есть в интернете?

Ответил в ЛС.

1 hour ago, repstosw said:

5) Нет поддержки выравнивания членов структуры

Всмысле?) Вроде есть. В документации это описано.

1 hour ago, repstosw said:

4) Нет поддержки typeof

Полная поддержка библиотеки Си++17 появилась где-то ближе к версии 9.30. Может быть Вам это и нужно?)

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


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

5 часов назад, repstosw сказал:

Ещё пара минусов в репу IAR:

1) отсутствует поддержка бинарных литералов - создаёт неудобства при переносе кода с GCC:

Это не минус, а плюс.  :wink:

Чтобы не наблюдать потом в исходниках этого безобразия. :bad:

Имхо - для embedded-программиста должно быть само собой разумеющимся уметь читать и воспринимать значения в hex. Примерно так же как - уметь читать мануалы на англ.

5 часов назад, repstosw сказал:

2) На объявления структуры со ссылками на себя - выдаёт предупреждение:

typedef struct _sensor sensor_t;
typedef struct _sensor {
//...
    // Sensor function pointers
    int  (*init_status)         (sensor_t *sensor);
    int  (*reset)               (sensor_t *sensor);
//...
} sensor_t;

А где тут "ссылки на себя"? У вас ссылки на сторонний typedef, а не "на себя". И ругается он на то, что дважды его пытаетесь объявлять. Объявление структуры тут вообще не при чём. Ругается на дублирующееся объявление typedef.

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

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

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

3 часа назад, haker_fox сказал:

Где-то с IAR 9.10 появилась поддержка таких литералов.

И зря! :sad:

2 часа назад, repstosw сказал:

3) Встроенные функции подсчёта ведущих нулей или нулей с конца:  __builtin_clz(), __builtin_ctz().  Встречаются в некоторых проектах.

Не очень понятно - чём речь?

Если что, то в "IAR for ARM" имеется intrinsic-функция __CLZ(). А с конца видимо: __CLZ(__RBIT()).

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


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

45 minutes ago, jcxz said:

И зря! :sad:

Тогда зря, что она появилась в стандарте Си++14))

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


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

1 hour ago, haker_fox said:

Всмысле?) Вроде есть. В документации это описано.

И это:

 struct 
 {
  ehci_qhd_t  qhd[HCD_MAX_ENDPOINT] __attribute__ ((aligned(32)));
  ehci_qtd_t  qtd[HCD_MAX_XFER] __attribute__ ((aligned(64)));
  ehci_itd_t  itd[EHCI_MAX_ITD]   __attribute__ ((aligned(128)));
  ehci_sitd_t sitd[EHCI_MAX_SITD]  __attribute__ ((aligned(256)));
 }device[CFG_TUSB_HOST_DEVICE_MAX];

 

55 minutes ago, jcxz said:

Имхо - для embedded-программиста должно быть само собой разумеющимся уметь читать и воспринимать значения в hex. Примерно так же как - уметь читать мануалы на англ.

Это всего лишь мнение. Позвольте не согласиться.

Лично мне иногда удобнее в двоичной системе счисления работать - в каких-то случаях это нагляднее,  a не разворачивать тетрады в уме 🙂

55 minutes ago, jcxz said:

А где тут "ссылки на себя"? У вас ссылки на сторонний typedef, а не "на себя". И ругается он на то, что дважды его пытаетесь объявлять. Объявление структуры тут вообще не при чём. Ругается на дублирующееся объявление typedef.

Выдал предупреждение на этом фрагменте:

Spoiler
typedef struct _sensor sensor_t;
typedef struct _sensor {
    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 *sensor);
    int  (*reset)               (sensor_t *sensor);
    int  (*set_pixformat)       (sensor_t *sensor, pixformat_t pixformat);
    int  (*set_framesize)       (sensor_t *sensor, framesize_t framesize);
    int  (*set_contrast)        (sensor_t *sensor, int level);
    int  (*set_brightness)      (sensor_t *sensor, int level);
    int  (*set_saturation)      (sensor_t *sensor, int level);
    int  (*set_sharpness)       (sensor_t *sensor, int level);
    int  (*set_denoise)         (sensor_t *sensor, int level);
    int  (*set_gainceiling)     (sensor_t *sensor, gainceiling_t gainceiling);
    int  (*set_quality)         (sensor_t *sensor, int quality);
    int  (*set_colorbar)        (sensor_t *sensor, int enable);
    int  (*set_whitebal)        (sensor_t *sensor, int enable);
    int  (*set_gain_ctrl)       (sensor_t *sensor, int enable);
    int  (*set_exposure_ctrl)   (sensor_t *sensor, int enable);
    int  (*set_hmirror)         (sensor_t *sensor, int enable);
    int  (*set_vflip)           (sensor_t *sensor, int enable);

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

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

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

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

    int  (*get_reg)             (sensor_t *sensor, int reg, int mask);
    int  (*set_reg)             (sensor_t *sensor, int reg, int mask, int value);
    int  (*set_res_raw)         (sensor_t *sensor, 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 *sensor, int bypass, int mul, int sys, int root, int pre, int seld5, int pclken, int pclk);
    int  (*set_xclk)            (sensor_t *sensor, int timer, int xclk);
} sensor_t;

 

 

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

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


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

6 часов назад, repstosw сказал:

Ещё пара минусов в репу IAR:

1) отсутствует поддержка бинарных литералов - создаёт неудобства при переносе кода с GCC:

#define MIPI_CSI2_VCDT_RX_REG_VCDT(vc, dt) (((vc & 3 /*0b11*/ ) << 6) | (dt & 0x3F /*0b111111*/ )) /* IAR не понимает бинарных литералов */

Различные нестандартные расширения, к сожалению, и выливаются вот в таких вот неудобствах. Можно было бы написать самодельный макрос bin(...), но несовместимость с чужими исходниками все равно останется. Однако, маркеры 0b легко ищутся, поэтому можно было бы прогнать исходники через утилитку-корректор. Но все это так, костылестроение😔
 

Цитата

2) На объявления структуры со ссылками на себя - выдаёт предупреждение:

typedef struct _sensor sensor_t;
typedef struct _sensor {
//...
    // Sensor function pointers
    int  (*init_status)         (sensor_t *sensor);
    int  (*reset)               (sensor_t *sensor);
//...
} sensor_t;

Выше jcxz уже все правильно сказал по этому поводу. Поэтому IAR тут не виноват.
 

Цитата

3) Встроенные функции подсчёта ведущих нулей или нулей с конца:  __builtin_clz(), __builtin_ctz().  Встречаются в некоторых проектах.

Все эти встроенные функции также являются расширениями GCC, поэтому никто в своих компиляторах не обязан их повторять. Так или иначе придется искать альтернативы - в том числе и по синтаксису.
 

Цитата

Нашёл имплементацию здесь: https://embeddedgurus.com/state-space/tag/clz

Вам compile-time или run-time версия нужна?
 

Цитата

4) Нет поддержки typeof

Этого не было ни в C, ни в C++, вроде, никогда. В C23 - будет официально на уровне стандарта. На данный момент typeof - тоже расширение.

P.S. CLang (ARM Compiler 6) у Keil-а из коробки поддерживает все расширения GCC - может, сойдет за аргумент к переходу.
 

Цитата

Выдал предупреждение на этом фрагменте:

Потому что из объявления надо убрать typedef. А вообще, объявление можно вовсе убрать, т.к. у Вас указатель.

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


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

14 minutes ago, Arlleex said:

Вам compile-time или run-time версия нужна?

чем быстрее, тем лучше

14 minutes ago, Arlleex said:

Этого не было ни в C, ни в C++, вроде, никогда. В C23 - будет официально на уровне стандарта. На данный момент typeof - тоже расширение.

Вот здесь oно нужно:

#define ALIGN(x, a) (((x) + ((typeof(x))(a) - 1)) & ~((typeof(x))(a) - 1))
#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0)

Пока что сделал так:

#define ALIGN(x, a) (((x) + ((a) - 1)) & ~((a) - 1))
#define IS_ALIGNED(x, a) (((x) & ((a) - 1)) == 0)

 

14 minutes ago, Arlleex said:

P.S. CLang (ARM Compiler 6) у Keil-а из коробки поддерживает все расширения GCC - может, сойдет за аргумент к переходу.

Не я решаю.

Для себя пишу на GCC. Не вижу смысла лезть в Keil для Cortex A7.

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

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


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

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

чем быстрее, тем лучше

Этот критерий к вопросу не относится🙂 Compile-time это одно, run-time - совсем другое.
Полагаю, Вам нужен run-time, т.к. аргументом вызова clz() Вы хотите использовать переменную (не константу).

Тогда лучше погуглить, есть ли в Cortex-A5 аппаратная инструкция CLZ, ну или вызвать __CLZ(), да проверить листинг и в железе.

Насчет typeof - попробуйте __typeof или __typeof__.

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


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

1 minute ago, Arlleex said:

Полагаю, Вам нужен run-time, т.к. аргументом вызова clz() Вы хотите использовать переменную (не константу).

да

12 minutes ago, Arlleex said:

P.S. CLang (ARM Compiler 6) у Keil-а из коробки поддерживает все расширения GCC - может, сойдет за аргумент к переходу.

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

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

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


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

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

да

Ну тогда даже можно в специальном регистре процессора узнать, умеет он аппаратную инструкцию CLZ или нет. Отсюда и плясать дальше.

Как минимум, Вам понадобится какая-то макрос-прослойка для определения типа аргумента clz(). У GCC были всякие __builtin_clz(), /clzl, /clzll.

Я написал себе так (на примере вычисления номера MSB для подпихиваемого аргумента):

#define msb_num(val)                              (_typed_builtin_clz((__typeof__(val))1) - _typed_builtin_clz(val))

#define cond_concat_2(cond, a, b, expr2)          __builtin_choose_expr(cond, concat_2(a, b), expr2)

#define _typed_builtin_clz(val)                   (cond_concat_2(sizeof(val) <= sizeof(int), __builtin_clz, ,     \
                                                     cond_concat_2(sizeof(val) <= sizeof(long), __builtin_clzl, , \
                                                       __builtin_clzll))(val))

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


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

1 hour ago, jcxz said:

Если что, то в "IAR for ARM" имеется intrinsic-функция __CLZ(). А с конца видимо: __CLZ(__RBIT()).

Не компилирует.  Возможно нужен хедер.  Какой?

Warning[Pe223]: function "__CLZ" declared implicitly h264enc.c 132 

Error[Li005]: no definition for "__CLZ" [referenced from Obj\h264enc.o] 

 

15 minutes ago, Arlleex said:

Насчет typeof - попробуйте __typeof или __typeof__.

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

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

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


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

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

Не компилирует.  Возможно нужен хедер.  Какой?

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

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


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

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

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

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

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

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

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

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

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

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