|
Библиотеки для STM32 |
|
|
26 страниц
1 2 3 > »
|
 |
Ответов
(1 - 99)
|
Mar 3 2017, 03:26
|

Знающий
   
Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423

|
SPL тут лежит. Но STM вместо SPL теперь HAL продвигает. Где его скачать отдельно - не знаю, но он есть в составе CUBE (+ pdf с документацией). + для этой серии МК есть сниппеты кода.
Сообщение отредактировал arhiv6 - Mar 3 2017, 03:28
--------------------
|
|
|
|
|
Mar 3 2017, 05:38
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Нет их. Пользуйтесь сниппетами. Я сам отказался уже для F0-серии от глюкавого opencm3 и пользуюсь только регистрами. Вообще не вижу смысла на таких дохлых МК еще и калокубом пользоваться... Любителям калокуба нужно что-то жирное, с мегабайтом флеша и как минимум 96МГц.
|
|
|
|
|
Mar 3 2017, 06:22
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(arhiv6 @ Mar 3 2017, 08:26)  Спасибо. Но это для stm32 F0**. А для stm32 L0**? Цитата(Эдди @ Mar 3 2017, 10:38)  Я сам отказался уже для F0-серии от глюкавого opencm3 и пользуюсь только регистрами. можно и регистрами напрямую... но нужен как минимум stm32 l03***.h, ну и стартап не помешает.
|
|
|
|
|
Mar 3 2017, 06:47
|
Группа: Участник
Сообщений: 8
Регистрация: 13-12-12
Пользователь №: 74 834

|
Цитата(juvf @ Mar 3 2017, 09:22)  А для stm32L0**? Цитата STM32CubeL0 gathers together, in a single package, all the generic embedded software components required to develop an application on STM32L0 microcontrollers. http://www.st.com/content/st_com/en/produc...tm32cubel0.htmlВ самом низу на странице ссылка на библиотеку
|
|
|
|
|
Mar 3 2017, 13:51
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633

|
Кстати, просветите насчёт сниппетов, пожалуйста. Насколько я понял ST отказалась и от них тоже, заменив на HAL Low Level Drivers. Это макро-обёртки над регистрами периферии которыми пользуется верхний уровень самого HAL, но если для каких-то драйверов он избыточен и не применяется, то позволяется напрямую пользоваться этими макросами. Причём, поскольку это тоже относительно новое веяние, то например для F4 серии их я не заметил, хотя в HAL для других линеек они присутствуют.
Сообщение отредактировал PheeL - Mar 3 2017, 13:54
--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
|
|
|
|
|
Mar 3 2017, 15:21
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 29-12-13
Из: St.Petersburg
Пользователь №: 79 852

|
Цитата(juvf @ Mar 3 2017, 09:22)  можно и регистрами напрямую... но нужен как минимум stm32l03***.h, ну и стартап не помешает. Снипеты это и есть небоходимые sytem* и startup* файлы с макросами. И примеры/шаблоны их применения. Похоже ST отказалась от SPL для L0 и F0 серий и сделала снипеты. http://www.st.com/en/embedded-software/stm...roductId=LN1898
Сообщение отредактировал Utyff - Mar 3 2017, 15:22
--------------------
Скудность мысли порождает легионы единомышленников.
|
|
|
|
|
Mar 3 2017, 15:26
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Utyff @ Mar 3 2017, 18:21)  Снипеты это и есть небоходимые sytem* и startup* файлы с макросами. Интересно, чем так страшен стартап? Вот, к примеру, мой: CODE #include "stm32f0xx.h" #include <string.h>
extern char __etext, __data_start__, __data_end__, __bss_start__, __bss_end__; extern int main();
static void trap(void) { for (;;) ; }
static void (*vectab[])(void) __attribute((used, section(".vectab"))) = { trap, // NMI trap, // HardFault // [UART_IRQN + 16 - 2] = uart_handler, // [TIM2_IRQn + 16 - 2] = tim2_handler, };
void __attribute((used, noreturn)) Reset_Handler(void) { // copy-init variables memcpy(&__data_start__, &__etext, &__data_end__ - &__data_start__); // zero-init variables memset(&__bss_start__, 0, &__bss_end__ - &__bss_start__);
(void)main(); for (;;) ; }
|
|
|
|
|
Mar 3 2017, 15:27
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Цитата(demiurg_spb @ Mar 3 2017, 16:38)  Чем не угодил libopencm3? Когда после очередного обновления у меня ничего не собралось из-за того, что разрабы охрененно порезали API, мое терпение лопнуло! Я решил, что только nolib может спасти ситуацию. А наиболее употребимые штуки можно в макросы или static inline запихнуть. Заголовочные файлы я взял в тех же сниппетах (можно из SPL их выдрать, или же из opencm3 — это уже на любителя). Стартап в виде ассемблерного файла мне показался диким бредом, и я взял стартап у opencm3. Ну и все, можно у меня на гитхабе глянуть, что получилось.
|
|
|
|
|
Mar 4 2017, 04:59
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (scifi @ Mar 3 2017, 22:26)  Интересно, чем так страшен стартап? +1. QUOTE (scifi @ Mar 3 2017, 22:26)  Вот, к примеру, мой: <...> Или вот.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 4 2017, 14:27
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(jcxz @ Mar 4 2017, 13:43)  А что в этом неправильного? Это основная задача линкера - распределять адресное пространство. Точно так же можно в icf-файле IAR определить адресные пространства периферии. Неправильно, что то, что можно и НУЖНО делать преносимыми средствами языка, делается непереносимыми средствами инструмента. Появляется нахренненужная привязка и инструменту. Точнее, конечно, "нужная", но только тексасу пытающемуся таким образом подсадить недалеких потребителей и на свои инструменты, и свои контролеры. Такая же фигня в общем и у IAR - хидеры ваяют со своими "расширениями" с той же целью.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 4 2017, 15:08
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
Цитата(zltigo @ Mar 4 2017, 09:27)  Неправильно, что то, что можно и НУЖНО делать преносимыми средствами языка, делается непереносимыми средствами инструмента. Появляется нахренненужная привязка и инструменту. Точнее, конечно, "нужная", но только тексасу пытающемуся таким образом подсадить недалеких потребителей и на свои инструменты, и свои контролеры. Такая же фигня в общем и у IAR - хидеры ваяют со своими "расширениями" с той же целью. Agreed 100%
--------------------
|
|
|
|
|
Mar 4 2017, 15:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(pitt @ Mar 4 2017, 22:08)  Agreed 100% Так-то оно так, да вот беда - в С не предусмотрено стандартных средств для назначения объектам реальных адресов. Впрочем для процессоров где периферия отображается в общее с памятью адресное пространство (типа ARM или MSP430) эти средства не особо нужны, можно обойтись указателями на регистры периферии.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Mar 5 2017, 07:04
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Что-то я не понял про привязку. У меня таблица векторов выглядит так: Код __attribute__ ((section(".isr_vectors"))) void (* const __vectors[])(void) = { &_estack, /* The initial stack pointer */ Reset_Handler, /* Reset Handler */ NMI_Handler, /* NMI Handler */ HardFault_Handler, /* Hard Fault Handler */ ......................... В скрипте линкера прописывается куда положить какую секцию и собственно все.
|
|
|
|
|
Mar 5 2017, 20:34
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Шаманъ @ Mar 5 2017, 09:04)  Что-то я не понял про привязку. У меня таблица векторов выглядит так: В скрипте линкера прописывается куда положить какую секцию и собственно все. Разговор был про назначение адресов памяти регистрам периферии. Кто-то делает это в си-шных хидерах, кто-то - через линкер. Принципиальной разницы нет. Имхо. Цитата(Genadi Zawidowski @ Mar 5 2017, 12:12)  А есть люди, кто этот массив частично описывают в программе, частично собирают в скрипте линкера. Вот я глядя в исходник и ошибся, считая сто там ошибка (неполная таблица). Скорее такие люди просто надёргали кусков отовсюду, не разбираясь и не понимая.
|
|
|
|
|
Mar 11 2017, 05:01
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Цитата(yanvasiij @ Mar 10 2017, 20:46)  не нашел в свое время SPL. Пришлось сделать HAL. Ничего себе, это ж просто деление на нуль! Ладно еще, когда народ по своей абдуринской привычке эти монструозные библиотеки на F4 или F7 пихает, но на F0 это просто жесть! Неужто сложно прочесть тоненький RM?
|
|
|
|
|
Mar 11 2017, 06:52
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Это избитая холиварная тема, спорить на которую можно долго и нудно, самое главное бесполезно. Вы не обессудьте, что я выскажусь и на этом закончу, не вступая далее в полемику. Смысл такой: что spl, что hal, что opencm3 дают очевидные, на мой взгляд, преимущества: 1) не нужно тратить время на написание драйверов с нуля, при том что когда пишешь драйвера с нуля точно также допускаешь ошибки (выше по теме Вы можете это наблюдать). От чтения RM это конечно не освобождает, без этого никак. Там есть ошибки - не страшно, они отлавливаются на раз-два, было бы терпение и потом многократно используются. 2) hal, opencm3, и даже spl в отличии от самописных библиотек поддерживаются разработчиками и сообществом. Они развиваются и их функционал расширяется, ошибки внутри устраняются. Самописную же либу, поддерживает только один разработчик. 3) Тот же hal тянет за собой массу дополнительных библиотек (стек tcp, файловую систему, стек usb и прочее). Вы скажете, что это можно поднять самому скачав отдельно? Но зачем делать работу второй раз и тратить на нее время? Не проще ли разобраться в том, что уже сделано? 4) Переносимость между сериями и проектами. Код написанный другим разработчиками под hal, spl, opencm3, легко перенести к себе другому разработчику, который тоже использует hal, spl, opencm3. Это какая-никакая унификация. А если каждый будет колхозить свои библиотеки, тот как обмениваться наработками? Можно но уже сложнее, ибо низкоуровневые вещи нужно переписывать.
А разговоры про избыточность, мне кажется надуманными. Покажите мне сравнительные тесты, в которых наглядно показывается что по вине hal программа начинает работать в разы медленнее. В моей практике такого не было. Большее потребление памяти? Сколько раз в жизни у вас было такое, что на cortex процах у вас кончалась память? Если такое и было, то держу пари это точно происходило не по вине hal. Код громоздкий и непонятный? Это уже чистой воды субъективизм, найдется приличное количество народу, кто не согласится с этим. В добавок ко всему hal достаточно гибкий совсем не обязательно использовать все его конструкции.
Ну вот вообщем такое мое мнение. Извините за оффтоп.
|
|
|
|
|
Mar 11 2017, 13:10
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Когда я заводил 1-wire через таймер с ПДП, был первый раз, когда я столкнулся с невозможностью реализации задуманного по вине библиотеки. Opencm3 оказалась слишком медленной. Во всех перечисленных библиотеках очень жирный код. Поражающая избыточность приводит к 1) тормозам, 2) увеличению объема прошивки. Оба этих момента в определенный момент могут подставить подлянку.
На мой взгляд единственным правильным вариантом будет нарабатывать сниппеты. А "обмениваться" быдлокодом смысла не вижу. Самый страшный пример — абдурина. Я тут намедни писал обработчик, работающий с термодатчиком TSYS01. Скачал код для абдурины — думал, шустрей будет. А там такое... Какой-то идиот мало того, что флоаты воткнул, так еще и температуру вычислял по формуле из даташита!!! Я от такого идиотизма вообще в шоке.
Под STM32 тоже полно кода в интернетах можно найти. Мне к девборде заботливые китайцы диск приложили с уймой проектов под калокубы. Я даже пытался было для работы с экранчиком взять готовое, но почитав этот жесточайший быдлокод понял, что так делать ни в коем случае нельзя! Вот каким надо быть чудаком на букву "М", чтобы использовать ногодрыг на проце, имеющем нужную периферию и DMA?
И да, т.к. сами авторы опенцм3 говорят, что библиотека еще в стадии тестирования, лучше ею не пользоваться. После того, как они поменяли API, я решил от этой дряни отказаться. Пока ваяю под STM32F0, и очень даже хорошо все идет. Надо будет только USB откуда-нибудь выдрать (из той же opencm3, например), т.к. хочу посредника между USB и CAN на STM32F042 замутить. Да и просто на F103 я привык с CDC работать вместо подключения лишнего переходника на USART.
Сообщение отредактировал Эдди - Mar 11 2017, 13:13
|
|
|
|
|
Mar 11 2017, 21:49
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Эдди @ Mar 11 2017, 15:10)  ... Пока ваяю под STM32F0, и очень даже хорошо все идет. Надо будет только USB откуда-нибудь выдрать (из той же opencm3, например), т.к. хочу посредника между USB и CAN на STM32F042 замутить. ... Я когда перетаскивал проект с Меги128 на STM32F072 и нужно было в духе времени по-быстрому USB подцепить вдогонку к RS-232. Так сгенерировал проект на HALе, и первое время, когда с ним разбирался, тоже диву давался тому, как там все понаписано. Но идеология понятна: разработчики хотели добиться переносимости между ВСЕМИ stm32. Поэтому и эта жуткая многослойность различных макросов друг на друге, когда более сложные низкоуровневые постепенно, в несколько этапов, заменяются на применимые к конкретному процессору. И разделение процедур на несколько уровней для разграничения области видимости переменных и функций - тоже прозрачности не прибавляет. Разбираться в этом - пипец полный, но ведь работает  Но глядя на то, сколько у меня суммарно ушло времени на то, чтобы с нуля начал работать проект с USB и прочей периферией, у меня никакого желания нет погружаться сильно в глубь и переписывать библиотеки. Тем более, что периферия у STM32 не такая и простая, как у предыдущих простеньких ПИКов, АВРок и т.д. Частенько разбираешься с HAL (я обычно верхний уровень, а часто и пониже, правлю, выкидывая уж слишком сложные навороты) и видишь манипуляции с флагами периферии, про которые сразу догадаться, что так нужно делать, при чтении документации невозможно. Так что можно "все взять под свой контроль" - но с годами лучше начинаешь понимать, что это мало где нужно. Время уплотняется, все нужно быстрее, быстрее. Сидишь так, вылизываешь код, а год-два проходит (а часто и меньше) - и никому это уже не нужно - давай гони что-то новое. Как то так...
|
|
|
|
|
Mar 12 2017, 07:44
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Baser @ Mar 11 2017, 23:49)  Тем более, что периферия у STM32 не такая и простая, как у предыдущих простеньких ПИКов, АВРок и т.д. Из всех прочих ARM, с которыми я имел дело, у STM32 самая простая периферия. А имел дело я и с NXP (LPC17xx и LPC43xx) и TI (Tiva, Concerto, OMAP) и Infineon. Видна цель производителя: сделать наиболее простую периферию для снижения порога входа для новичков, пускай даже в ущерб функциональности. Осваивать периферию STM32 не в пример легче, хотя бы потому что приходится читать описания на гораздо меньшее число регистров периферии чем в других МК. Сужу по собственному опыту. Например: в том же USART у STM32F4x всего 7 регистров, в то время как у Infineon например - около полусотни в его USIC. И это не считая связанных регистров.
|
|
|
|
|
Mar 12 2017, 16:54
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Baser @ Mar 12 2017, 02:49)  Но идеология понятна: разработчики хотели добиться переносимости между ВСЕМИ stm32. Вот только переносимости ЧЕГО - они, видать, так и не придумали.... "HelloWorld" переносить? Потому как при переносе чего существенного все равно возникают проблемы: то тактирование не то, то DMA не совместимы, и вообще, оказывается, одинаковая периферия на самом деле то разная, возможности не те... Поэтому в любом случае, придется немного дорабатывать. И коим образом тут поможет кубохал?
|
|
|
|
|
Mar 13 2017, 09:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(juvf @ Mar 13 2017, 10:51)  LL - это тоже зло от st? Все в жизни относительно. Для ST - SPL\HAL\LL - это очень большое добро. Привязывает пользователей к продукции ST. Для остальных - кому как. Если нравится кому быть привязаным к одному производителю - пожалуйста. У меня свой лунапарк в части интерфейса к GPIO и основой периферии (SPI, I2C, UART). Поэтому не не составляет труда переносить код между используемыми камнями. Если использовать HAL - то это будет просто лишней прослойкой, которая в конкретном случае ни от чего не спасет.
|
|
|
|
|
Mar 14 2017, 16:32
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Оооо! Я тоже на таком же велосипеде езжу! Этажом ниже ATMega, ATXMega (кроме USB), Renesas RZ/A1L, AT91SAM9S, ATSAM3/4S, STM32Fxxxx Код // +++ dsp // Интерфейс к НЧ кодеку void hardware_audiocodec_enable(void); // Интерфейс к НЧ кодеку void hardware_audiocodec_initialize(void); // Интерфейс к НЧ кодеку
// Интерфейс к ПЧ кодеку или FPGA void hardware_fpgacodec_enable(void); // Интерфейс к ВЧ кодеку void hardware_fpgacodec_initialize(void); // Интерфейс к ВЧ кодеку void hardware_fpgaspectrum_enable(void); // Интерфейс к источнику данных о спектре void hardware_fpgaspectrum_initialize(void); // Интерфейс к источнику данных о спектре
void hardware_dac_initialize(void); /* инициализация DAC на STM32F4xx */ void hardware_dac_ch1_setvalue(uint_fast16_t v); // вывод 12-битного значения на ЦАП - канал 1 void hardware_dac_ch2_setvalue(uint_fast16_t v); // вывод 12-битного значения на ЦАП - канал 2
void hardware_spi_io_delay(void);
void cat2_parsechar(uint_fast8_t c); /* вызывается из обработчика прерываний */ void cat2_rxoverflow(void); /* вызывается из обработчика прерываний */ void cat2_disconnect(void); /* вызывается из обработчика прерываний произошёл разрыв связи при работе по USB CDC */ void cat2_sendchar(void * ctx); /* вызывается из обработчика прерываний */
// Функции тестирования работы компорта по прерываниям void cat3_parsechar(uint_fast8_t c); /* вызывается из обработчика прерываний */ void cat3_rxoverflow(void); /* вызывается из обработчика прерываний */ void cat3_disconnect(void); /* вызывается из обработчика прерываний */ void cat3_sendchar(void * ctx); /* вызывается из обработчика прерываний */
void modem_parsechar(uint_fast8_t c); /* вызывается из обработчика прерываний */ void modem_rxoverflow(void); /* вызывается из обработчика прерываний */ void modem_disconnect(void); /* вызывается из обработчика прерываний */ void modem_sendchar(void * ctx); /* вызывается из обработчика прерываний */
void nmea_parsechar(uint_fast8_t c); /* вызывается из обработчика прерываний */ void nmea_rxoverflow(void); /* вызывается из обработчика прерываний */ void nmea_sendchar(void * ctx); /* вызывается из обработчика прерываний */
void hardware_uart1_initialize(void); void hardware_uart1_set_speed(uint_fast32_t baudrate); void hardware_uart1_tx(void * ctx, uint_fast8_t c); /* передача символа после прерывания о готовности передатчика */ void hardware_uart1_enabletx(uint_fast8_t state); /* вызывается из обработчика прерываний */ void hardware_uart1_enablerx(uint_fast8_t state); /* вызывается из обработчика прерываний */ uint_fast8_t hardware_usart1_putchar(uint_fast8_t c);/* передача символа если готов порт */ uint_fast8_t hardware_usart1_getchar(char * cp); /* приём символа, если готов порт */
void hardware_uart2_initialize(void); void hardware_uart2_set_speed(uint_fast32_t baudrate); void hardware_uart2_tx(void * ctx, uint_fast8_t c); /* передача символа после прерывания о готовности передатчика */ void hardware_uart2_enabletx(uint_fast8_t state); /* вызывается из обработчика прерываний */ void hardware_uart2_enablerx(uint_fast8_t state); /* вызывается из обработчика прерываний */ uint_fast8_t hardware_usart2_putchar(uint_fast8_t c);/* передача символа если готов порт */ uint_fast8_t hardware_usart2_getchar(char * cp); /* приём символа, если готов порт */
void usbd_cdc_tx(void * ctx, uint_fast8_t c); /* передача символа после прерывания о готовности передатчика - вызывается из HARDWARE_CDC_ONTXCHAR */ void usbd_cdc_enabletx(uint_fast8_t state); /* вызывается из обработчика прерываний */ void usbd_cdc_enablerx(uint_fast8_t state); /* вызывается из обработчика прерываний */
/* отладочная выдача через USB CDC */ void debugusb_initialize(void); /* Вызывается из user-mode программы при запрещённых прерываниях. */ uint_fast8_t debugusb_putchar(uint_fast8_t c);/* передача символа если готов порт */ uint_fast8_t debugusb_getchar(char * cp); /* приём символа, если готов порт */ void debugusb_parsechar(uint_fast8_t c); /* вызывается из обработчика прерываний */ void debugusb_sendchar(void * ctx); /* вызывается из обработчика прерываний */ И далее в том же духе: Код uint_fast8_t board_getadc_filtered_u8(uint_fast8_t i, uint_fast8_t lower, uint_fast8_t upper); /* получить значение от АЦП в диапазоне lower..upper (включая границы) */ uint_fast16_t board_getadc_filtered_u16(uint_fast8_t i, uint_fast16_t lower, uint_fast16_t upper); /* получить значение от АЦП в диапазоне lower..upper (включая границы) */ uint_fast8_t board_getadc_smoothed_u8(uint_fast8_t i, uint_fast8_t lower, uint_fast8_t upper); /* при изменении отфильтрованного значения этого АЦП возвращаемое значение на каждом вызове приближается к нему на 1 */ uint_fast8_t board_getadc_unfiltered_u8(uint_fast8_t i, uint_fast8_t lower, uint_fast8_t upper); /* получить значение от АЦП в диапазоне lower..upper (включая границы) */ uint_fast16_t board_getadc_unfiltered_u16(uint_fast8_t i, uint_fast16_t lower, uint_fast16_t upper); /* получить значение от АЦП в диапазоне lower..upper (включая границы) */ uint_fast32_t board_getadc_unfiltered_u32(uint_fast8_t i, uint_fast32_t lower, uint_fast32_t upper); /* получить значение от АЦП в диапазоне 0..255 */ adcvalholder_t board_getadc_filtered_truevalue(uint_fast8_t i); /* получить значение от АЦП */ adcvalholder_t board_getadc_unfiltered_truevalue(uint_fast8_t i); /* получить значение от АЦП */ adcvalholder_t board_getadc_fsval(void); /* получить максимальное значение значение от АЦП */ void hardware_set_adc_filter(uint_fast8_t i, uint_fast8_t v); /* установить способ фильтрации данных (в момент выборки их регистра АЦП */
void hardware_set_adc_filterLPF(uint_fast8_t i, uint_fast8_t k); /* Установить способ фильтрации LPF и частоту среза - параметр 1.0..0.0, умноженное на HARDWARE_ADCFILTER_LPF_DENOM */ #define HARDWARE_ADCFILTER_LPF_DENOM 128 /* положение фиксированной точки при фильтрации HARDWARE_ADCFILTER_LPF */
Сообщение отредактировал Genadi Zawidowski - Mar 14 2017, 22:40
|
|
|
|
|
Mar 28 2017, 00:43
|
Знающий
   
Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177

|
QUOTE (ViKo @ Mar 27 2017, 07:11)  Поделитесь примером с комментариями на английском, который не стыдно показать. Не знаю, какой в этом смысл, но вот - хватанул с экрана что было в окне редактора...  CODE for (;;) // Task, that caused error, will loop here forever { #ifndef DEBUG if (!(SysFlags & SYSF_OSStarted)) VdHitWd(wd); #endif
UpdLEDs (); t2 = _SET_TIMEOUT(100); // 100 ms delay while (!(_CHK_TIMEOUT(t2))) {}
if (_CHK_TIMEOUT(t)) // Check if timeout expired { SysFlags |= SYSF_ResetReq; // Set restart request flag t = _SET_TIMEOUT(3000); // Allow 3 sec for graceful termination of other tasks while (!(_CHK_TIMEOUT(t))) {} GSMPower(0); // Turn modem off if (GenCnf.dat.DSLflags & DSMF_Enable) { Slv_SleepCmd (SLAVE_ADDR, 3600, 0x01, &err); t = _SET_TIMEOUT(3000); // Delay 3 sec while (!(_CHK_TIMEOUT(t))) {} // (actually, power will be shut down during this delay) // If we pass here, something went really wrong. Reboot anyway. reboot(); // Reset unit, if wasn't done already by other task } else reboot(); // Reset unit, if wasn't done already by other task } }
}
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
Mar 28 2017, 10:14
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Эдди @ Mar 28 2017, 08:00)  Например, зачем комментировать очевидное — паузы? У меня такие комментарии частенько бывают. По двум причинам. 1. Частенько лень писать спец. макрос и число в коде не явно описывает реальное время задержки. 2. Как выше в примере - число реальное, а единицы измерений неизвестно какие (мкс, мс, сек ??) А через год нужно подкрутить код - и ищи концы по проекту. А так - комментарий присутствует
|
|
|
|
|
Mar 28 2017, 11:19
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Baser @ Mar 28 2017, 14:14)  2. Как выше в примере - число реальное, а единицы измерений неизвестно какие (мкс, мс, сек ??) А через год нужно подкрутить код - и ищи концы по проекту. А так - комментарий присутствует  Дарю: #define _RTTPrsclr_15ms (480u) #define _RTT_30ms (2)// по _RTT_15ms_Tick #define _RTT_250ms (17)// по _RTT_15ms_Tick #define _RTT_300ms (20)// по _RTT_15ms_Tick PAUSE (_RTT_1500ms); Как показывает опыт, экономить на топтании клавы не стОит. (:
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Mar 29 2017, 04:54
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
есть такое...... хороший код в коментариях не нуждается. у Genadi Zawidowski скорее не комментарии, а референс мануал на его API. У Velund пустые, не нужные комментарии.... типа таких Код int a = 10; //создал переменную а, задал ей значение 10 Цитата(Baser @ Mar 28 2017, 15:14)  2. Как выше в примере - число реальное, а единицы измерений неизвестно какие (мкс, мс, сек ??) А через год нужно подкрутить код - и ищи концы по проекту. А так - комментарий присутствует  Для этого не нужны комментарии, нужны правильные имена. Код t2 = _SET_TIMEOUT_MS(100); GSMPower(0); - такой вызов без комментариев не очевиден GSMPower(OFF), GsmModemPowerOff() или GsmModemOff() не нуждается в комментариях. ps чужой код всегда плох. у каждого свой стиль, и только он true. Все остальное говнокод неправильное
|
|
|
|
|
Mar 29 2017, 06:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Шаманъ @ Mar 28 2017, 12:05)  Комментариев мало не бывает  И то правда. Порой не хочется читать код, а просто прочитать по-русски, что же тут хотели сделать. Бывает так, что комментарий верный, а вот в коде ошибка закралась.... Я, бывает, вначале комментариями пишу, что должно делаться, а потом уже эту последовательность последовательно превращааю в код. Так как когда код уже написан, и в текущий момент времени понят тобой на 120%, то необходимость в комментариях (особенно развернутых) в этот момент вообще никак не очевидна. Цитата(juvf @ Mar 29 2017, 09:54)  GSMPower(0); - такой вызов без комментариев не очевиден GSMPower(OFF), GsmModemPowerOff() или GsmModemOff() не нуждается в комментариях. ИМХО, правильнее комментирование целого куска: /* Выключаем модем правильно, см. ****pdf, 2.3.4 Power Down Cycle */ GSMPowerKey(1); Delay(2000); GSMPowerKey(1); Delay(8000); GSMPower(0);
|
|
|
|
|
Mar 29 2017, 07:36
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
"Я, бывает, вначале комментариями пишу, что должно делаться, а потом уже эту последовательность последовательно превращааю в код." Присоединяюсь…
"Так как когда код уже написан, и в текущий момент времени понят тобой на 120%, то необходимость в комментариях (особенно развернутых) в этот момент вообще никак не очевидна." ОтлОжите его (этот код) не менее чем на пол-годика, займётесь каким-нибудь перпендикулярным проектом и после, вернувшись, похвАлите себя за то, что не зажмотились в "…комментариях (особенно развернутых)…" Я гарантирую это (;
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Mar 29 2017, 08:26
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(juvf @ Mar 29 2017, 06:54)  У Velund пустые, не нужные комментарии.... типа таких Код int a = 10; //создал переменную а, задал ей значение 10 Согласен. Такие комментарии делают обратное - только ухудшают читаемость исходника, загромождая его. Цитата(Alechek @ Mar 29 2017, 08:29)  Порой не хочется читать код, а просто прочитать по-русски, что же тут хотели сделать. Бывает так, что комментарий верный, а вот в коде ошибка закралась.... А бывает и наоборот. Очень часто бывает (много раз сталкивался на практике), когда код написали вместе с комментами, а потом начали отлаживать-отлаживать-отлаживать. В результате код сильно изменился (до совершенно другого), а комменты каждый раз при отладке конечно лень менять. В результате получаем комменты не соответствующие коду, и наоборот - только вводящие в заблуждение. Поэтому я, например, при первоначальном написании, комменты почти не пишу. А пишу их только когда исходник более-менее устаканится и заработает как надо.
|
|
|
|
|
Mar 29 2017, 16:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(jcxz @ Mar 29 2017, 11:26)  Поэтому я, например, при первоначальном написании, комменты почти не пишу. А пишу их только когда исходник более-менее устаканится и заработает как надо. В свое время, чтобы не метаться между разными способами оформления кода, мне помогла соответствующая литература. Например, много лет назад, пригодилась эта: "Веревка достаточной длины, чтобы выстрелить себе в ногу", ее легко найти в гугле. Правда, помню, что с многими моментами я там был не очень согласен. Это мягко говоря ))) Но потом попалась в руки эта книжка: Мартин - "Чистый код". К тому моменту она была мне очень кстати - вычитал ее запоем всю до дыр  Кто уже плотно сидит на "плюсах" и тем более уже созрел строить полноценный объектный код, используя всю мощь "плюсов", вторую книжка будет очень полезна, по крайней мере мне она очень пригодилась. Благодаря этой книжке мне удалось составить собственную "конвенцию именования", очень лаконичную и простую, но при этом предельно однозначную, что значительно улучшило читаемость кода:
ps, Картинка не ради разведения очередного холивара, а, просто - вдруг кому-то пригодится ))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Mar 30 2017, 10:34
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(juvf @ Mar 30 2017, 12:39)  а мне помогла небольшая шпаргалка Прям с языка сняли!!!  Правда с некоторыми пунктами я не очень согласен, в частности с теми, которые имеют приписку "Это правило пришло из математики...". Предпочитаю математику (да и не только математику, но и другие дисциплины) с ее короткими и малоинформативными именами и именами в коде не смешивать, не путать "мух с колетами"  Скажем "скорость" называть не 'v', а как положено - velocity, т. е. в данных случаях сокращения, пришедшие из фундаментальных вековых дисциплин, могут сильно усложнить чтение кода. Дело в том, что в те далекие времена английский не был, можно сказать, "всемирным" языком, и потому чаще всего использовались лишь сокращения от латинских названий терминов, К тому же практически все писалось от руки. Но те времена уже давно прошли, поэтому я лично не вижу никакого смысла цепляться за них в коде. Например, вместо "i" использую переменную, носящую конкретный смысл для кода, где она используется: index, iterarator, value ..., составные: itemIndex, objectIterator и и т.п. Но в примитивных случаях (скажем, цикл из одной строки), "классическое i" вполне сгодится, иначе увеличивается сложность чтения кода. Для отладки полноценные имена (в том числи и счетчики циклов, итераторы и т. п.) тоже очень полезны - в окне watch переменные несут явный и однозначный смысл. Разумеется, при условии, что переменные и объекты названы правильно  Вообще, мне кажется, что самое сложный, но и самый полезный навык в программировании - умение правильно подбирать "сущностям" и "действиям" однозначные и лаконичные имена ....
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 1 2017, 09:25
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Alechek @ Apr 1 2017, 09:37)  Если уж пошла такая пьянка по поводу стилей, то при переходе на C++ я решил придерживаться А почему лишь C++? Я вот использую единые принципы именования и структурирования не только в С/С++ коде, но и в других языках, средах, CAD-ах и т. п. Например, очень удобно писать код для МК, если цепи на схеме (AD) названы таким образом, что позволяет в коде использовать точно такие же имена для пинов.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 1 2017, 16:24
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(jcxz @ Mar 29 2017, 11:26)  Очень часто бывает (много раз сталкивался на практике), когда код написали вместе с комментами, а потом начали отлаживать-отлаживать-отлаживать. В результате код сильно изменился (до совершенно другого), а комменты каждый раз при отладке конечно лень менять. В результате получаем комменты не соответствующие коду, и наоборот - только вводящие в заблуждение. Очень, очень массовое явление  . Особенно убивает, когда комментарий провильный, а то, что в исходнике с ошибкой. Цитата Поэтому я, например, при первоначальном написании, комменты почти не пишу. А пишу их только когда исходник более-менее устаканится и заработает как надо. Именно так. Причем такое комментирование прекрасно совмещается с общей вычиткой и оптимизацией исходника.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 3 2017, 09:06
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Aaron @ Apr 3 2017, 11:55)  Как раз сейчас разродился наконец оформить требования к стилю кодирования в своём отделе, уже написал почти Я для своего отдела тоже задавался подобной целью, курил интернеты, читал соотв. книжки, но не прижилось в том виде, как я хотел. Полагаю, что причина в том, что каждый работник тянет свои проекты в одиночку. Проекты относительно небольшие, команда не требуется. Поэтому каждый "ваяет" как пожелает. Главное - положительный результат на выходе )))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 3 2017, 10:34
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(Kabdim @ Apr 3 2017, 14:41)  +1 за гугльстайл. Самый вменяемый стайлгайд на данный момент. Цитата string table_name; // OK - uses underscore. string tablename; // OK - all lowercase.
string tableName; // Bad - mixed case. где уж самый вменяемый? tableName - читабельно. table_name - читабельно. tablename - не читабельно. tableName - такой стиль часто встречал. Например Qt так написан. Например переменная bool QGuiApplication::quitOnLastWindowClosed, в гуглсайле будет так quitonlastwindowclosed - это плохо читаемо. имхо.
|
|
|
|
|
Apr 3 2017, 12:58
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(juvf @ Apr 3 2017, 13:34)  tablename - не читабельно Как по мне так вполне читабельно, особенно если это не просто два слова, а постоянно используемые в такой связке два слова. Рекомендаций называть переменную предложением, а потом записывать её имя без подчеркиваний там нет. А по поводу вашего примера: bool QGuiApplication::quitOnLastWindowClosed - не переменная, а property. В гугльстайле вы модификаторы property можете называть как переменную, но это не требуется. Т.е. когда имя property - предложение, очевидно её удобней называть Camal case'ом, что стайл вполне позволяет.
|
|
|
|
|
Apr 3 2017, 13:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Kabdim @ Apr 3 2017, 15:58)  Как по мне так вполне читабельно, особенно если это не просто два слова, а постоянно используемые в такой связке два слова. Полагаю, что если жить только с гуглекодом и изучать/пользовать/читать только гуглепроеты с утра до вечера, то постепенно привыкаешь и подсаживаешься Однако, если пройдет какое-то время (перерыв), то придется заново вкуривать в этот код, потратив некоторое время на повторное привыкание. Существуют книги, написанные так, что читаются на одном дыхании - как бежишь под ровной дороге, но попадаются такие, что "спотыкаешься" на каждом слове, словно бежишь через непролазный лес. Гуглестиль, имхо, больше относится ко второму, нежели к первому )))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 3 2017, 13:51
|

