На самом деле, во всей статье упущена одна важная вещь: spi это дуплексный интерфейс — взамен отправленного байта вы получаете байт на чтение. Отсюда вопрос: когда читать данные если использовать второй вариант?
Эти настройки точности больше для того, чтобы результаты не были точнее чем вы сами того ожидали, проверяя на вычислениях ограниченной точности (взято отсюда https://en.wikipedia.org/wiki/X87#Description):
As this may sometimes be problematic for some semi-numerical calculations written to assume double precision for correct operation, to avoid such problems, the x87 can be configured via a special configuration/status register to automatically round to single or double precision after each operation
Когда вы работаете на сопроцессоре, вы накапливаете результат в одном регистре расширенной точности, другие вам для этого не нужны.
Как можно ошибиться при умножении? Вы о чем вообще? Команда FMUL предназначена для операций с фиксированной запятой она сдвигает результат влево чтобы запятая результата оказалась на том же месте, что и у входных аргументов.
Это значит, что если попытаться с её помощью перемножить два целых числа вы получите число в два раза большее чем ожидали.
Простите, но при чем тут AVR? Да, там нет сопроцессора, поэтому все операции с плавающей запятой производятся программно, это может сделать сам компилятор или использовать библиотечные реализации (http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_math).
Однако, вы можете реализовать все операции самостоятельно, с любой точностью, какой пожелаете, ограничиваясь объемом памяти кристалла, конечно же.
А, простите, я не хотел ввязываться в спор как решить проблемы которые будут если выходить из прерываний инструкцией ret. Внутри прерывания может быть сколько угодно инструкций ret/cli/sei, это допустимо, окончанием обработки прерывания является команда reti и она устанавливает флаг I в sreg, таким образом восстанавливает контекст, который был до прерывания, это распространяется и на вложенные прерывания: раз мы попали в прерывание — значит они были включены, не важно где мы были до этого, в контексте приложения или в контексте прерывания.
Пока вы не вызвали reti вы все ещё в прерывании.
О чем тогда спор то? Оставляете sreg таким каким он был до прерывания и проблем нет. Содержимое восстанавливаете вручную, а I флаг восстановит инcтрукция reti. Начинаете выходить из прерываний инструкцией ret — получите проблемы.
Все безопасно в отключении прерываний: между чтением sreg и вызовом cli вполне может произойти прерывание, но прерывания должны оставлять sreg неизменным перед возвратом, хоть этим и должен озаботиться программист.
Пример бы, да пару слов о назначении, вроде к const из не-const типы приводятся автоматически, это и в примере видно: неконстантные ссылки передаются в функцию требующую константные ссылки.
Про добавление/удаление volatile вообще не слышал.
Да не нужно хранить пары, достаточно завести radix массив размером radix+1 (11 в случае десятичных чисел) и при подсчете адресоваться к элементам idx[i+1], idx[0] не трогать. Затем сделать дополнительный проход по radix массиву, в котором в элементы записать сумму текущего и предыдущего элемента: idx[i] = idx[i] + idx[i-1] (idx[0] остается равным 0). Таким образом, в radix массиве будут индексы, по которым следует писать в вспомогательный массив. В итоге, делая проход по исходному массиву, адресуясь по элементам radix массива и инкрементируя их, можно заполнить вспомогательный массив.
Если я правильно понял, список теперь просто сокращается до 1 блока, вместо того чтобы удалять его полностью и устанавливать указатель в NULL.
Тогда непонятно, зачем проверка на NULL:
При использовании второй реализации, 0x0c в устройство записан не будет — кого винить?
однако, если использовать второй вариант, мне придется явно добавлять ожидание, в лучшем случае так:
Когда вы работаете на сопроцессоре, вы накапливаете результат в одном регистре расширенной точности, другие вам для этого не нужны.
Это значит, что если попытаться с её помощью перемножить два целых числа вы получите число в два раза большее чем ожидали.
Однако, вы можете реализовать все операции самостоятельно, с любой точностью, какой пожелаете, ограничиваясь объемом памяти кристалла, конечно же.
Пока вы не вызвали reti вы все ещё в прерывании.
Сама во flash памяти размещается, java байт код из eeprom исполняет
Про добавление/удаление volatile вообще не слышал.
Тогда непонятно, зачем проверка на NULL: