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

Язык СИ для микроконтроллеров


Рекомендуемые сообщения

Только что, my504 сказал:

В чем состоит пример? В каком то синтаксисе?

Это смешно. Кто короче запишет некую программную сущность - тот и молодец?

Хрень какая то...

С одной стороны декларируется, что нужно заботится о читабельности кода, а с другой ТОТ ЖЕ САМЫЙ ЧЕЛОВЕК  виртуозно строчит код, который напоминает головоломки из журналов Квант. Нахрена?  Чтобы тут же завалить код комментами?

:lol:

Я бы все таки разделял, действительно головоломки и обоснованное использование достаточно хитрых конструкций, 

Я, например, последнее время, не люблю (задолбали тут намедни:) конструкции типа:

something = trramfwId < 0 ? something1 : something2;

Но я бы не стал говорить, что это использовать нельзя никогда. Хотя я скорее не буду. А к логике в арифметике я, например, настолько привык, что она меня никак не напрягает, потому что с оптимизацией очень много занимался, вплоть до ассемблера.

Давайте остановимся тогда на том что стиль кодирования субъективная штука.

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Только что, my504 сказал:

И потом нужно разбираться в последствиях...

Рискну предположить, что как раз-таки из-за вот такого подхода

 

Только что, my504 сказал:

Мне совершенно фиолетово и параллельно что написано в стандарте на язык Си

и возникает необходимость разбираться с последствиями. А уж когда горе-писатели передают свой код "на доделку" или "проверку", так вообще рыдать хочется.

А ведь простое знание и соблюдение (и применение) стандарта может заметно облегчить все аспекты программирования...

Только что, ruhi сказал:

Я, например, последнее время, не люблю (задолбали тут намедни:) конструкции типа:

something = trramfwId < 0 ? something1 : something2;

Проблема в том, с моей точки зрения, что очень многие рассматривают оператор ? как некий эквивалент оператора if. Но ведь между ними большая разница: оператор if  не возвращает результата, а оператор ? возвращает. И эта особенность позволяет писать очень аккуратно-компактные программы. Сравните сами:

if(good)
  printf("Это %s", "хорошо");
else
  printf("Это %s", "плохо");

// или

printf("Это %s", good ? "хорошо" : "плохо");

 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

47 минут назад, ARV сказал:

Рискну предположить, что как раз-таки из-за вот такого подхода

 

и возникает необходимость разбираться с последствиями. А уж когда горе-писатели передают свой код "на доделку" или "проверку", так вообще рыдать хочется.

А ведь простое знание и соблюдение (и применение) стандарта может заметно облегчить все аспекты программирования...

Все это так для кода с большим объемом вычислений и простейшими драйверами.

А в жизни все происходит с точностью до наоборот, когда очень аккуратные и прилежные кодописатели приходят ко мне с целью понять происхождение багов через дизасм.  Причем баги не носят характера ошибок кода. Ошибки состоят в самой реализации, в непонимании взаимодействия участков кода во времени. Часто к багам приводит работа оптимизации.

Я уже не говорю о том, что с трудом себе представляю с каким целями я могу передавать свой код "на доделку" или "проверку"...

Вы воспитатель детсада или учитель в начальной школе?

Изменено пользователем my504

戦う前に相手のベルトの色に注目

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, my504 сказал:

Часто к багам приводит работа оптимизации.

Я в своей практике сталкивался с подобным считанное число раз. Причем после тщательного анализа проблемы почти всегда выяснялось, что эта проблема не проявилась бы, если бы я был более аккуратен в кодописании. Именно поэтому я продолжаю настаивать, что знание и соблюдение стандартов всегда помогает, а не вредит.

1 час назад, my504 сказал:

Вы воспитатель детсада или учитель в начальной школе?

Судя по тому, как приходится вам объяснять очевидное - да. А вообще я любитель-меценат, и достаточно много помогаю новичкам, в частности, тыкая носом в стандарты.

А вас, @my504 , я попрошу впредь поменьше рассказывать о страшных проблемах взаимодействия участков кода, которые только дизассмом и отладчиком можно расковырять и устранить, а просто приводить примеры, чтобы можно было воссоздать вашу проблему и разобраться, что явилось её первопричиной. А то ведь (по моим личным наблюдениям) ваши слова о проблемах почти не отличаются от криков самых-самых наивных начинающих, у которых во всех бедах виноваты: а) баги компилятора; б) баги микроконтроллера и в) ошибки в чужих библиотеках. Хотя на поверку почти всегда виноват сам "разработчик"...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

2 часа назад, ARV сказал:

А вас, Штирлиц, я попрошу впредь поменьше рассказывать..............

у которых во всех бедах виноваты: а) баги компилятора; б) баги микроконтроллера и в) ошибки в чужих библиотеках. Хотя на поверку почти всегда виноват сам "разработчик"...

а) ни разу не упоминал про баги компиляторов. Вероятно они существуют, но мне в явном виде не встречались. Вероятно я недостаточно знаю стандарты... :lol:

б) баги МК существуют и они изложены в эррате

в) не знаю - не пробовал.  Все пишу сам. А когда в чужом коде для МК вижу printf -готов  такому кодописателю  разбить комп с проектом. Это для меня звучит как приговор этому человеку. :)

В общем, АРВ, Вы типичный "учитель" по жизни...  Младших классов.

Это не плохо, только надо сразу обозначать аудиторию.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 минуту назад, my504 сказал:

Это не плохо

Вот чего мне не хватало, так это вашего одобрения.

Вы заявляете о проблемах - так покажите образчик! Судя по тому, что вы задавали такие вопросы:

В 22.10.2017 в 09:32, my504 сказал:

А у логических выражений есть ЧИСЛЕННЫЙ результат?

 

В 22.10.2017 в 12:01, my504 сказал:

Часть выражения является выражением?

Является ли выражением "а" в выражении "с=а+в"?

Является ли "=" таким выражением?

 Вы не то, что какие-то баги в отладчике найти, вы и написать-то толком ничего не сумеете... А ранее пытались явную чушь про доступность "из ассемблера" втереть - и опять бездоказательно...

Но напускаете на себя виду убеленного сединами профи.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

7 часов назад, ARV сказал:

Вот чего мне не хватало, так это вашего одобрения.

Вы заявляете о проблемах - так покажите образчик! Судя по тому, что вы задавали такие вопросы:

 

 Вы не то, что какие-то баги в отладчике найти, вы и написать-то толком ничего не сумеете... А ранее пытались явную чушь про доступность "из ассемблера" втереть - и опять бездоказательно...

Но напускаете на себя виду убеленного сединами профи.

"Вы хотите об этом поговорить?" (с):lol:

АРВ, мне просто гомерически смешно. 

Впрочем ладно, идите с Богом, "учитель" Вы наш....  Я ведь и не надеялся относительно Вас, есличо.

.

 

戦う前に相手のベルトの色に注目

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

2 часа назад, my504 сказал:

мне просто гомерически смешно

А я не удивлен. При отсутствии знаний больше ничего и не остается, как ржать. 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

48 минут назад, ARV сказал:

А я не удивлен. При отсутствии знаний больше ничего и не остается, как ржать. 

А Вас не удивляет, что, как Вы изволили выразиться, "отсутствие знаний" не мешает мне успешно писать код в свои изделия, а изделия затем успешно внедрять в серийное производство?

Вы не ответили мне на простой вопрос: каким боком терминология стандарта влияет на написание кода для ДМА?

Что такого критически важного содержится в определении выражения как части другого выражения?

Зато Ваше стерильное непонимание сути понятия "логического выражения" - это весьма существенно. Вы совершенно формально принимаете соглашения языка, не пытаясь разобраться в сути. И при этом вообще не слышите собеседника, априори полагая, что  собеседником является ничего не знающий "школоло".

Именно это гомерически смешно.

Также гомерически смешны Ваши сентенции относительно ДМА. ДМА не требует никаких вычислений, кроме простых присвоений значений управляющим регистрам контроллера ДМА, а так же тривиальных действий в обработчике прерываний по ДМА. Все что связано с использованием этого аппаратного инструмента никакого отношения к Си не имеет ВООБЩЕ.

Проблема в том, что Вы ни разу не радист. Вы - программист. Именно поэтому активно применяете чужие библиотеки.  А мне это совершенно не требуется.

 

戦う前に相手のベルトの色に注目

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

В 22.10.2017 в 09:32, my504 сказал:

А у логических выражений есть ЧИСЛЕННЫЙ результат? :)

Вы вообще о чем?

Это Вы путаете представление результата логических выражений в машине с  самим этим результатом.

Когда процессор выполняет условное ветвление при сравнении чисел, то он опирается на  значения флагов регистра состояний, а совсем не на числа.

То есть у условия НЕТ ЧИСЛЕННОГО РЕЗУЛЬТАТА. Его даже нельзя чаще всего физически получить, потому что он не сохраняется ни в каком регистре.

Присвоение единицы или нуля вместо boolean значений - это УСЛОВНОСТЬ связанная с отсутствием этого типа.

Интересно вы спорили все таки. Мне представляется что даже у арифметических операций есть логический результат:

для операции сложения, например,

к=м+р;

из ассемблерной вставки можно получить доступ к флагу С, который не что иное как результат операции:

С = к>0xFF (для восьми битной платформы), 

на AVR-х этот флаг запросто участвует в арифметических операциях, например:

ADC rd, rs-инструкция ассемблера: сложить два регистра с флагом переноса: rd = rd + rs + <значение флага С>

Насколько я знаю на любом процессоре есть возможность использования результата логической операции в арифметических вычислениях!

Если уж быть до конца честным тут и арифметическую операцию без лишнего присваивания реализовать не возможно:

к=м+р; выливается в:

к=м;

к=к+р; (а если рассматривать значения в памяти там воЩе море инструкций получится!)

Так что, это то же не аргумент про лишнее присваивание или иную инструкцию доступа!

Мне все таки Ваше восприятие этого вопроса представляется несколько ограниченным :)!

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

Только что, ruhi сказал:

Интересно вы спорили все таки. Мне представляется что даже у арифметических операций есть логический результат:

 

У арифметических выражений есть только ЧИСЛЕННЫЙ результат.  Сам факт установки флага лишь говорит о том, что  ядро параллельно с  численными вычислениями  может делать некоторые ЛОГИЧЕСКИЕ операции. Установка флага - это логическая операция.

Еще раз для тех кто в танке.

Безотносительно к языку результат логического выражения - это  "истина" или "ложь". В чистом виде логические выражения применимы лишь в операциях ветвления. Однако язык Си  преобразует логический тип (который у него отсутствует в исходном стандарте) В ЧИСЛЕННЫХ ВЫРАЖЕНИЯХ в 1 или 0 с целью возможности  применения этого типа  в этих самых выражениях.

Написание численного выражения  в логических операторах языка - суть есть СОКРАЩЕННАЯ ЗАПИСЬ логического выражения "не равно нулю", где  последнее опускается. И все.

Тупое тыканье заскорузлым пальцем в стандарт ничего не доказывает, патамушта все дело в том, получает ли компилятор промежуточный результат логического выражения или нет? Попытки уверить в том, что надо забыть про АСМ - беспонтовы. Поскольку ЕДИНСТВЕННОЙ ЦЕЛЬЮ работы компилятора является именно АСМ.

戦う前に相手のベルトの色に注目

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

Только что, my504 сказал:

Вас не удивляет, что, как Вы изволили выразиться, "отсутствие знаний" не мешает мне успешно писать код в свои изделия, а изделия затем успешно внедрять в серийное производство?

А я голой жопой ежей давлю. Верите на слово или попросите доказать?

Только что, my504 сказал:

Вы не ответили мне на простой вопрос: каким боком терминология стандарта влияет на написание кода для ДМА?

А вы и не спрашивали. Терминология стандарта, как и знание его, влияют на качество программного кода. Если вы не знаете базовых основ языка, очень сомнительно, что способны выдать качественный код. Вот отвлеченный пример (цитаты с другого сайта без имен).

Человек пишет такое:

Цитата

В AtmelStudio вроде можно писать на с++,меня просто отговорили от использования синтаксиса плюсов в мк из за его реализации, если мк все-таки поддерживает парадигму ооп программирования то это все упрощает . можно создать класс и наполнить его методами(но я\ не уверен что МК AVR полноценно поддерживает с++.)

Цитата

На самом деле с плюсами бы было работать проще и привычней . ) но даже не знаю какой стандарт поддерживает avr-gcc в atmelstudio ведь не так давно вышел очередной стандарт с++17 который пришелся сне с разу по душе в другом моем хобби

Я, недоумок, С++ в глаза не видевший, должен подумать, что если чел привычно работает в С++, да еще и пользуется крутыми плюшками последнего стандарта, то он крут, как яйца на Пасху. Однако, реальность показывает, что это крайне безграмотный "программист", и С++ код из-под его рук будет ужаснее, чем то, что он наваял в Си:

Цитата
Скрытый текст


#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
//-------------------------------------------///init_pwm///-----------------------------------------------------------------//
void init_pwm()
{
   TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);
   TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (0<<CS00);
   OCR0A=0x00;
   OCR0B=0x00;

   TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10);
   TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
   OCR1AL=0x00;
   OCR1BL=0x00;

   TCCR2A=(1<<COM2A1) | (0<<COM2A0) | (1<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (1<<WGM20);
   TCCR2B=(0<<WGM22) | (0<<CS22) | (1<<CS21) | (0<<CS20);
   OCR2A=0x00;
   OCR2B=0x00;
}
//--------------------------------------------------------------------------------------------------------------------------//
void init_int0()
{
   //настраиваем на срабатывание INT0 по переднему фронту
   EICRA |= (1<<ISC01)|(0<<ISC00);
   //разрешаем внешнее прерывание INT0
   EIMSK |= (1<<INT0);
}
//--------------------------------------------------------------------------------------------------------------------------//
void init_io()
{
   DDRB=(0<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(0<<PB5)|(0<<PB6)|(0<<PB7);
   PORTB=0x00;
   DDRC=(1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)|(1<<PC6);
   PORTC=0x00;
   DDRD=(1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
   PORTD=0x00;
}
//--------------------------------------------------------------------------------------------------------------------------//
//настройка параметров работы функций
#define BTN_LOCK_TIME      30               /*время обработки дребезга в милисекундах (10-100)*/
#define BTN_LONG_TIME      1000            /*время фиксации длинного нажатия в милисекундах (1000 - 2500)*/
//настройки портов
/*порт чтения кнопок*/
#define BTN_PORT         PORTB
#define BTN_DDR            DDRB
#define BTN_PIN            PINB
/*пины чтения кнопок*/
#define BTN_LINE_UP      (1<<7)
#define BTN_LINE_DN      (1<<6)
#define BTN_LINE_POWER   (1<<5)
#define BTN_LINE_SW      (1<<0)
//глобальные переменные
volatile uint8_t BtnFlags;               //байт флагов нажатия кнопки
#define BTN_SHRT_UP         (1<<0)         /*бит короткого нажатия кнопки up*/
#define BTN_SHRT_DN         (1<<1)         /*бит короткого нажатия кнопки dn*/
#define BTN_SHRT_POWER      (1<<2)         /*бит короткого нажатия кнопки POWER */
#define BTN_SHRT_SW         (1<<3)         /*бит короткого нажатия кнопки SW*/
#define BTN_LONG_UP         (1<<4)         /*бит длинного нажатия кнопки up*/
#define BTN_LONG_DN         (1<<5)         /*бит длинного нажатия кнопки dn*/
#define BTN_LONG_SW         (1<<6)         /*бит короткого нажатия кнопки SW*/
//-------------------------------------------------------------------------------------------------------------------
//Функция настройки библиотеки работы с кнопками
void BtnInit (void)
{
   BTN_DDR &= ~(BTN_LINE_UP| BTN_LINE_DN| BTN_LINE_POWER|BTN_LINE_SW);//на ввод
   BTN_PORT |= (BTN_LINE_UP| BTN_LINE_DN| BTN_LINE_POWER|BTN_LINE_SW);//подтяжка вкл
}
//--------------------------------------------------------------------------------------------------------------------
//Функция чтения данных о нажатии кнопок
char BtnGet (void)
{
   cli();
   char temp = BtnFlags;
   BtnFlags = 0;
   sei();
   return temp;
}
//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ ОБРАБОТКИ НАЖАТИЙ КЛАВИШ (вызывать в прерывании с частотой 100 Гц)
//короткое нажатие устанавливает бит BTN_SHRT_X глобальной переменной BtnFlags
//длинное нажатие устанавливает бит BTN_LONG_X глобальной переменной BtnFlags
void BtnExe (void)
{
   static unsigned char BtnLockBit;            //защелка (защита от дребезга)
   static unsigned char BtnLockCoun;         //счетчик защелки (защита от дребезга)
   static unsigned char BtnLongCoun;         //счетчик длинного нажатия
   static unsigned char BtnLastState;         //последнее состояние кнопок перед отпусканием

   char mask = 0;
   if (! (BTN_PIN & BTN_LINE_UP))      mask = BTN_SHRT_UP;
   if (! (BTN_PIN & BTN_LINE_DN))      mask = BTN_SHRT_DN;
   if (! (BTN_PIN & BTN_LINE_POWER))   mask = BTN_SHRT_POWER;
   if (! (BTN_PIN & BTN_LINE_SW))      mask = BTN_SHRT_SW;

   if (mask){                           //опрос состояния кнопки
      if (BtnLockCoun < (BTN_LOCK_TIME/10)){   //клавиша нажата
         BtnLockCoun++;
         return;                        //защелка еще не дощитала - возврат
      }
      BtnLastState = mask;
      BtnLockBit =1;                     //нажатие зафиксировано
      if (BtnLongCoun >= (BTN_LONG_TIME/10))
      return;                        //возврат, т.к. счетчик длинн нажат досчитал до максимума еще раньше
      if (++BtnLongCoun >= (BTN_LONG_TIME/10))
      BtnFlags |= (BtnLastState<<4);         //счетчик досчитал до максимума - устанавливаем биты длинного нажатия
   }
   else{                              //клавиша отжата
      if (BtnLockCoun){
         BtnLockCoun --;
         return;                        //защелка еще не обнулилась - возврат
      }
      if (! BtnLockBit)                  //СТАТИЧЕСКИЙ ВОЗВРАТ
      return;
      BtnLockBit =0;                     //отжатие зафиксировано
      if (BtnLongCoun < (BTN_LONG_TIME/10))
      BtnFlags |= BtnLastState;         //установка бита короткого нажатия
      BtnLongCoun = 0;               //сброс счетчика длительности нажатия
   }
}
//------------------------------------------------------****7SEG****----------------------------------------------------------
#define SEGA 6
#define SEGB 5
#define SEGC 1
#define SEGD 2
#define SEGE 3
#define SEGF 4
#define SEGG 0

#define ANOD1 4
#define ANOD2 7
#define ANOD3 4
//-------------------------------------------------------------------------------------------------------------------------
void segchar (unsigned char seg)
{
   switch (seg)
   {
      case 0:
      PORTC=(0<<SEGA)|(0<<SEGB)|(0<<SEGC)|(0<<SEGD)|(0<<SEGE)|(0<<SEGF)|(1<<SEGG);break;
      case 1:
      PORTC=(1<<SEGA)|(0<<SEGB)|(0<<SEGC)|(1<<SEGD)|(1<<SEGE)|(1<<SEGF)|(1<<SEGG);break;
      case 2:
      PORTC=(0<<SEGA)|(0<<SEGB)|(1<<SEGC)|(0<<SEGD)|(0<<SEGE)|(1<<SEGF)|(0<<SEGG);break;
      case 3:
      PORTC=(0<<SEGA)|(0<<SEGB)|(0<<SEGC)|(0<<SEGD)|(1<<SEGE)|(1<<SEGF)|(0<<SEGG);break;
      case 4:
      PORTC=(1<<SEGA)|(0<<SEGB)|(0<<SEGC)|(1<<SEGD)|(1<<SEGE)|(0<<SEGF)|(0<<SEGG);break;
      case 5:
      PORTC=(0<<SEGA)|(1<<SEGB)|(0<<SEGC)|(0<<SEGD)|(1<<SEGE)|(0<<SEGF)|(0<<SEGG);break;
      case 6:
      PORTC=(0<<SEGA)|(1<<SEGB)|(0<<SEGC)|(0<<SEGD)|(0<<SEGE)|(0<<SEGF)|(0<<SEGG);break;
      case 7:
      PORTC=(0<<SEGA)|(0<<SEGB)|(0<<SEGC)|(1<<SEGD)|(1<<SEGE)|(1<<SEGF)|(1<<SEGG);break;
      case 8:
      PORTC=(0<<SEGA)|(0<<SEGB)|(0<<SEGC)|(0<<SEGD)|(0<<SEGE)|(0<<SEGF)|(0<<SEGG);break;
      case 9:
      PORTC=(0<<SEGA)|(0<<SEGB)|(0<<SEGC)|(0<<SEGD)|(1<<SEGE)|(0<<SEGF)|(0<<SEGG);break;
      case 99: //OFF Все сегменты
      PORTC=(1<<SEGA)|(1<<SEGB)|(1<<SEGC)|(1<<SEGD)|(1<<SEGE)|(1<<SEGF)|(1<<SEGG);break;
   }
}
unsigned char ValuePWM[]={0,0,0,0,0,0};
unsigned char FlagPower[]={0,0,0,0,0,0};
void UpdateFlagPower(unsigned char ZoneNumber,unsigned char Flag)
{
   FlagPower[ZoneNumber]=Flag;
}

void UpdateValue(void)
{
   for (unsigned char ValueCount = 0; ValueCount < 5; ValueCount++)
   {
      switch (ValueCount)
      {
         case 0:
         OCR0A=ValuePWM[ValueCount]*2.56;break;
         case 1:
         OCR0B=ValuePWM[ValueCount]*2.56;break;
         case 2:
         OCR1AL=ValuePWM[ValueCount]*2.56;break;
         case 3:
         OCR1BL=ValuePWM[ValueCount]*2.56;break;
         case 4:
         OCR2A=ValuePWM[ValueCount]*2.56;break;
         case 5:
         OCR2B=ValuePWM[ValueCount]*2.56;break;
      }
   }
}
unsigned char data1 = 0;
unsigned char data2 = 0;
unsigned char count = 0;
unsigned char ZoneNumber=0;
void WriteSeg(unsigned char Number)
{
   data1=ValuePWM[Number]%10;
   data2=ValuePWM[Number]/10;
   PORTB |=(1<<ANOD1);
   PORTD |=(1<<ANOD2);
   PORTD |=(1<<ANOD3);
   segchar(99);
   count++;
   if (count==1){
      PORTB &= ~(1<<ANOD1);
      segchar(data1);
      PORTD |=(1<<ANOD2);
      PORTD |=(1<<ANOD3);
   }
   if (count==2){
      PORTD &= ~(1<<ANOD2);
      segchar(data2);
      PORTB |=(1<<ANOD1);
      PORTD |=(1<<ANOD3);
   }
   if (count==3){
      PORTD &= ~(1<<ANOD3);
      segchar(Number+1);
      PORTB |=(1<<ANOD1);
      PORTD|=(1<<ANOD2);
   }
   if (count==3){count=0;}
}
ISR(INT0_vect)
{
   WriteSeg(ZoneNumber);
   UpdateValue();
   BtnExe();
}
unsigned char fBtnPower=0;
void BtnUpdate(void)
{
   char BtnMask = BtnGet ();
   if (BtnMask == BTN_SHRT_POWER)
   {
   }
   if ((BtnMask == BTN_SHRT_SW))
   {
      ZoneNumber++;
      if (ZoneNumber==6)
      {
         ZoneNumber=0;
      }
   }
   //одиночное нажатие +
   if ((BtnMask == BTN_SHRT_UP)& (ValuePWM[ZoneNumber] < 99))
   {
      ValuePWM[ZoneNumber]++;
   }
   //одиночное нажатие -
   if ((BtnMask == BTN_SHRT_DN)& (ValuePWM[ZoneNumber] > 0))
   {
      ValuePWM[ZoneNumber]--;
   }
   //Удержание +
   if ((BtnMask == BTN_LONG_UP) & (ValuePWM[ZoneNumber] < 99))
   {
      while ((!(PINB&0b10000000))& (ValuePWM[ZoneNumber] < 99))
      {
         ValuePWM[ZoneNumber]++;
         _delay_ms(50);
      }
   }
   //Удержание -
   if ((BtnMask == BTN_LONG_DN) & (ValuePWM[ZoneNumber] > 0))
   {
      while ((!(PINB&0b01000000))& (ValuePWM[ZoneNumber] > 0))
      {
         ValuePWM[ZoneNumber]--;
         _delay_ms(50);
      }
   }
}
//-----------------------------------------------------------------------------------------------------

uint8_t EEMEM FlagPower1_EEPROM=0;
uint8_t EEMEM FlagPower2_EEPROM=0;
uint8_t EEMEM FlagPower3_EEPROM=0;
uint8_t EEMEM FlagPower4_EEPROM=0;
uint8_t EEMEM FlagPower5_EEPROM=0;
uint8_t EEMEM FlagPower6_EEPROM=0;

uint8_t EEMEM Value1_EEPROM=0;
uint8_t EEMEM Value2_EEPROM=0;
uint8_t EEMEM Value3_EEPROM=0;
uint8_t EEMEM Value4_EEPROM=0;
uint8_t EEMEM Value5_EEPROM=0;
uint8_t EEMEM Value6_EEPROM=0;

unsigned char LoadingFlagEEPROM(uint8_t NumberZone)
{
   unsigned char PowerFlag=0;
   switch(NumberZone)
   {
      case 1:
      PowerFlag = eeprom_read_byte(&Value1_EEPROM);
      break;
      case 2:
      PowerFlag = eeprom_read_byte(&Value2_EEPROM);
      break;
      case 3:
      PowerFlag = eeprom_read_byte(&Value3_EEPROM);
      break;
      case 4:
      PowerFlag = eeprom_read_byte(&Value4_EEPROM);
      break;
      case 5:
      PowerFlag = eeprom_read_byte(&Value5_EEPROM);
      break;
      case 6:
      PowerFlag = eeprom_read_byte(&Value6_EEPROM);
      break;
   }
   _delay_ms(10);
   return(PowerFlag);
}
uint8_t LoadingValueEEPROM(uint8_t NumberZone)
{
   uint8_t ValueFlag=0;
   switch(NumberZone)
   {
      case 1:
      ValueFlag = eeprom_read_byte(&FlagPower1_EEPROM);
      break;
      case 2:
      ValueFlag = eeprom_read_byte(&FlagPower2_EEPROM);
      break;
      case 3:
      ValueFlag = eeprom_read_byte(&FlagPower3_EEPROM);
      break;
      case 4:
      ValueFlag = eeprom_read_byte(&FlagPower4_EEPROM);
      break;
      case 5:
      ValueFlag = eeprom_read_byte(&FlagPower5_EEPROM);
      break;
      case 6:
      ValueFlag = eeprom_read_byte(&FlagPower6_EEPROM);
      break;
   }
   _delay_ms(10);
   return(ValueFlag);
}

void SaveEEPROM(uint8_t SaveValue,uint8_t SaveFlagPower,uint8_t NumberZone)
{
   switch(NumberZone)
   {
      case 1:
      eeprom_write_byte (&Value1_EEPROM, SaveValue);
      eeprom_write_byte (&FlagPower1_EEPROM, SaveFlagPower);
      break;
      case 2:
      eeprom_write_byte (&Value2_EEPROM, SaveValue);
      eeprom_write_byte (&FlagPower2_EEPROM, SaveFlagPower);
      break;
      case 3:
      eeprom_write_byte (&Value3_EEPROM, SaveValue);
      eeprom_write_byte (&FlagPower3_EEPROM, SaveFlagPower);
      break;
      case 4:
      eeprom_write_byte (&Value4_EEPROM, SaveValue);
      eeprom_write_byte (&FlagPower4_EEPROM, SaveFlagPower);
      break;
      case 5:
      eeprom_write_byte (&Value5_EEPROM, SaveValue);
      eeprom_write_byte (&FlagPower5_EEPROM, SaveFlagPower);
      break;
      case 6:
      eeprom_write_byte (&Value6_EEPROM, SaveValue);
      eeprom_write_byte (&FlagPower6_EEPROM, SaveFlagPower);
      break;
   }
}

//-----------------------------------------------------------------------------------------------------
int main(void)
{
   for (unsigned char Count = 0; Count < 5; Count++)
   {
      SaveEEPROM(1,2,Count+1);
      _delay_ms(15);
   }
   
   for (unsigned char Count = 0; Count < 5; Count++)
   {
      FlagPower[Count]=LoadingFlagEEPROM(Count+1);
   }
   
   for (unsigned char Count = 0; Count < 5; Count++)
   {
      ValuePWM[Count]=LoadingValueEEPROM(Count+1);
   }
   init_io();
   init_int0();
   BtnInit();
   init_pwm();
   _delay_ms(10);
   sei();
    while(1)
    {
      BtnUpdate();
   }
   return 0;
}

 

 

Читаю ваши сообщения, и меня не покидает ощущение, что ваш уровень не выше только что описанного.

Только что, my504 сказал:

Вы совершенно формально принимаете соглашения языка, не пытаясь разобраться в сути.

Если код пишется на ЯВУ, то в первую очередь надо понимать, что написано именно на ЯВУ, а то, что происходит внутри - это вторично, если не третично. Только что прочитал на хабре о разном поведении программы, вызывающей по неинициализированному указателю функцию - дескать, без оптимизации вываливается исключение, а с оптимизацией вызывается некая функция... И несколько килобайт текста о том, как это внутри компилятором создается и почему. Но ведь эти глубокие исследования никому не потребуются, кто просто не делает вызова функции по неинициализированному указателю! Знания - страшная сила, иногда они сносят крышу.

Только что, my504 сказал:

априори полагая, что  собеседником является ничего не знающий "школоло".

Нет, априори я отношусь к собеседнику, как к равному. Но своим поведением собеседник может доказать иное. Отсутствие аргументов в споре, бездоказательное хлопанье пяткой в грудь "я такие проги пишу - вам и не снилось, и тиражу моих устройств китайцы завидуют" - это стиль поведения школоло.

Только что, my504 сказал:

Ваши сентенции относительно ДМА

Какие именно? Вы ничего не путаете? Я про ДМА ничего особого не "сентировал".

Только что, my504 сказал:

Все что связано с использованием этого аппаратного инструмента никакого отношения к Си не имеет ВООБЩЕ.

Допустим, тут я с вами полностью согласен: аппаратная часть к собственно языку программирования отношения вообще не имеет. Но разве из этого следует необязательность знания самого языка, на котором пишите?

 

Только что, my504 сказал:

Проблема в том, что Вы ни разу не радист. Вы - программист

А по фотографии не лечите? ;)

 

Только что, my504 сказал:

У арифметических выражений есть только ЧИСЛЕННЫЙ результат

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

Только что, my504 сказал:

Однако язык Си  преобразует логический тип (который у него отсутствует в исходном стандарте) В ЧИСЛЕННЫХ ВЫРАЖЕНИЯХ в 1 или 0 с целью возможности  применения этого типа  в этих самых выражениях

Нет, это ваши фантазии. Ранее я цитировал стандарт, который прямо говорит: результат логического выражения есть число типа int. Никаких преобразований!

Только что, my504 сказал:

получает ли компилятор промежуточный результат логического выражения или нет?

Я вам ранее приводил пример, могу еще раз привести. Вы вынуждены натягивать сову на глобус, рассказывая о приведении типов компилятором, в то время как компилятор просто реализует стандарт: получает 1 или 0 в результате логических операций и использует это в вычислениях.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

5 минут назад, my504 сказал:

У арифметических выражений есть только ЧИСЛЕННЫЙ результат.  Сам факт установки флага лишь говорит о том, что  ядро параллельно с  численными вычислениями  может делать некоторые ЛОГИЧЕСКИЕ операции. Установка флага - это логическая операция.

Еще раз для тех кто в танке.

Безотносительно к языку результат логического выражения - это  "истина" или "ложь". В чистом виде логические выражения применимы лишь в операциях ветвления. Однако язык Си  преобразует логический тип (который у него отсутствует в исходном стандарте) В ЧИСЛЕННЫХ ВЫРАЖЕНИЯХ в 1 или 0 с целью возможности  применения этого типа  в этих самых выражениях.

Написание численного выражения  в логических операторах языка - суть есть СОКРАЩЕННАЯ ЗАПИСЬ логического выражения "не равно нулю", где  последнее опускается. И все.

Тупое тыканье заскорузлым пальцем в стандарт ничего не доказывает, патамушта все дело в том, получает ли компилятор промежуточный результат логического выражения или нет? Попытки уверить в том, что надо забыть про АСМ - беспонтовы. Поскольку ЕДИНСТВЕННОЙ ЦЕЛЬЮ работы компилятора является именно АСМ.

Дык я Вам на АСМе все и обосновал! Вы прочитайте сначала до конца! Потоки сознания должны же быть как то связаны с постом на который они отвечают :) ?

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

16 минут назад, ARV сказал:

Вы вынуждены натягивать сову на глобус, рассказывая о приведении типов компилятором, в то время как компилятор просто реализует стандарт: получает 1 или 0 в результате логических операций и использует это в вычислениях.

Это ложь. То, что РЕАЛИЗУЕТ компилятор - это код на АСМе. При выполнении логических операций никакого численного результата компилятор не реализует.

При написании кода на ЯВУ  под ОС общего назначения (то есть с использованием API и прочая) действительно нет никакого смысла вникать в генерируемый код нижнего уровня, поскольку это совершенно бессмысленное занятие.

При написании кода на ЯВУ для МК (без или с ОСРВ - не важно) контроль за генерируемым кодом - первостепенная задача. Ровно потому, что результатом работы является не исходник на Си, а РАБОТАЮЩЕЕ ИЗДЕЛИЕ. И если "кошерный" код будет приводить к отвратительному результату, то такой код нужно признать мусорным.

ЗЫ. Я не в курсе на каких ежах Вы там сидите. И мне совершенно фиолетово что Вы там обо мне думаете. О Вас я не думаю вообще. Желаете узнать чем я занимаюсь - устраивайтесь на работу в нашу компанию.  :)

14 минуты назад, ruhi сказал:

Дык я Вам на АСМе все и обосновал! Вы прочитайте сначала до конца! Потоки сознания должны же быть как то связаны с постом на который они отвечают :) ?

Вы видимо не читаете ответы на Ваши сентенции.

Процессор способен делать за один машинный цикл больше, чем Вам представляется. Из этого не следует, что сделанное является результатом. Сиречь, установка флагов имеет смысл лишь непосредственно после самой команды. Следующая команда (включая пересылку) может этот флаг изменить. Далеко не всегда арифметическое выражение компилируется в одну команду АСМа,  а это приводит к бессмысленности "логического результата" этого выражения.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

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

Только что, my504 сказал:

О Вас я не думаю вообще

Не думать вообще, это, похоже, ваше естественное состояние.

Только что, my504 сказал:

Это ложь

То есть международный комитет стандарта Си лжет, а вы, весь в белом, вещаете истину?

Только что, my504 сказал:

И если "кошерный" код будет приводить к отвратительному результату, то такой код нужно признать мусорным.

Приведите пример "кошерного" кода, который не работает. Все эти ваши бесконечные "если" без доказательств уже утомили. Корректно написанный код будет работать всегда так, как написано. Быстрее или медленнее - это уже зависит от ассемблерной реализации, и иногда приходится искать варианты по "ускорению". Но в том, что корректно написанный код будет работать корректно - можно быть уверенным на 100% без копания в листингах (конечно при условии, что компилятор не содержит какого-то бага, т.е. работает с отступлениями от стандарта).

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

