haker_fox 61 9 августа, 2023 Опубликовано 9 августа, 2023 · Жалоба 4 hours ago, ericN said: косвенно оскорбляя по профессиональному признаку, а это нарушение п.2.1.а и 2.1.д. 4 hours ago, ericN said: А это не предвзятый ответ, намекая на то, что razrab83 дальше 1-ой страницы справочник не читал? (опять нарушение п 2.1.а) Модератор: @ericN, Вы пока не модерируете данный раздел. Также Вы не являетесь адвокатом уважаемого @razrab83 Он - взрослый человек, и если ему понадобится, сам разберётся в ситуации, для этого есть множество способов. Например, подать жалобу модератору. Т.е. мне. Поэтому, заканчивайте защиту другого лица. Дальнейшее продолжение дискуссии в данном ключе будет рассмотрено как флуд. Выношу Вам устное предупреждение. Также обращаюсь ко всем пользователям. Не флудим. Общаемся по теме. Переходы на личности не продолжаем! При продолжении выяснений отношений или общению по "замкнутому кругу" - закрою тему, как исчерпавшую себя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 17 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба Ещё пара минусов в репу 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 17 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 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) Нет поддержки выравнивания членов структуры Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 1 hour ago, repstosw said: Ломаная версия 9.10 или старше есть в интернете? Ответил в ЛС. 1 hour ago, repstosw said: 5) Нет поддержки выравнивания членов структуры Всмысле?) Вроде есть. В документации это описано. 1 hour ago, repstosw said: 4) Нет поддержки typeof Полная поддержка библиотеки Си++17 появилась где-то ближе к версии 9.30. Может быть Вам это и нужно?) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 5 часов назад, repstosw сказал: Ещё пара минусов в репу IAR: 1) отсутствует поддержка бинарных литералов - создаёт неудобства при переносе кода с GCC: Это не минус, а плюс. Чтобы не наблюдать потом в исходниках этого безобразия. Имхо - для 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 появилась поддержка таких литералов. И зря! 2 часа назад, repstosw сказал: 3) Встроенные функции подсчёта ведущих нулей или нулей с конца: __builtin_clz(), __builtin_ctz(). Встречаются в некоторых проектах. Не очень понятно - чём речь? Если что, то в "IAR for ARM" имеется intrinsic-функция __CLZ(). А с конца видимо: __CLZ(__RBIT()). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 45 minutes ago, jcxz said: И зря! Тогда зря, что она появилась в стандарте Си++14)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 17 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 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; Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 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. А вообще, объявление можно вовсе убрать, т.к. у Вас указатель. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 17 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 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. Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 19 минут назад, repstosw сказал: чем быстрее, тем лучше Этот критерий к вопросу не относится🙂 Compile-time это одно, run-time - совсем другое. Полагаю, Вам нужен run-time, т.к. аргументом вызова clz() Вы хотите использовать переменную (не константу). Тогда лучше погуглить, есть ли в Cortex-A5 аппаратная инструкция CLZ, ну или вызвать __CLZ(), да проверить листинг и в железе. Насчет typeof - попробуйте __typeof или __typeof__. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 17 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 1 minute ago, Arlleex said: Полагаю, Вам нужен run-time, т.к. аргументом вызова clz() Вы хотите использовать переменную (не константу). да 12 minutes ago, Arlleex said: P.S. CLang (ARM Compiler 6) у Keil-а из коробки поддерживает все расширения GCC - может, сойдет за аргумент к переходу. Насколько шланг компилирует более быстрый код по сравнению с GCC? Все проекты компилирую с флагом -Ofast. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 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)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 17 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 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__. Оба варианта не компилируются Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 2 минуты назад, repstosw сказал: Не компилирует. Возможно нужен хедер. Какой? Возможно: #include <intrinsics.h> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться