Как стать автором
Обновить
9
0
Алексей @boolivar

Пользователь

Отправить сообщение
На самом деле, во всей статье упущена одна важная вещь: spi это дуплексный интерфейс — взамен отправленного байта вы получаете байт на чтение. Отсюда вопрос: когда читать данные если использовать второй вариант?
Что значит ровно одну? Даже одна работать не будет:
chipSelect();
writeSPI(0x0a);
writeSPI(0x0b);
writeSPI(0x0c);
chipUnselect();

При использовании второй реализации, 0x0c в устройство записан не будет — кого винить?
Я люблю когда мои программы простые, поэтому я хочу чтобы мой код выглядел примерно так:
chipSelect();
writeSPI(0x0a);
chipUnselect();

однако, если использовать второй вариант, мне придется явно добавлять ожидание, в лучшем случае так:
chipSelect();
writeSPI(0x0a);
waitReadySpi();
chipUnselect();
Эти настройки точности больше для того, чтобы результаты не были точнее чем вы сами того ожидали, проверяя на вычислениях ограниченной точности (взято отсюда 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).
Однако, вы можете реализовать все операции самостоятельно, с любой точностью, какой пожелаете, ограничиваясь объемом памяти кристалла, конечно же.
x87 все вычисления производит в 80-битном расширенном формате, и для double и для float
А, простите, я не хотел ввязываться в спор как решить проблемы которые будут если выходить из прерываний инструкцией ret. Внутри прерывания может быть сколько угодно инструкций ret/cli/sei, это допустимо, окончанием обработки прерывания является команда reti и она устанавливает флаг I в sreg, таким образом восстанавливает контекст, который был до прерывания, это распространяется и на вложенные прерывания: раз мы попали в прерывание — значит они были включены, не важно где мы были до этого, в контексте приложения или в контексте прерывания.
Пока вы не вызвали reti вы все ещё в прерывании.
О чем тогда спор то? Оставляете sreg таким каким он был до прерывания и проблем нет. Содержимое восстанавливаете вручную, а I флаг восстановит инcтрукция reti. Начинаете выходить из прерываний инструкцией ret — получите проблемы.
Для выхода из прерывания используется reti. Иначе вы выйдете из прерывания с sreg отличным от того, каким он был до прерывания.
Вы о каком бите, простите? Я про весь регистр sreg целиком говорю, иначе просто ничего работать не будет.
Все безопасно в отключении прерываний: между чтением sreg и вызовом cli вполне может произойти прерывание, но прерывания должны оставлять sreg неизменным перед возвратом, хоть этим и должен озаботиться программист.
Есть настоящая vm: www.harbaum.org/till/nanovm/index.shtml
Сама во flash памяти размещается, java байт код из eeprom исполняет
Была уже подобная разработка: habrahabr.ru/post/248147
Пример бы, да пару слов о назначении, вроде к 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:
if (tty->buf.head == NULL)
	return;
Я вижу голубой с золотым
1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Калуга, Калужская обл., Россия
Дата рождения
Зарегистрирован
Активность