Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 18 минут назад, repstosw сказал: Насколько шланг компилирует более быстрый код по сравнению с GCC? Это весьма хороший вопрос и я не уверен, что на него будет весьма однозначный ответ, т.к. а) специальных тестов я не проводил; б) GCC использую крайне редко и под другие архитектуры. Но я склонен работать узкоспециализированным инструментом, а GCC - это швейцарский нож. Где универсальность, там, скорее всего, и нюансов куча. Цитата Все проекты компилирую с флагом -Ofast. Я почти всегда на -Obalansed + LTO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 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 Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 7 минут назад, repstosw сказал: Оба варианта не компилируются Жаль. Тогда остается в Ваши макросы добавить аргумент - тип, и при вызове его передавать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 7 minutes ago, jcxz said: Возможно: #include <intrinsics.h> Да. Теперь нормально. __CLZ() 2 minutes ago, Arlleex said: Жаль. Тогда остается в Ваши макросы добавить аргумент - тип, и при вызове его передавать. Мне повезло - в программе тип фиксированный и он один: unsigned int. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 10 минут назад, repstosw сказал: Не компилирует: Error[Pe020]: identifier "sensor_t" is undefined \sensor.h 213 В конкретно приведенной структуре, если все другие указанные типы описаны верно, никакого криминала нет. Удалил sensor_id_t, pixformat_t и др. не видные мне типы - компилятор говорит, что все ок и ему все понятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 17 минут назад, repstosw сказал: Не компилирует: Компилировать нужно как си++. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 4 minutes ago, jcxz said: Компилировать нужно как си++. Тоесть IAR'овский Си не осилил, то что может GCC? И теперь из-за одного хедера - часть C-исходников переводить в CPP ? Лучше я выключу этот ворнинг, раз IAR такой убогий. Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 2 минуты назад, repstosw сказал: Тоесть IAR'овский Си не осилил, то что может GCC? Если хотите pure-Си, то извольте писать struct перед sensor_t, как требует того Сишечка. IAR тут не причем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 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? Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба typedef struct sensor_t sensor_t; struct sensor_t { ... sensor_t *; }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 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 Забавно, да? 🙂 Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба Забавно: ищите циклические зависимости (include lockup) - где-то Вы накрутили компилятору извилины Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 2 minutes ago, Arlleex said: Забавно: ищите циклические зависимости (include lockup) - где-то Вы накрутили компилятору извилины Тоесть, вердикт: GCC - крут, а IAR- нет! Автор кода - не я. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 6 минут назад, repstosw сказал: Тоесть, вердикт: GCC - крут, а IAR- нет! Это вряд ли...🙃 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба Ещё 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 - функцией - не засчитываетя 🙂 Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться