На чем писать  

553 пользователя проголосовало

  1. 1. Что чаще используете в разработках?

    • Assembler
      153
    • C
      280
    • Что-то еще
      59


383 сообщения в этой теме

gvl    1

А по сути “Почему количество просмотров этой ветки так велико?”

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


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

Кол-во просмотров велико так же, как и кол-во неопределившихся в типе МК и языке программирования. В то же время "насаждать" свое мировозрение в этом вопросе не самое лучшее дело. Человек сам должен выбрать, что ему подходит больше. Вот только, все познается в сравнении. И лучше самому провести сравнение, а для этого нужно (опять же самому) "пощупать" всех претендентов на выбор и, очень желательно, начинать делать это с самого начала, шаг за шагом, осваивая азы. Слушать же вечный спор гуру и по нему выбирать - это не совсем разумно.

  • Одобряю 1

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


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

Геннадий

Тема большая, а вопросов много. Можно сказать, что это тупик, однако, мои речи к начинающим: не бойтесь ассемблера. Ассемблер + описание работы МК + Ваше стремление к познанию + Ваше ЗНАНИЕ предмета (поставленной задачи) - всё осилят!

Вот в 1995 году поступило интересное предложение по поводу записи диспетчерских переговоров, но при одном условии – система должна быть ’закрытой’, т.е. никто и никогда, даже зная работу с винчестером, не смог бы редактировать, изменять… и т.д. эти записи, она должна иметь минимальное время на восстановление после завершения аварийной ситуации.

PC тогда были 486-100МГц, а требования по скорости обмена с периферией большие (Интернета-нет, MSDNа-нет – один только интерактивный дизассемблер). Windows тогда была закрыта и очень даже круто. В то время многие даже не знали, что есть три режима процессора (начиная с 286): совместимости с DOS(обыкновенный 8086), виртуальный режим (в котором запускаются обыкновенные DOS приложения) и защищенный режим – в котором система занимает 0 кольцо, а затем всех контролирует через доступные механизмы (0 кольцо -PC превращается в обыкновенный МК (но уже Макро Контроллер))(давно этим не занимался, что-то, может быть и упустил!). Си и Паскаль тогда этим делом не занимались, а лишь предоставляли убогие интерфейсы VCPI и DPMI. Зато инфы на дисках и собственного дизассемблирования хватало для построения системы.

Короче, за полгода была написана операционная среда без Си и Паскаля! – всё и GUI (в том числе) как в Windows 3.1 – на ассемблере. Но PC стал контроллером!

Это закидуха тем, кто думает, что в этом мире всего хватает (в том числе и сторонних библиотек) для того, чтобы они сделали то, чего хотят!

Все эти замечания не по теме, которую я думаю продолжить, а в порядке полемики.

Не думал, что сразу отвечу на вопрос о многообразии PC в 1995г.(каждый волен выбирать, что ему нравится!)

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

И ещё... Вы не дослушались(не дочитались) до того, что я ещё не сообщил(или не сказал)!

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


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

Поскольку далеко зашёл от первоначальных планов, могу рассказать, чем ЯВУ отличаются от Ассемблера.

ЯВУ подменяют интеллект программиста на собственный интеллект - понятия и собственный 'размышлизм'. Поэтому то, что Вы пишете на ЯВУ не совпадает (а иногда и совсем не совпадает с тем, что Вы пишете или думаете). Ассемблер Вам друг, а не Враг!

  • Одобряю 1

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


Ссылка на сообщение
Поделиться на других сайтах
Goodefine    96
... могу рассказать, чем ЯВУ отличаются от Ассемблера.

ЯВУ подменяют интеллект программиста на собственный интеллект - понятия и собственный 'размышлизм'. ..

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

  • Не одобряю 1

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


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

Это не бред, а попробуйте пристыковать CodeVision,например, к своему коду...

Единственное, что Вы можете пристыковать к своему коду - разработки программистов , таких как Jack Tidwell...

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


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

Ещё по поводу бреда - чаще изучайте листинги!

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


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

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

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


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

Насчет Ассемблера согласен - друг и еще какой! Вот только понять его по-началу сложнова-то, но зато потом...! Я приверженец "складывания" программы "по-кирпичикам" (как и схемы - по транзисторам). Потому как только таким способом можно получить компактный и устойчивый код, выбирая из массы вариантов решения алгоритма один, но "обкатанный" и продуманный.

Вот пример:

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

Режим пониженного энергопотребления не конфигурировался, а в коде была такая последовательность:

Метка1:

      Sleep

      Rjmp Метка1

Примеров отрицательных много, всех не перечислить. Правда это делается заметно только после дизассемблирования. Что только не "вытворяет" процессор, чтобы получить смещение на адрес переменной в ОЗУ, для ее чтения или модификации (записи/перезаписи). Хотя ее адрес есть значение постоянное и достаточно выполнить в ассемблере одну команду: sts(lds) адрес,данные, язык высокого уровня "пойтить на такие дела" не может, ведь он высокого уровня, да еще и с интеллектом.  :) Вот и начинается вычисление текущего адреса в теле программы, сложение/вычитания непонятных констант, перенос пар регистров туда-сюда и тд. В итоге процессор получает смещение и адресуется к ячейке через косвенную адресацию. А потом катастрофически не хватает размера флешь, для не очень большой, казалось бы, программы. Вот поэтому, я лично, выбрал Ассемблер, чтобы иметь возможность "управлять" программой ПО СВОЕМУ усмотрению, а не полагаться на библиотеку, написанную кем то, да еще не совсем удачно.

Изменено пользователем Геннадий
  • Одобряю 1

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


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

Геннадий

Я рад за Вас - тема большая, а истина одна-тяжело начало,а результат победа!

Полемика

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

, но вскоре доступный(mega)

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


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

Существует ли avr-gcc под DOS или другой компилятор С?

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


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

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

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


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

Проблема заключается в то, что Путаница в вопросах ЯВУ(ЯзыкахВысокогоУровня) возникла из-за “рекламы” Си-подобных языков - об их ”всеядности” и всемогущей переносимости.

Однако для ЕmbeddedSystem (ВнедряемыхСистем – по-русски-микроконтроллеров для управления и т.д.) – это полный абсурд! Посудите сами – порт G mega128 имеет аналог в Pic?, ADSP…???

Задумайтесь! - и не гоняйтесь за “универсальным лекарством”. Тут требуется кое-что другое.

  • Одобряю 1

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


Ссылка на сообщение
Поделиться на других сайтах
BohdanT    0
Дальнейшее продолжение Object Pascal - OBERON(Никлаус Вирт и его последователи) - он доступен в понимании и его описание есть на многих русско-язычных сайтах(engl даже для ARM7(2005)). OBERON набирает обороты, а Delphi - это отряд без командира...

)

Продолжение следует...

У меня есть компилятор Oberon-07 для AVR от ETH (Оберон-07 это упрощенная версия оберона).

Он рабочий, компилит/линкует.

Хочу его подружить с AVR студией, что бы можно было использовать отладчик, если есть желающие присоединится - пишите в личку (застрял с Dwarf-2).

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


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

писал на ассемблере, потом перешел на Си

знание асма хорошее подспорье - понимаешь во что транслируется Сишный код.

однако писать большие проекты на ассемблере я не хочу

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


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

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

Классы позволяют абстрагироваться от подробностей реализации алгоритмов сложных структур данных. Следует акцентировать внимание на наличие шаблонов и перегрузки оператора. Первый позволяет программисту не реализовывать многократно классы и подпрограммы для обработки различных типов данных, а лишь 1 раз описать их шаблон. Перегрузка оператора позволяет сделать код пользователя, использующий класс с данным оператором, наиболее наглядным, понятным и понимаемым с первого раза. Она позволяет с лёгкостью проводить манипуляции со сложными типами данных на абстрактном уровне, не прибегая к вызову подпрограмм, уменьшающих наглядность. К примеру, лучше записать умножение 2-х матриц A и B неопределённой размерности в виде С=A*B, чем MatrixMult(C,A,B,n1,n2,n3), n1, n2, n3 – размерности матриц C, A, B.

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