6 минут назад, my504 сказал:

 

Процессор способен делать за один машинный цикл больше, чем Вам представляется. Из этого не следует, что сделанное является результатом. Сиречь, установка флагов имеет смысл лишь непосредственно после самой команды. Следующая команда может этот флаг изменить. Далеко не всегда арифметическое выражение компилируется в одну команду АСМа,  а это приводит к бессмысленности "логического результата" этого выражения.

Мой код на ММХ и SSE майкрософт купил у Интела после тщательного тестирования, так что Вы зря пытаетесь угадать мои представления о работе процессора :),

А по теме Вы так и не ответили!

Но Вы может не знаете! Нужную арифметическую команду ведь тоже можно на АСМе написать, используя доступ к определенным компилятором для нужной переменной регистрам.

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

Только что, ARV сказал:

1. То есть международный комитет стандарта Си лжет, а вы, в белом, вещаете истину?

2. Приведите пример "кошерного" кода, который не работает. Все эти ваши бесконечные "если" без доказательств уже утомили. Корректно написанный код будет работать всегда так, как написано. Быстрее или медленнее - это уже зависит от ассемблерной реализации, и иногда приходится искать варианты по "ускорению". Но в том, что корректно написанный код будет работать корректно - можно быть уверенным на 100% без копания в листингах.

1. Международный комитет стандарта Си  никакого отношения не имеет к обсуждаемому вопросу. То, что компилятор не получает численного результата в логических операторах - это есть ФАКТ.  Железобетонный факт. А то, что он вызывает у Вас непонимание и ощущение противоречия со стандартом - это Ваши личные трудности. 

2. Опять Вы перевираете собеседника. Я ни разу не писал, что "кошерный" код не работает. Работает ЛЮБОЙ код. Вообще любой. Даже состоящий из нопов.

А вот биения в сигнале (массиве выходного сигнала), являющиеся результатом пренебрежения генерируемым АСМом - это факт. Третьего дня разбирался с кодом коллеги ровно по этой причине. А код написан замечательно. Я так не умею. Коллега очень грамотный программист. Радист - никакой.

ЗЫ. Копаться в наших листингах не требуется. Во первых справляемся сами, а во вторых это не даст результата. Ибо Вы не в теме. Именно поэтому я не пишу Вам код.

戦う前に相手のベルトの色に注目

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

Только что, my504 сказал:

Ибо Вы не в теме. Именно поэтому я не пишу Вам код.

Как обычно, утверждение, ничем не доказанное. Но это характерно для вас. А вот что код не показываете - это зря. Как минимум, меня, безграмотного неуча, поучили бы личным примером - это вам в карму зачлось бы обязательно (не форумную карму, а в высшем смысле).

Только что, my504 сказал:

То, что компилятор не получает численного результата в логических операторах - это есть ФАКТ.  Железобетонный факт

Как же факт, если я могу умножать и делить на результат логических выражений? Раз компилятор может это делать, значит, результат все-таки есть, и он численный!

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

4 минуты назад, ruhi сказал:

1. Мой код на ММХ и SSE майкрософт купил у Интела после тщательного тестирования, так что Вы зря пытаетесь угадать мои представления о работе процессора :),

2. Нужную арифметическую команду ведь тоже можно на АСМе написать, используя доступ к определенным компилятором для нужной переменной регистрам.

1. Поздравляю. Только это не имеет отношения к теме. Мы тут обсуждаем  что попроще. :rolleyes:

2. Что то с русским языком - Вы не находите?  Арифметическую команду (вероятно Вы имели ввиду выражение) можно записать на АСМе. Если Вы  ДАЛЕЕ используете численный  результат  - то логический (их кстати несколько) исчезает (то есть его в общем и не было - ибо какая разница что там делает ядро, если Вы игнорируете результат). То есть в результате логической или арифметической операции на АСМе нет никаких нуля-единицы в качестве логического результата. Они появятся лишь после того, как логическое выражение станет частью численного.

5 минут назад, ARV сказал:

1. Как минимум, меня, безграмотного неуча, поучили бы личным примером - это вам в карму зачлось бы обязательно (не форумную карму, а в высшем смысле).

2. Как же факт, если я могу умножать и делить на результат логических выражений? Раз компилятор может это делать, значит, результат все-таки есть, и он численный!

1. Перебьетесь. У меня хватает кому  взращивать мою карму в высшем смысле...

2. Вы опять переврали собеседника. 

Цитата

То, что компилятор не получает численного результата в логических операторах - это есть ФАКТ.  Железобетонный факт

