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

Как писать хороший код

Коллеги, допустимо ли использовать функции таким образом?

Объявлена функция:

 

// Передаёт и принимает 1 байт по SPI, возвращает полученное значение

uint8_t spi_send_recv(uint8_t data) {

SPDR = data;

while (!(SPSR & (1 << SPIF)));

return SPDR;

}

 

а используется без возврата значения:

 

// Записывает значение однобайтового регистра reg (от 0 до 31), возвращает регистр статуса

uint8_t radio_writereg(uint8_t reg, uint8_t val) {

csn_assert();

uint8_t status = spi_send_recv((reg & 31) | W_REGISTER);

spi_send_recv(val);

csn_deassert();

return status;

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


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

допустимо ли
Да. Что вас смущает? И что мешает попробовать откомпилить?

 

P.S. printf() тоже значение возвращает, но не попадалось ни одного примера, где это значение использовалось бы.

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


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

Да. Что вас смущает? И что мешает попробовать откомпилить?

 

До компиляции ещё далеко, я только изучаю, как это делается. Использование функций таким образом встречаю впервые...

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


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

Использование функций таким образом встречаю впервые...

Этого не может быть, если только это не вообще первая функция, которую Вы увидели :)

 

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


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

Этого не может быть, если только это не вообще первая функция, которую Вы увидели :)

 

Си начал использовать с 2010 года, осваиваю самостоятельно но честное слово, такое использование функций не встречал. С самого начала учился по учебнику Бредли Л.Джонса и Питера Эйткена, там всё "жёстко", такой вольности нет. И всё же интересно, куда "улетает" возвращаемое значение функции которое не ждут?

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


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

Си начал использовать с 2010 года, осваиваю самостоятельно но честное слово, такое использование функций не встречал. С самого начала учился по учебнику Бредли Л.Джонса и Питера Эйткена, там всё "жёстко", такой вольности нет. И всё же интересно, куда "улетает" возвращаемое значение функции которое не ждут?

Никуда не улетает. Возвращаемое значение в регистре находится. Хочешь пользуй, хочешь нет. В случае функции "ничего" не возвращающей, там наверняка мусор, а так некоторое определенное значение. Вот и вся разница :)

 

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


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

Никуда не улетает. Возвращаемое значение в регистре находится. Хочешь пользуй, хочешь нет. В случае функции "ничего" не возвращающей, там наверняка мусор, а так некоторое определенное значение. Вот и вся разница :)

 

Спасибо за разъяснение, буду использовать эту возможность.

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


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

До компиляции ещё далеко, я только изучаю, как это делается. Использование функций таким образом встречаю впервые...

 

Я тоже, честно говоря.

Обычно явно задают некую переменную куда читают из SPI.

 

Иначе оптимизатор может выкинуть операцию чтения и будете неделями искать откуда в SPI лишние данные берутся.

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


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

Господи, обычный side effect.. железячники одни собрались что ли?

 

Я тоже, честно говоря.

Обычно явно задают некую переменную куда читают из SPI.

 

Иначе оптимизатор может выкинуть операцию чтения и будете неделями искать откуда в SPI лишние данные берутся.

Неиспользуемую дальше переменную он выкинет куда быстрее. Тут он ничего не выкинет, все регистры объявлены volatile , реже прагмами

И тут даже к стилю не придраться, в названии все сказано, так более чем можно писать. Даже нужно по смыслу, чтение спи это всегда запись, дажее если запись не имеет смысла. А две отдельные функции тут будут источником глюков, особенно если юнит тест на одной. Разве что можно рид сделать оберткой send_recv

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


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

Иначе оптимизатор может выкинуть операцию чтения и будете неделями искать откуда в SPI лишние данные берутся.

Невежество :(. Ни при каких обстоятельсвах обращение volatilе переменной не может быть выброшено.

Обычно явно задают некую переменную куда читают из SPI.

Даже просто прочитать в никуда можно и нужно, так:

SPDR;

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


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

Вы наконец то стали говорить вещи с которыми я согласен :)

Или я стал мыслить иначе :bb-offtopic:

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


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

Вы наконец то стали говорить вещи с которыми я согласен :)

Или я стал мыслить иначе :bb-offtopic:

 

Ладно, ради такой дружбы признаю свою ошибку. Юзайте volatile и будьте счастливы! :biggrin:

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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