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

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


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

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

В том-то и дело, что аргумент - это объективно демонстрируемый факт, а тов.@my504 факты не показывает, уходит под любым предлогом. 

Но он меня не беспокоит :), да он выглядит немного наивным, так это даже приятно читать :).

Если он и давит авторитетом (пытается давить) то не своим, а стандарта!

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

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

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

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

Встроенная функция это не та функция, которая превращается из Си в асм компилятором. Встроенная функция может (и даже скорее всего) написана в качестве "заготовки" на ассемблере и вставляется компилятором в ответ на нечто, написанное программистом. Например, for с этой точки зрения - встроенная функция. То есть встроенная функция не результат трансляции, а инструмент трансляции.

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

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

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

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

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

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

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

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

Это, например, и операции && || ^ ! - и их комбинациями можно составлять выражения-уравнения, которые можно вычислять/решать средствами Си.

Можете написать выражение содержащее && (или любое другое для логических операндов) которое можно скомпилировать без ветвлений?

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

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

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

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

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

Но он меня не беспокоит :), да он выглядит немного наивным, так это даже приятно читать :).

Если он и давит авторитетом то не своим, а стандарта!

Одно из двух: или вы перепутали меня и @my504, или в вашей фразе есть двусмысленность.

 

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

Можете написать выражение содержащее && (или любое другое для логических операндов) которое можно скомпилировать без ветвлений?

В Си не принято использовать goto, а в ассемблерном листинге jmp просто море во всех разновидностях - о чем это говорит? На Си я напишу сколько угодно логических выражений без ветвлений (если вы забыли, то в Си ветвление - это if и switch), и какая разница, что там будет в ассемблере? Я же на Си пишу.

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

для логических операндов

Кстати, в Си нет логических операндов - все операнды численные :)

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

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

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

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

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

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

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

 То есть встроенная функция не результат трансляции, а инструмент трансляции.

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

Да, встроенные функции транслируются as is по своей спецификации. Ну и что? В ассемблере есть макросы, которые разворачиваются так же as is.

Я не понял к чему это все?

Вы полагаете, что я не знаю, что невозможно привести шаблоны генеруемого кода для стандартного кода Си? Я где то утверждал обратное? С чего Вы взяли свои "ожидания"? 

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

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

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

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

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

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

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

Встроенная функция это не та функция, которая превращается из Си в асм компилятором. Встроенная функция может (и даже скорее всего) написана в качестве "заготовки" на ассемблере и вставляется компилятором в ответ на нечто, написанное программистом. Например, for с этой точки зрения - встроенная функция. То есть встроенная функция не результат трансляции, а инструмент трансляции.

Вот например наивная попытка определить нечто в алгоритме компиляции то же с целью обосновать необходимость другого определения.

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

Оно зависит от процессора, уровня оптимизации как минимум.

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

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

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

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

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

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

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

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

С чего Вы взяли свои "ожидания"? 

На ваш счет у меня нет никаких ожиданий, мне все понятно. 

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

Я всего-навсего скромно, но твердо, настаиваю, что стандарт первичен даже по отношению к вашему (какой бы он ни был) опыту. И результат логического выражения в Си есть число типа int, равное 0 или 1. А что пытаетесь мне доказать вы - уже не интересно

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

Вот например наивная попытка определить нечто в алгоритме компиляции то же с целью обосновать необходимость другого определения

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

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

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

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

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

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

В Си не принято использовать goto

Вопрос: А почему не принято?

Я вот потихоньку пытаюсь переползать с асма на Си, и без этих "goto" ну ни как не получается. То ли этот асм так засел в голове, что не отпускает:(... А с goto и на Си вроде что-то получается, да и код особо не разрастается. Что в нем страшного?

Опыт - это то, что получаешь, не получив того, что хотел

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

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

Что в нем страшного?

Как и любые правила хорошего тона, это так же не имеет рационального объяснения :) Считается (и, надо признать, не без оснований), что использование goto затрудняет чтение кода, ухудшает поддержку, создает запутанность и вообще является избыточным (так как доказано, что любой алгоритм может быть реализован без этого оператора - только с имеющимися остальными).

Но это не более, чем условность, что-то вроде "кодекса чести самурая" - хочешь быть хорошим  самураем программистом - обходись без goto

На самом деле некоторые вещи с goto реализуются куда красивее и лаконичнее, чем без него. И опять-таки: что такое continue или break, если не "разрешенный" аналог goto?

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

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

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

На самом деле некоторые вещи с goto реализуются куда красивее и лаконичнее, чем без него.

Я недавно немного изучил СИ . Уже написал на нём немного программ. И вот что бросается в глаза , так это безумное количество ни о чём не говорящик кавычек {  и ответной } .

И какая к какой относится сразу , сразу , без поллитра , не разберёшь.

По этому в конце программы , когда хочу , чтоб она повторялась  меня просто коробит применять while (1) {  int main(....){}   }  которое добавит ещё две этих штуки {} .

И я использую goto  с меткой. Это куда более наглядно и проще для понимания. Не ужели и это порицаемо в СИ?

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

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

И я использую goto  с меткой. Это куда более наглядно и проще для понимания. Не ужели и это порицаемо в СИ?

Я поделюсь с вами собственным мнением по этому и другим вашим аспектам.

Когда мы говорим "главный цикл", что более наглядно соответствует этим словам

// такой вариант
m1:
   ...
   ...
   ...
   goto m1;

// или такой вариант
while(1){
  ...
  ...
  ...
}

// или даже такой
for(;;){
  ...
  ...
  ...
}
  

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

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

} else {

К тому же многие IDE для разработки умеют сворачивать блоки кода по скобкам, облегчая обзор смысловыми участками.

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

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

И какая к какой относится сразу , сразу , без поллитра , не разберёшь

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

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

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

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

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

а вы сами делайте выводы, что вам лучше.

Спасибо. Да я пока вырабатываю определённые подходы решений.

Ну а если так? Мне кажется весьма удобно после IF  сделать обе кавычки , чтоб сразу видеть , что он выполнит по выполнению условия.

Для наглядности обе кавычки выделил красным.

 

2017-10-24_175632.png

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

Вот я вам покажу кусок кода , наверное далекого от идеала. Зато все понятно, и "безполлитра"

Как убрать goto, чтобы все так же было понятно

int main(void)
{
	init_ ();
	while (1)
	{
		CYCLE:
		if(bitisset (PINB, CANNAL_1)) 
		  {
		  sec_3 = 0; 
		  goto m_0;
		  }
		else 
		    {
			 _delay_ms(20);
			 sec_3++;
             cli ();
            } 
		 if (sec_3 ==19)
		   {
		     sec_3 = 0;
			 goto   m_3;
		   }  
		  	                  
		 else goto CYCLE;
		  
	
m_3:  			
			Value_ee = eeprom_read_byte(&data_0); // считываем байт из EEPROM и помещаем его в "Value_ee"
			if (Value_ee == 0xFF)
			   {            
				Value_ee = 0;
				eeprom_write_byte(&data_0, Value_ee); // записываем "Value_ee" в EEPROM  
				setbit (PORTB, SIG);
				_delay_ms(125);
				clrbit (PORTB, SIG);
				goto CYCLE;
			   }
			else
			   {
				Value_ee = 0xFF;
				eeprom_write_byte(&data_0, Value_ee); // записываем "Value_ee" в EEPROM  
				setbit (PORTB, SIG);
				_delay_ms(16);
				clrbit (PORTB, SIG);
				goto CYCLE;
			   }
			//--------------------------------------
m_0:			
              	if(bitisset (PINB, CANNAL_2)) 
		          {
		           sec_3 = 0; 
		           goto m_2;
		           }
		        else 
		            {
			         _delay_ms(20);
			         sec_3++;
					 cli ();
                    } 
		          if (sec_3 ==19)
		             {
		               sec_3 = 0;
			           goto   m_1;
		             }  
		          else goto m_0;

m_1:

                 Value_ee = eeprom_read_byte(&data_1); // считываем байт из EEPROM и помещаем его в "Value_ee"

// и так далее....................................................

 

Опыт - это то, что получаешь, не получив того, что хотел

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

2 минуты назад, wws63 сказал:

Как убрать goto, чтобы все так же было понятно

Я бы , вместо меток , сделал бы отдельные функции. Или даже одну , но с передачей разных параметров . И делал бы вместо  goto  вызовы функции(ций).

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

C моей точки зрения писать несколько операторов в одной строке - это плохо. Например, как такое отлаживать? Да и не очевидно, где блок оператора if...

Я бы делал так

if(...){
	...
} else {
	...
    if(...){
    } else {
      ...
    }
}

 

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

Вот я вам покажу кусок кода , наверное далекого от идеала. Зато все понятно, и "безполлитра"

А я вот увидел метку CYCLE, а где она по коду - искал долго. А там еще несколько меток, и поди пойми, куда какая ведет и для чего. Тем более что простыня такая у вас большая. Одно из таких же неписанных правил приличия для программиста звучит так: если функция не умещается целиком на одном экране - это плохо написанная функция. то же самое и у вас. Целиком не помещается, а блоков кода, каждый из которых можно рассматривать отдельно (умещаясь в экран) не выделено... Вот вы как раз привели пример того, что бывает при увлечении goto :)

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

Я бы , вместо меток , сделал бы отдельные функции. Или даже одну , но с передачей разных параметров . И делал бы вместо  goto  вызовы функции(ций).

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

@wws63 , я вам даю ссылку на статью специально по теме "как организовать программу". Мне кажется, следуя этим принципам, вы познаете дзен и научитесь обходиться без goto :) Нисходящее программирование на простом примере 

Там нет конкретно про goto, но есть про то, как разделять программу на функции и зачем.

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

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

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

А я вот увидел метку CYCLE, а где она по коду - искал долго.

А я первую же  m_0:   не сразу нашёл )) . Жуть! Даже метки не по порядку нумерации идут.((

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

Вторая - плохая, не одобряю

Ситуации разные бывают. Например записать в память разные значения. Не писать же для каждого случая отдельную функцию?

 

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

несколько операторов в одной строке - это плохо.

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

в один выдох так сказать. 

 

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

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

Просто они завершают одну мысль.

Ну, с моей точки зрения, мысль выражается следующими категориями языка Си: оператор, блок операторов, функция, модуль... Если мысль выражается несколькими операторами, то для того она в фигурные скобки и помещается, и в этом случае (с моей точки зрения!), когда каждый оператор на отдельной строке - при желании проще заремарить выборочно, или добавить условие, меняющее порядок выполнения... мало ли что потребуется в ходе разработки/отладки. А в одной строке это очень неудобно делать - ну и нафига тогда?

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

Например записать в память разные значения. Не писать же для каждого случая отдельную функцию?

Само собой, ситуации разные. Я воспринял вашу идею как функция, которая (в зависимости от параметров) пишет в память, читает из памяти, сохраняет в EEPROM или считывает оттуда, а так же вычисляет азимут на Полярную звезду :) Я против таких функций.

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

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

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

когда каждый оператор на отдельной строке

Скорее всего Вы правы. Сейчас по прошествии времени смотрю на свой код и разделение операторов точкой с запятой выглядит не наглядно. Т.е. зрительно разделить операторы 

довольно сложно. А вот когда писал одна строка казалась лучше.

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

Я против таких функций.

Я тоже против. Когда написал и закралась даже нехорошая мысль , что неправильно поймут , что можно всё это запихать в одну функцию. 

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

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

А вот так , лучше выглядит?

123.png

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

41 минуту назад, SDD39 сказал:

Жуть! Даже метки не по порядку нумерации идут.((

 

Не знаю как у вас, у нас метки расставляются в блок-схеме алгоритма

Опыт - это то, что получаешь, не получив того, что хотел

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

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

Не знаю как у вас, у нас метки расставляются в блок-схеме алгоритма

В том и беда, что для понимания логики работы с goto требуются дополнительные усилия, например, наличие блок-схемы алгоритма, тогда как аккуратно написанная программа без goto читается с листа сама.

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

А вот так , лучше выглядит?

Опять же, по моему субъективному взгляду, следует соблюдать уровни отступов по принципу "этот - следующий", т.е. от оператора if его "тело" должно быть на "следующем" уровне, а у вас на после-после-после-после-следующем... а else должно быть на том же уровне, что и if - чтобы не путаться, какой else какому if-у принадлежит.

И смотрите: даже в вашем примере видно, что закрывающая блок скобка теряется - полоска, которую рисует ваша IDE теряется... закрывающая скобка должна быть на строке в гордом одиночестве, четко на уровне своего оператора...

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

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

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

Зато все понятно, и "безполлитра"

А знаете что не понятно?

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

А когда выбегаем из оператора по goto  и начинаем шататься где попало, то становится жутко непонятно чем это всё закончится с точки зрения корректного завершения оператора или функции

из которых мы выбежали. А это попахивает глюками. 

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

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

Если я Вас правильно понял то выглядеть должно так?

 

123.png

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

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

выглядеть должно так?

Как по мне, так да.

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

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

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

Как по мне, так да.

Спасибо ! Лучше сразу приучиться правильно писать , чем потом переучиваться.

@ARV  И ещё актуальный вопрос. Есть оператор * умножения и  указатель типа  *temp   к примеру. Как здесь не путаться где умножение а где указатель?

Т е иногда это может выглядеть так  a**temp . 

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

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

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

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

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

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

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

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

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

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

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

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