Классы - это наглядность и простота.

  • Не одобряю 1

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


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

Да, для микроконтроллеров это жизненно необходимо ! Все в классы !

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


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

И чем это математика отличается от одного МК к другому? Кто же мешает описать один раз алгоритм и вызывать его многократно, передавая параметры через регистры?

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


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

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

  • Не одобряю 1

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


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

Пишу на ассемблере,на днях попробовал си мое мнение ассемблер намного понятнее там что написал то и получил а Си больше походит на магию,одни указатели чего стоят, а на ассемблере это всего лишь команда ldd.

  • Одобряю 1

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


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

Пишу на ассемблере,на днях попробовал си мое мнение ассемблер намного понятнее там что написал то и получил а Си больше походит на магию,одни указатели чего стоят, а на ассемблере это всего лишь команда ldd.

ИМХО:

Согласен.Как работать с указателями тяжело понять (покрайней мере я на СИ уходил тоже с асма и не сразу врубился, как их использовать), но когда разберетесь, то от их использования за уши не оттащишь. :D

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: Денис Оробей
       Помогите написать простую задачку (для вас - простую, а я не шарю), на плате контроллера-конструнтора KIT-8515 нужно  сделать вот это: "Пусть движковыми переключателями задаются два четырехзначных операнда.  Напишите и протестируйте программу, при работе которой после нажатия кнопки 1 операнды складывались, а при нажатии кнопки 2 операнды вычитались, а результат операции выводился на светодиоды"
      Прикреплённый файл - начало задачки.
      Заранее благодарствую:)
      123.rar
    • Автор: Николай Зубий
      Как сделать  устройство, выводящие на индикатор время, прошедшее с момента последней перезагрузки контроллера?
    • Автор: forestdozor
      Здравствуйте!

      Мне нужно измерить длительность импульса. Для этого сначала применял внешнее прерывание, а теперь перешел на режим захвата таймера в Atmega 328.
      Однако сейчас происходит странное: Через определенное таймер просто останавливается. Гугл результатов не дает, ни у кого захват таймера 1 не останавливается.
      Подскажите пожалуйста, что делать?
      Среда разработки CodeVisionAVR v3.12. Сейчас попробовал версию 3.3, толку нет. Не работает. Код максимально упростил, но по прежнему толку ноль.
      Переполнение таймера 0 так же работает отлично, до тех пор, пока что-то не произойдет с прерыванием по захвату. Как только что-то произошло - мк останавливается...
      Может немножко подождать, и увеличить значение счетчика current_timp еще на пару значений... Совсем не знаю что делать.
       
       
      interrupt [TIM1_OVF] void timer1_ovf_isr(void)
      {
      TCNT1H = 0x00;
      TCNT1L = 0x00;
      }
      // Timer1 input capture interrupt service routine
      interrupt [TIM1_CAPT] void timer1_capt_isr(void)
      {
       
             TCNT1H = 0x00;
             TCNT1L = 0x00;           // Это уже уровень танцев с бубном "авось поможет" - не помогает.
         
              current_timp++;          // Все упрощено до максимума. Мне бы он хоть количество периодов для начала...
              
        //  }
      }
      // Прерывание по переполнению первого таймера
      interrupt [TIM0_OVF] void timer0_ovf_isr(void)
      {
      // Обнуление счетного регистра.
      TCNT0=0x00;

          
          counter ++;
          if (counter > 10)
          {
                  lcd_clear();
                  sprintf(buffer,"%d us", current_timp);
                  lcd_gotoxy(0,0);
                  lcd_puts(buffer);
                  counter = 0;
          }
          
          
      }

      // Главный цикл программы
      void main(void)
      {

      #pragma optsize-
      CLKPR=(1<<CLKPCE);
      CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
      #ifdef _OPTIMIZE_SIZE_
      #pragma optsize+
      #endif

      // Port B initialization
      // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
      DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
      // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
      PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
      // Port C initialization
      // Function: Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
      DDRC=(0<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
      // State: Bit6=T Bit5=1 Bit4=1 Bit3=1 Bit2=1 Bit1=1 Bit0=1
      PORTC=(0<<PORTC6) | (1<<PORTC5) | (1<<PORTC4) | (1<<PORTC3) | (1<<PORTC2) | (1<<PORTC1) | (1<<PORTC0);
      // Port D initialization
      // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
      DDRD=(1<<DDD7) | (1<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
      // State: Bit7=1 Bit6=1 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
      PORTD=(1<<PORTD7) | (1<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
      // Делители таймера 0 рассчитаны таким образом , что его тактовая частота = 15,625 КГц. Расчет был на применение в схеме семисегментников, но с LCD индикатором будет информативнее.
      TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
      TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00);
      TCNT0=0x00;
      OCR0A=0x00;
      OCR0B=0x00;
       
      // Настройка таймера 1
      TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
      TCCR1B=(1<<ICNC1) | (1<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
      TCNT1H=0x00;
      TCNT1L=0x00;
      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=0x00;
      OCR1BL=0x00;
      // Разрешение прерывания по переполнению таймера 0
      TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
      // Timer/Counter 1 Interrupt(s) initialization
      TIMSK1=(1<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (1<<TOIE1);
    • Автор: voltex
      Всем привет! Подскажите, пожалуйста, как правильно считать данные с внешней eeprom по шине spi, в данном случае 25LC256.
      Написал код ссылаясь на даташит. Собрал схему в протеусе, подключил spi отладчик и вот что получил в итоге. Так же не могу проверить получается записать данные в память или нет. Весь код прикрепил.
       

      main.c
    • Автор: CUBE
      Не могу запустить асинхронный режим. 
      Ниже будет представлен код которым пытаюсь отладить. Там в 1 коде идёт работа от внутреннего источника таков (стоит 1МГц).  После 5 миганий таймер должен перейти в асинхронный режим и мигать с частотой в 1 Гц. У меня происходит 5 миганий потом ничего. Фьюзы менять пробовал, ничего не дало, сейчас дефолт. Корпус кварца к земле тянуть пробовал - безрезультатно. 
      Возможно что-то в подключении накосячил, если не видно на фото ниже, спрашиваете, нужно будет - нарисую схему. 
      Компилятор Atmel Studio 7
      Шью через Sind Prog 2.1.1 + USBasp 2.0
      Вот код: 
      .macro outi 
       ldi r16, @1 
       out @0, r16 
      .endm 
      .org $000 
      rjmp reset 
      .org $001 
      reti 
      .org $002 
      reti 
      .org $003 
      reti 
      .org $004 
      rjmp timer2_ovf 
      .org $005 
      reti 
      .org $006 
      reti 
      .org $007 
      reti 
      .org $008 
      reti 
      .org $009 
      reti 
      .org $00A 
      reti 
      .org $00B 
      reti 
      .org $00C 
      reti 
      .org $00D 
      reti 
      .org $00E 
      reti 
      .org $00F 
      reti 
      .org $011 
      reti 
      .org $012 
      reti 
      .ORG INT_VECTORS_SIZE 
       
      reset: 
      .equ portout=portd 
      .equ ddrout=ddrd 
      .def led=r17 
      .def mask=r18 
      .def counter=r19 
       outi spl,low(ramend) 
       outi sph,high(ramend) 
       
       outi ddrout, 0xff 
       
       outi tccr2, 0b00000111 
       outi timsk, 1«toie2 
       
        
       
        
       ldi led,1«5 
       ldi mask,1«5 
       sei 
      cycle: 
      cpi counter, 10 
      breq offtim 
       rjmp cycle 
       
      timer2_ovf: 
      inc counter 
       out portout, led 
       eor led, mask 
      reti 
        
      offtim: 
      outi timsk, 0«toie2 
      rjmp asinxron 
       
      asinxron: 
       outi assr, 0b00001000 
      back: 
       in r16, assr 
       cpi r16, 0b00001000 
       brne back 
       
        outi tccr2, 0b00000101 
        outi tcnt2, 0 
        outi ocr2, 0 
        outi timsk, 1«toie2 
       
       
      m1: 
      rjmp m1


      Верх меги на фото слева. 
  • Сообщения

    • Вы со своей Кометой 209-ой не успокоитесь никак. Продать надо,...понимаю...
    • Ничего вы в красоте не понимаете ... Эта иранская принцесса по имени Анис-аль-Долех имела 145 любовников, 13 из которых покончили жизнь из-за ее отказа.
    • Если питание 24 вольта, то таймер  и резистор регулировки надо запитать через стабилизатор. А управление происходит через пятый вывод микросхемы. При разном напряжении на этом выводе, меняется скважность и частота выходного сигнала. Можно установить три релюшки, которые будут переключать три подстроечных резистора, которыми, в свою очередь, будут выставлены определённые режимы работы насоса ... Да, параллельно моторчику надо обязательно установить диод.
    • Фото платы под спойлерами      
    • Даже самый подвальный китай - верх инженерной мысли, по сравнению с бредом от автора. За столько лет можно было бы открыть первую ссылку любого поисковика по запросу "как подключать светодиоды" и не тупить изобретая велосипед. А когда вся эта конструкция накроется, ждите новую тему на форуме.
    • 42 (автостопом по галактике), не благодари.   Мне кажется есть простое объяснение столь яркого отношения к халу у разных людей. Оно основывается на эксперименте со скрепками. Если на стол положить небольшую кучку скрепок, не больше 20-ти, то из этой кучи можно с большим успехом вытащить почти любую скрепку так - чтобы она не подцепила за собой соседнюю. С ростом количества скрепок такой фокус исчезает. Уже в процессе добавления скрепок в общую кучу - они сцепляются с другими, образуя длинные связи. И при определённом критическом количестве - достать одну скрепу уже практически невозможно. За одной будет подниматься уже 98% общего веса. Если только очень аккуратно положить, а потом так-же аккуратно поднять, при этом не шевеля всю кучу. Ничего не напоминает? А люди-то разные. Одни способны гордится любой получившейся фигурой монолита, даже без возможности что-то исправить. Всё новое будет посажено на китайский двухсторонний скотч, и заботливо обмотано синей изолентой. При этом комок этого г..  будет даже работать, если только не ковырять его слишком сильно.    А другим требуется жёсткая иерархия и порядок на каждом уровне ступени привилегий. Без перекрёстных связей из разных слоёв программы. Такие проекты очень легко переносятся на новые камни, легко изменяются и дополняются. Всегда можно взять часть, и использовать в другом проекте. Как это происходит в реальности. Для инициализации FMC под халом - требуется три отдельных файла конфигурации, которые тянут за собой ещё около двадцати файлов. При этом нет чёткого места где происходит сама настройка, она почти вся косвенная. Да там есть структура для заполнения, но вот переменные для самой структуры - имеют слишком вольное представление. Приходится искать описание, что к чему подходит и при каких условиях. Прикол, если использовать весь связанный код в одном файле (да, я проверял!!!) - то его длинна будет выше двух тысяч строк!!! Некоторые части этого кода используются однократно, другие имеют перекрёстные связи, а часть - многоразовая. На регистрах получается 100 строчек, и в одном месте. В этом вся разница.