Feature/recomendations from google doc#84
Conversation
|
|
||
| Часто бывает что устройство имеет несколько входов/выходов/шин/светодиодов/кнопок итд, абсолютно всегда все что потенциально может быть больше чем в одном экземпляре должно обрабатываться через индексы и циклы. | ||
|
|
||
| Плохой пример: |
There was a problem hiding this comment.
Файлик называется embedded_c.en.md, а контент на русском.
|
|
||
| Например вместо: | ||
| ```C | ||
| void input_handler(unsigned input) { |
There was a problem hiding this comment.
Мне кажется, пример неудачный. Надо что-то посложнее. Тут я вижу из плюсов только то, что код быстрее на микросекунду будет работать, а из минусов: надо проверять индекс на выход на пределы массива; если искать функции просто поиском, они нигде не вызываются, а только лежат в каком-то массиве, который ещё надо понять как работает; ну и скорее всего придется делать обертки, т.к. вряд ли окажется, что все обработчики одного типа.
В общем, имхо в самом switch-case нет ничего плохого. И он много где используется у нас. Надо подобрать более подходящий пример, где его лучше не использовать
|
|
||
| Лушче написать так: | ||
| ```C | ||
| #define INPUTS_NUMBER 2 |
There was a problem hiding this comment.
В принципе можно и без этого обойтись, а использовать ARRAY_SIZE
|
|
||
| # Переиспользование | ||
| Нужно использовать код повторно. Не нужно писать код если он уже написан. Если чтото существующее подходит не нужно делать чтото новое. | ||
| Чтобы не оставлять ошибки в дубликатах, экономить силы программиста и прочее. Читать подробнее в [Википедии](https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D0%BE%D0%B5_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%B4%D0%B0). |
There was a problem hiding this comment.
Может юникодную ссылку вставить?
|
|
||
|
|
||
| # Поллинг | ||
| Не должно быть периодически вызываемых функций с проверкой флагов. Поллинг это плохо. Тратится процессорное время и память для флагов которые проверяются. Также не понятно кто этот флаг ставит, кто его проверяет. |
There was a problem hiding this comment.
Ну тоже не согласен. Вот в WBIO поллинг. Написано категорично, переделываем? А отказаться от поллинга не всегда возможно.
Тратится процессорное время и память - тоже так себе аргумент, зачем они нужны, если их не тратить?
There was a problem hiding this comment.
было бы лучше если бы WBIO был написан асинхронно. если бы входы генерили прерывания и поддерживали консистентность данных в карте регистров, которые ты забирал бы в обработчике i2c не опрашивая ноги. видно что в этом потенциальная проблема. выходы пришлось выносить в бэкграунд а со входами ты так не сможешь.
архитектура без поллинга всегда лучше. то что мы используем поллинг это наши привычки и лень.
| Не должно быть периодически вызываемых функций с проверкой флагов. Поллинг это плохо. Тратится процессорное время и память для флагов которые проверяются. Также не понятно кто этот флаг ставит, кто его проверяет. | ||
|
|
||
| У любого кода есть причина выполнения, вот в обработке причины и нужно вызывать выполнение кода, или запланировать его выполнение. | ||
| Используйте инструменты организации кода - корутины и таймменеджер. В прерываниях планируйте задачу с обработкой в бэкграунде. Не используйте флаги. |
There was a problem hiding this comment.
Ну сам таймменеджер внутри флаги поллит же
|
|
||
| # Не пишите лишний код, не выполняйте не нужные действия в коде | ||
| Пример: если файл с настройками не найден, прошивка использует дефолтные настройки. Не нужно сохранять файл с дефолтными настройками. Файл нужно записывать только если пользователь чтото поменял. | ||
| Чтение файла с дефолтными настройками ничем не отличается от отсутствия файла. По этому можно избавиться от лишней операции записи, расхода места иизноса флеш памяти, кода который эту запись делает. |
There was a problem hiding this comment.
| Чтение файла с дефолтными настройками ничем не отличается от отсутствия файла. По этому можно избавиться от лишней операции записи, расхода места иизноса флеш памяти, кода который эту запись делает. | |
| Чтение файла с дефолтными настройками ничем не отличается от отсутствия файла. Поэтому, можно избавиться от лишней операции записи, расхода места и износа флеш памяти, кода который эту запись делает. |
pgasheev
left a comment
There was a problem hiding this comment.
Плюс попросить copilot исправить орфографию и пунктуацию
|
|
||
| В таком виде трудно вносить изменения, легко допустить ошибку, поправить одно и забыть другое. | ||
|
|
||
| Лушче написать так: |
There was a problem hiding this comment.
| Лушче написать так: | |
| Лучше написать так: |
| ... | ||
|
|
||
| gpio_init(INPUT_1); | ||
| gpio_init(INPUT_2); |
There was a problem hiding this comment.
А зачем тут отступы? Думаю не нужны
| #define MODBUS_USART_HW { \ | ||
| .usart = USART1, \ | ||
| .irqn = USART1_IRQn, \ | ||
| .dma_tx_ch = DMA1_Channel2 \ | ||
| } |
There was a problem hiding this comment.
| #define MODBUS_USART_HW { \ | |
| .usart = USART1, \ | |
| .irqn = USART1_IRQn, \ | |
| .dma_tx_ch = DMA1_Channel2 \ | |
| } | |
| #define MODBUS_USART_HW \ | |
| { \ | |
| .usart = USART1, \ | |
| .irqn = USART1_IRQn, \ | |
| .dma_tx_ch = DMA1_Channel2 \ | |
| } |
Вроде получше выглядит
| Пример: если файл с настройками не найден, прошивка использует дефолтные настройки. Не нужно сохранять файл с дефолтными настройками. Файл нужно записывать только если пользователь чтото поменял. | ||
| Чтение файла с дефолтными настройками ничем не отличается от отсутствия файла. Поэтому, можно избавиться от лишней операции записи, расхода места и износа флеш памяти, кода который эту запись делает. | ||
|
|
||
| # Не нужно делать в run time все что можно сделать в compile time |
There was a problem hiding this comment.
Это точно всё заголовки первого уровня? Думаю надо подальше задвинуть
No description provided.