В арифметических (численных) выражениях компилятор реализует условное присвоение 1 или 0 промежуточной регистровой переменной по состоянию флага от логического выражения.  Только логические операторы (то есть те, где ВЫХОДНЫМ результатом является результат ЛОГИЧЕСКОГО выражения) могут корректно говорить о машинном представлении результата логического выражения. Все остальное  - шулерство.

戦う前に相手のベルトの色に注目

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

Только что, my504 сказал:

Они появятся лишь после того, как логическое выражение станет частью численного

Чукча явно писатель, а не читатель... ибо столько раз писать одну и ту же чушь может только он.

В языке Си ВСЕ ВЫРАЖЕНИЯ ИМЕЮТ ЧИСЛЕННЫЙ РЕЗУЛЬТАТ. Понимаете: все без исключения! И логические в том числе. Знать это необходимо для того, чтобы при написании программы на языке Си (а не ассемблера!) быть уверенным в поведении компилятора. То есть чтобы не допустить ошибки при написании кода, думая не так, как компилятор. В результате такого подхода можно гарантированно быть уверенным, что будет получен именно тот результат, который должен быть получен в результате исполнения написанной программы.

Тот факт, что у некоторых полученные результаты вызывают попаболь, не означает, что Си виноват - просто написали не то и не так.

Речь о том, как писать без ошибок, а не о том, как получать какой-то заранее придуманный результат работы низкоуровневой периферии.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Только что, ARV сказал:

Чукча явно писатель

В языке Си ВСЕ ВЫРАЖЕНИЯ ИМЕЮТ ЧИСЛЕННЫЙ РЕЗУЛЬТАТ. Понимаете: все без исключения! И логические в том числе. Знать это необходимо для того, чтобы при написании программы на языке Си (а не ассемблера!) быть уверенным в поведении компилятора.

Вот я и хочу увидеть ЧИСЛЕННЫЙ результат от логического выражения внутри оператора if (или while).  Покажете - Вы правы. 

Поведение компилятора - это код на АСМе. То есть то, что можно отследить по шагам в отладчике. Даже в  неявных переменных (регистрах общего назначения).

 

戦う前に相手のベルトの色に注目

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

Только что, my504 сказал:

В арифметических (численных) выражениях компилятор реализует условное присвоение 1 или 0 промежуточной регистровой переменной по состоянию флага от логического выражения.  Только логические операторы (то есть те, где ВЫХОДНЫМ результатом является результат ЛОГИЧЕСКОГО выражения) могут корректно говорить о машинном представлении результата логического выражения. Все остальное  - шулерство

Прекращайте бредить.

По-вашему выходит, что в операторе, где якобы ТОЛЬКО ЛОГИЧЕСКИЙ результат должен быть, компилятор тоже выполняет какое-то загадочное приведение типа результата?

if (a + b) {
  // вот результат a + b во флаг переноса преобразуется или переполнения?
}

По-вашему - да, раз в ассемблере условные переходы реализованы только по значению флагов регистра состояния, а флаги регистра состояния устанавливаются В ТОМ ЧИСЛЕ и при логических операциях... Однако, в некоторых ассемблерах есть команды перехода по значению регистра, без анализа флагов - что скажете на это?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

5 минут назад, ARV сказал:

Тот факт, что у некоторых полученные результаты вызывают попаболь, не означает, что Си виноват - просто написали не то и не так.

Я просто валялсо пацталом... :lol:

А в каком месте я писал, что виноват Си?

Я писал, что виноват ПРОГРАММИСТ. Ровно в том, что за "кошерным" кодом он не удосужился увидеть ту самую избыточную латентность, которая и привела к джиттеру в выходном массиве. А код приводящий к хорошему результату уже не слишком "кошерен"...

戦う前に相手のベルトの色に注目

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

Только что, my504 сказал:

Поведение компилятора - это код на АСМе. То есть то, что можно отследить по шагам в отладчике. Даже в  неявных переменных (регистрах общего назначения)

Вы ошибаетесь. Стандарт языка Си не указывает компилятору, где и как хранить результаты промежуточных вычислений. Компилятор может хранить их по своему усмотрению (в том числе, в разных местах при разных режимах оптимизации), а может вообще исключать написанные куски, если на итоговый результат это не повлияет - и в отладчике вы вообще не увидите никакого ассемблера!!! И это ПРАВИЛЬНОЕ поведение компилятора, описанное в стандарте.

Поэтому тот факт, что в while может оказаться результат, хранящийся в бите регистра флагов, ничего не меняет - вы его увидите в отладчике, если захотите. Если компилятор не хранит результат логической операции в, предположим, R17, это говорит лишь о том, что разработчики компилятора создали достаточно оптимальный компилятор. Однако результат достигается СТАНДАРТНЫЙ.

Только что, my504 сказал:

А код приводящий к хорошему результату уже не слишком "кошерен"

Ну хоть бы кусочки обоих вариантов показали бы! Надо ж понять, что такое загадочное вы там творите со своими программистами-радистами. Ибо джиттер в массиве - это что-то новое для меня... Неравномерно числа в массив занесли, что ли?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

9 минут назад, ARV сказал:

Однако, в некоторых ассемблерах есть команды перехода по значению регистра, без анализа флагов - что скажете на это?

Расскажите нам про эти ассемблеры. 

Впрочем, может существовать любая архитектура, даже без флагов.

Мы то обсуждали якобы "стандарт", а он оказывается никакого отношения к ПРИМЕНЕНИЮ языка не имеет, являясь лишь указанием  писателям самого компилятора.

4 минуты назад, ARV сказал:

Ну хоть бы кусочки обоих вариантов показали бы! Надо ж понять, что такое загадочное вы там творите со своими программистами-радистами. Ибо джиттер в массиве - это что-то новое для меня... Неравномерно числа в массив занесли, что ли?

Еще раз для глухих. Перебьетесь.

Когда у меня возникнет неразрешимый вопрос, я его задам лично Вам. Обещаю. ^_^

Джиттер - в СИГНАЛЕ. А сигнал - это МАССИВ.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

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