Местный
  
Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007

|
К чему холивар, Kabdim? Главное не инструмент (коих много), а цель - достичь переносимости и поддерживаемости кода в команде. Если тебе инструмент не подходит - ты берёшь другой, или делаешь удобный, под себя. Цитата А вот придумывать своё в 17 году - это жесть, ей богу. В чём именно жесть? Скомпилировать несколько трудов, взять из них лучшее, вычеркнуть неудачное и лишнее, скомпоновать - это здорово! Между прочим, разработчики крупных проектов не стесняются внедрять свои собственные правила, поищите JPL C Coding Standard, CERN C++ Coding Standard ГуглоСтайл как по мне, не совсем торт. Аналогично как и КьютСтайл. Выше уже высказались.
|
|
|
|
|
Apr 3 2017, 15:51
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(Forger @ Apr 3 2017, 18:44)  Затраты на переучивание? Не смешите ))) Если программер не умеет читать чужой код, то его бесполезно переучивать Выходит codestyle вообще не нужен? Цитата(Forger @ Apr 3 2017, 18:44)  Дело тут в другом - крайне затратно вынуждать опытного программиста писать и отлаживать свой код в стиле чужого кривого кода, к тому же далеко не каждый профи на это подпишется. Не понял, вы другими словами повторил то что я сказал, но при этом возразили.
|
|
|
|
|
Apr 3 2017, 15:58
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Kabdim @ Apr 3 2017, 18:51)  Выходит codestyle вообще не нужен? Конечно, дисциплина в коде и документации нужна! Но только в том случае, если она ориентирована под максимальное кол-во народу, а не под уникальных мега-ботанов, которые сходу способны читать такие названия правильно: Код quitonlastwindowclosed Цитата Не понял, вы другими словами повторил то что я сказал, но при этом возразили.  Повторюсь: "крайне затратно вынуждать опытного программиста писать и отлаживать свой код в стиле чужого кривого кода". Под словом "кривой" я подразумеваю код, реализованный в "кривом" стиле, который выдуман "с потолка", в стиле "изобретаем велосипед".
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 3 2017, 16:00
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(Forger @ Apr 3 2017, 18:58)  Нужен, если он создан под максимальное кол-во народу, а не под уникальных мега-ботанов  Согласен, уже говорил что множество публичных стандартов позволяет выбирать на свой вкус. Цитата(Forger @ Apr 3 2017, 18:58)  Повторюсь: "крайне затратно вынуждать опытного программиста писать и отлаживать свой код в стиле чужого кривого кода". Под словом "кривой" я подразумеваю код, реализованный в "кривом" стиле, который выдуман "с потолка", в стиле "изобретаем велосипед". Чем публичней и распространенней стандарт тем меньше он кривой? И наоборот чем уже сфера пользователей тем он как минимум шероховатый.
|
|
|
|
|
Apr 3 2017, 16:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Kabdim @ Apr 3 2017, 19:00)  Чем публичней и распространенней стандарт тем меньше он кривой? И наоборот чем уже сфера пользователей тем он как минимум шероховатый. Все так, это - эволюция (извиняюсь за громкое слово). Кривой стиль и соответственно говно-код не способны эволюционировать нормально. Но нужно отличать коммерциолизированный стандарт (скажем, гугльстайл) и обычный - "бесплатный", который можно почерпнуть из книжек. Бесплатный эволюционирует эффективнее, он гибче и потому жизнеспособнее, нежели платный () Но это все же пустая дискуссия, все одно каждый останется при своем мнении и при своем стиле
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 4 2017, 05:31
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(Kabdim @ Apr 3 2017, 17:58)  А по поводу вашего примера: bool QGuiApplication::quitOnLastWindowClosed - не переменная, а property. А проперти - это не переменная? в с++ вообще нет проперти. проперти - это уже смысловое значение переменной или константы. Код Q_PROPERTY([b]bool quitOnLastWindowClosed[/b] READ quitOnLastWindowClosed WRITE setQuitOnLastWindowClosed) вижу тип переменной bool, имя переменной quitOnLastWindowClosed. может в с++ появилось что-то новое, появились проперти.... заглянул в ассистант, глянул что такое PROPERTY Код Q_PROPERTY(type name..... ан нет... тип и имя переменной. без разницы в каком стеле написано.... главное чтобы всем было понятно.... конечно в чужом стиле - непривычно, и лучше вырабатать стиль максимально приближенный к самым распространённым. моя шпаргалка и тут книжки выкладывали - приближены. что касается гуглстайла.... не разу не встречал его. камел кэйс используется во многих стилях. я глянул по диагонали гуглстайл.... нашел в гугл стайле то, что явно будет ухудшать чтение кода, а именно переменные quitonlastwindowclosed. есть там ещё, что, что будет мешать... не то к чему я не привык, а что будет мешать. я не привык к именам quit_on_last_window_closed, но это дела вкуса и привычки. такая переменная нормально читается. а вот quitonlastwindowclosed - это мешает. и не только мне не понравился гугл стайл. ps в довершении.... в QtCreator, и позже в Eclipse, есть автодополнение по камел кейсу. назвал переменную quitOnLastWindowClosed, в коде набираешь qol (или qOL) автодополнение предлагает все переменные начинающиеся на q и имеющие в имени большие буквы O и L. в итоге будет предложены все переменные и методы... с вероятностью в 100% будет предложена переменная quitOnLastWindowClosed (или достаточно будет набрать qO). у QString набираешь tss - автодополнение делает toStdString. Набираешь gp - выдает getPoint и getPosition. tn - выскочит tableName Т.е. камел кэйс дает подсказку для автодополнения. Это очень удобно в написании.
|
|
|
|
|
Apr 4 2017, 07:22
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(Forger @ Apr 3 2017, 19:04)  Но это все же пустая дискуссия, все одно каждый останется при своем мнении и при своем стиле  Мнение, то у нас общее - стиль нужен, а вот вкусы и правда различаются.  Цитата(juvf @ Apr 4 2017, 08:31)  А проперти - это не переменная? Нет, у проперти может вообще не быть представления в виде закрытой переменной. Цитата(juvf @ Apr 4 2017, 08:31)  в с++ вообще нет проперти. А в QT из которого выдран пример - есть. Цитата(juvf @ Apr 4 2017, 08:31)  без разницы в каком стеле написано.... главное чтобы всем было понятно.... Тут я с вами безусловно согласен. Цитата(juvf @ Apr 4 2017, 08:31)  и не только мне не понравился гугл стайл. ps в довершении.... в QtCreator, и позже в Eclipse, есть автодополнение по камел кейсу. назвал переменную quitOnLastWindowClosed, в коде набираешь qol (или qOL) автодополнение предлагает все переменные начинающиеся на q и имеющие в имени большие буквы O и L. в итоге будет предложены все переменные и методы... с вероятностью в 100% будет предложена переменная quitOnLastWindowClosed (или достаточно будет набрать qO). у QString набираешь tss - автодополнение делает toStdString. Набираешь gp - выдает getPoint и getPosition. tn - выскочит tableName Т.е. камел кэйс дает подсказку для автодополнения. Это очень удобно в написании. Тут тоже частично соглашусь, но это всё же особенности конкретного автодополнения, он мог бы точно так поступать и с разделением подчеркиваниями.
|
|
|
|
|
Apr 4 2017, 08:54
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Forger @ Apr 3 2017, 19:04)  Но это все же пустая дискуссия, все одно каждый останется при своем мнении и при своем стиле  Ну отчего же "останется". Лично у меня за годы стиль менялся под влияним писанного и читанного. При этом догмы в общем нет. Есть обшие тяготения, например, имена функций все явно больше маленькими буквами без разделителей, если это не группа функций. Переменные напротив все с подчеркиваними, поскольку очень люблю структуры, а для структур разделители явяются естественными. Соответственно и просто переменные смотрятся на таком фоне гармоничнее с подчеркиваниями. Заглавные буквы когда то использовал в именах струкур, но перестал за в общем то ненадобностью. Константы и константные выражения, само собой заглавными. Макросы когда то давно тоже именовал заглавными, но перестал за ненадобностью. Не терплю органически "венгерского" стиля именования. В остальном в общем всеяден. Только трепертно отношусь к фоматировнию - любой чужой исходник с которым предстоит работать перегоняется для начала в удобный для себя формат.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 4 2017, 08:56
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(juvf @ Apr 4 2017, 11:25)  я говорю что слитно не удобно Кмк эта возможность писать слитно слишком слишком демонизируется. Этот вариант написания один из возможных, т.е. программист может выбрать его там где он будет уместен. Например isalpha, в качестве локальной переменной - почему бы и нет. А в тех местах где это не уместно предлагаются подчеркивания.
|
|
|
|
|
Apr 4 2017, 09:20
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(zltigo @ Apr 4 2017, 11:54)  При этом догмы в общем нет. Есть обшие тяготения, например, имена функций все явно больше маленькими буквами без разделителей, если это не группа функций. Переменные напротив все с подчеркиваними, поскольку очень люблю структуры, а для структур разделители явяются естественными. Соответственно и просто переменные смотрятся на таком фоне гармоничнее с подчеркиваниями. Заглавные буквы когда то использовал в именах струкур, но перестал за в общем то ненадобностью. Константы и константные выражения, само собой заглавными. Макросы когда то давно тоже именовал заглавными, но перестал за ненадобностью. А я в свое время отказался от такого кол-ва правил и упростил все до минимума, как в книжке Мартина "Чистый код" - не люблю кучу лишних правил, их тогда приходится всегда держать в голове. А особенно это напрягает при переписывании кода - скажем, структура переросла в класс, глобальная переменная стала локальной, поле класса стало локальной переменной, константа перестала быть таковой и наоборот. Короче, прошел через это, поплевался и удалил кучу лишних правил. После этого все стало значительно проще. Читаемость кода не пострадала, а даже наоборот - считаю лишним "кодировать" в названии объекта его принадлежность к определенной "рассе", другие нынче времена  Насчет макросов тут я не буду спорить, скорее всего сам уйду на именование макросов, как обычных методов классов (функций), т. к. любой макрос может стать функцией и наоборот. А вот замены "магических" чисел сознательно делаю большими буквами, пока что мне кажется, что это улучшает читаемость кода. Впрочем, время покажет ))) Я тоже "эволюционирую" ))) Цитата Не терплю органически "венгерского" стиля именования. В остальном в общем всеяден. Аналогично! До тошнотиков не выношу, когда в название переменной с какого-то перепугу вносят ее "рассовую" принадлежность Абсолютно убежден, что оооочень значительно ухудшает читаемость кода - приходится при изменении типа этой переменной ВЕЗДЕ менять ее название - "мартышкин" труд, иначе не назовешь )) Цитата Только трепертно отношусь к фоматировнию - любой чужой исходник с которым предстоит работать перегоняется для начала в удобный для себя формат. Абсолютно солидарен! Чистым кодом пользоваться гораздо приятнее )))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 4 2017, 10:28
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Kabdim @ Apr 4 2017, 11:56)  Кмк эта возможность писать слитно слишком слишком демонизируется. Этот вариант написания один из возможных, т.е. программист может выбрать его там где он будет уместен. Например isalpha, в качестве локальной переменной - почему бы и нет. А потому что в английском язые нет слова "isalpha", а есть два слова Is или Alpha, поэтому логичнее изменить на "isAlpha", is_alpha или IsAlpha. Английский Язык Предусматривает Написание Каждого Слова Предложения Заглавными Буквами, а русский - нет. Поэтому логично предположить, что и все правила английского языка распространяются на код, на котором он написан. Цитата А в тех местах где это не уместно предлагаются подчеркивания. Я раньше применял такое правил, но отказался - глаз спотыкается об эти подчеркивания, а пользы я не нашел. К тому же как только переменная меняет области видимости (локальная - глобальная - поле класса), ее ВЕЗДЕ приходится переименовывать. Какой в этом смысл? Зачем в название переменной вносить область ее видимости? Мне кажется более логичным создать ее экземпляр непосредственно перед тем местом, где она используется (в стеке). В С++ такое возмоно, но не в С. Например: Код for (int index = 0; ....) { ... } Если в коде опять будет цикл, можно создать переменную с точно таким же именем, но это будет совсем ДРУГАЯ переменная, что заставляет узко локализовать область использования временных (локальных) переменных, а не раскидывать их по всему коду функции, особенно, если она вся не влазит на экран. Хотя я стараюсь минимизировать число локальных переменных и главное - дробить огромные функции. Цитата(Aaron @ Apr 4 2017, 12:30)  очевидно же - у класса есть конструкторы/деструкторы и private/protected области видимости =) В структуре все поля, если не указано public/private/protected, являются по-умолчанию public, а в классе - private. Это - единственное отличие между структурой и классом. В остальном они отличаются лишь названием  Цитата(jcxz @ Apr 4 2017, 12:23)  Это как это?  Структура у меня используется лишь как структурированное хранилище данных (часто упакованы с соотв. атрибутами типа packed), т.е. ТОЛЬКО ПОЛЯ, а класс - уже что-умеет делать сам, т.е. у его есть еще и МЕТОДЫ. Я делю их между собой именно так, хотя прекрасно знаю, чем они отличаются на самом деле (см. выше). Структур (struct) в коде у меня очень мало и почти все они имеют крайне локализованный характер, т. е. обладают очень узкой областью видимости. Насколько это возможно. На самом деле, я немного слукавил, приведя в пример возможность структуры стать классом )) Обычно, это происходит не так явно - просто, резко сужается область видимости структуры и она попадает лишь внутрь соотв. класса. Небольшое дополнение насчет макросов и замен "магических" чисел. Поскольку в коде у меня нигде нет глобальных объектов, ни одного, то это создает некоторые сложности с отказом от моего правила - макросов и замен "магических" чисел - БОЛЬШИМИ_БУКВАМИ_С_ПОДЧЕРКИВАЕНИЕМ. Т. е. в моем случае такие "дефайны" имеют исключительно глобальный смысл и каждый объектный модуль при желании может их использовать. Таким образом получается, что я как бы намекаю (сам себе, разумеется), что речь идет не об объектах, а лишь заменах (дефайнах), которые при компиляции (после препроцессора) станую обычными числами и выражениями. Поэтому сильно сомневаюсь, что макросы и замены буду именовать иначе, чем так, как сейчас ))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 4 2017, 11:25
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(Forger @ Apr 4 2017, 13:28)  В С++ такое возмоно, но не в С. Например: Код for (int index = 0; ....) { ... } Вы про C99 не слышали? Цитата(Forger @ Apr 4 2017, 13:28)  можно создать переменную с точно таким же именем Вы уверены что это можно назвать хорошим стилем?  Цитата(Forger @ Apr 4 2017, 13:28)  Структура у меня используется лишь как структурированное хранилище данных (часто упакованы с соотв. атрибутами типа packed), т.е. ТОЛЬКО ПОЛЯ, Это называется plain old data (POD)
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|