Программно-управляемый ввод / вывод — КиберПедия 

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

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Программно-управляемый ввод / вывод

2020-03-31 218
Программно-управляемый ввод / вывод 0.00 из 5.00 0 оценок
Заказать работу

Введение

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

Любое встроенное приложение (от холодильников до приборов в тепловозе) обычно включает в себя ряд функций. Даже простое приложение контроля температуры, например, включает в себя ряд задач, таких как чтение пользовательского ввода, вывода данных на дисплее, чтение выходных данных датчика температуры, и контроль на выходе вентилятора / нагревателя. Пропускная способность контроллера должна быть разделена между всеми этими задачами таким образом, что, для конечного пользователя, функции, как представляется, быть выполнены параллельно. Проектирование этого принимается решение фоновый процесс-то есть, основной процесс для контроллера - и прерывания контроллер через регулярные промежутки времени для всех других задач. Обратите внимание, что там может быть асинхронные прерывания, которые, например, могут произойти в любой произвольный момент: сигнал от таймера, сетевой карты или дискового накопителя, нажатие клавиш клавиатуры, движение мыши. Факт возникновения в системе такого прерывания трактуется как запрос на прерывание (англ. Interrupt request, IRQ). Правильное обращение прерывания, таким образом, становится важнейшей задачей.

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

 

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


 

Loop()

{

digitalWrite (pin, state);

}

Blink()

{

state =! state;

}

 

В приведенном примере мы настраиваем 13 порт на запись под переменную «ПИН» в то время как процедура обработчик прерывания под событие CHANGE на функцию «БЛИНК» (мигать) которая в свою чередует состояние диода, тем самым мы видим мигание, которое инициируется и поддерживается в циклической «бесконечной» функции LOOP которая посылает на порт «ПИН» значение состояние которое изначально задано, тем самым триггер при изменении сигнала на порт с диодом вызывает прерывание на обработчик BLINK который вновь инвертирует значение состояния, тем самым замыкая цикл.

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

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

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

Стандартная система получает миллионы прерываний в течение его эксплуатации, в том числе полурегулярной «Таймер» прерывание, которое периодически выполняет ОБСЛУЖИВАНИЕ и системные решения планирования. Он также может получать специальные виды прерываний, таких как НМИ (Немаскируемое прерываний) и SMI (System Management прерываний).

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

В большинстве компьютерных систем, прерывания обрабатываются как можно быстрее. Когда прерывание получил, любой текущей деятельностью остановился и обработчик прерывания выполняется. Обработчик будет вытеснять любой другой запущенные программы и деятельность системы, которые могут замедлить всю систему, а также создавать задержек. MRG Realtime изменяет способ прерывания обрабатываются в целях повышения производительности и снижения задержки.

Пример 3.1. Просмотр прерываний в системе

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

cat /proc/interrupts:

$ cat /proc/interruptsCPU1

: 13072311 0 IO-APIC-edge timer

: 18351 0 IO-APIC-edge i8042

: 190 0 IO-APIC-edge rtc0

: 118508 5415 IO-APIC-fasteoi acpi

: 747529 86120 IO-APIC-edge i8042

: 1163648 0 IO-APIC-edge ata_piix

: 0 0 IO-APIC-edge ata_piix

: 12681226 126932 IO-APIC-fasteoi ahci, uhci_hcd:usb2, radeon, yenta, eth0

: 3717841 0 IO-APIC-fasteoi uhci_hcd:usb3, HDA, iwl3945

: 0 0 IO-APIC-fasteoi uhci_hcd:usb4

: 577 68 IO-APIC-fasteoi ehci_hcd:usb1, uhci_hcd:usb5: 0 0 Non-maskable interrupts: 3755270 9388684 Local timer interrupts: 1184857 2497600 Rescheduling interrupts: 12471 2914 function call interrupts: 14555 15567 TLB shootdowns: 0 0 Thermal event interrupts: 0 0 Spurious interrupts: 0: 0

 

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

 

Немаскируемые прерывания

 

Прерывания обычно, как ранее было замечено, маскируются, как правило для разделения приоритетов исполнения в ЦП. Немаскируемое прерывание (NMI), не могут быть проигнорированы, и, как правило, они используется только для критических ошибок в оборудовании.

НМП обычно поставляются по отдельной линии прерывания. Если НМП получена ЦП, то это указывает, что критическая ошибка, и что система вероятно, подвержена к сбою. NMI, как правило, лучшее свидетельство того, что может быть причиной проблемы.

Потому что НМИ невозможно игнорировать, они также используются в некоторых системах, как аппаратный монитор. Устройство посылает поток НМИ которые проверяются с помощью обработчика NMI в процессоре. Если определенные условия - например, прерывания не запускается после определенного промежутка времени - обработчик NMI может производить предупреждение и отладочную информацию о проблеме. Это помогает определить и предотвратить зависания и как следствие отказ системы.

Таким образом, НМП используются как экстренные прерывания с высокими приоритетами.

 

Заключение

 

Очевидно, что каждый микроконтроллер и микропроцессор обрабатывает прерывания несколько иначе, но все они имеют некоторые общие функциональные возможности. В принципе, прерывание вызывает программу приостановить свою текущую деятельность и начать обработку другой ветки в место, в другом месте в памяти. Затем, после того как программа обрабатывает событие, которое вызвало прерывание, подпрограмма обслуживания прерывания (ISR - служба обработчик прерыв.), необходимо перезапустить программу от того, где он ранее был приостановлен.

Электрические, прерывание цифрового сигнала в процессор, что указывает на то что некоторое событие уже произошло. Например, получив серийный информацию, нажатие клавиши или таймер истекает все может генерировать прерывание. Расширение на нажатие клавиши, например, общий способ генерации прерывания является с почтенный 74C923 20-позиционной клавиатуры кодера. Когда вы нажимаете на клавишу, подавлением шумовых данных этого чипа Доступно (DA) сигнал становится высоким и остается там, пока вы не отпустите кнопку. Связывая этот сигнал на один из входов прерываний в ЦПУ, процессор может ощущать нажатие клавиши, как только это произойдет.

Прерывания бывают трех вариантах: по фронту, уровень-срабатывает и их комбинации. Как следует из названия, по фронту прерывания произойдет при переходе сигнала из одного состояния в другое, в первую очередь с нуля в One. Этот тип прерывания полезно для мимолетного сигнала, не длится достаточно долго для процессора признать его с помощью опроса I/O или когда сигнал может длиться долго, но значимое событие, когда, что первый сигнал становится активным, Опять же, нажатие является отличным примером приложения, которое для края вызвало прерывание. С точки зрения прерывание, в количество времени, вы держите ключ вниз не имеет значения. Все, что важным является определить, когда событие сначала происходит.

В отличие от этого, уровень-срабатывает прерывания в некоторых отношениях, как опрос исключением того, что процессор управляет опроса без вмешательства программы. Как правило, процессор образцы прерывания, поступающие на определенное время в течение каждого цикла шины, такие как государственного Т2 для микропроцессора Z80. Если прерывание не работает, когда процессор образцы его, CPU не видит его. Одно из возможных применений этого типа прерывания является сведение к минимуму ложные сигналы от шумной линии прерываний.

Последние прерывание типа представляет собой гибрид, в котором аппаратные средства не только выглядит для перехода, но она также подтверждает, что сигнал прерывания остается активным в течение определенного периода времени. Общая гибрид прерывание NMI (немаскируемое прерывание) вход. Поскольку, как правило НМИ сигнал основные или даже катастрофические-системных событий, хорошая реализация этого сигнала пытается гарантировать, что прерывание действительно, проверив, что он остается активным в течение определенного периода времени. Это 2-х ступенчатый подход помогает избежать ложных прерываний от воздействия на систему.

Обработка прерывания

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

Обработка прерываний имеет некоторые основные требования от процессора. Прежде, чем это может ответить на прерывание, процессор должен ждать «прерываемые» состояния в его обработке. Например, если процессор пишет в память, он должен ждать, пока записи не будет сделано перед обработкой прерываний. После того, как CPU обнаруживает прерывание, его первое действие, чтобы сохранить всю информацию, нужно будет возобновить нормальную обработку сразу прерывания закончена. По крайней мере, чип сохраняет программы по борьбе (ПК). Этот процесс аналогичен вы, поместив палец в книге, когда кто-то прерывает вас, пока вы читаете. После перерыва уходит, вы точно знаете, где, чтобы продолжить.

После сохранения этого «закладки» информации, процессор изменяет значение ПК на фиксированном месте в памяти процессора, который содержит указатель на инструкции называемый подпрограмма обслуживания прерывания (ISR) - Это говорит процессору, как бороться с прерыванием. Когда ISR отделки, процессор восстанавливает первоначальную ПК и весело продолжает, как будто ничего не случилось.

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

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

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

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

Наконец, прерывание не будет полным без обсуждения того, что происходит внутри ISR. Есть два основных правила. Во-первых, ISR необходимо сохранить затем восстановить все данные процессора, памяти и ввода / вывода ресурсов, которые он использует. Например, эти данные могут включать в себя регистры процессора или памяти, такие как вспомогательной области для чисел с плавающей точкой пакета (многие из которых таковыми не являются). Во-вторых, он должен вернуться из ISR как можно быстрее. Причина для этого правила является то, что ISR не должны, как правило блокировать новые прерывания и до окончания ISR не запустится новое прерывание. Таким образом, ISR должна делать как можно меньше, для того что бы прерывания занимали мало времени, как это возможно. Для процессоров нормальным обычно будет ISR выполняющиеся в менее 40 мкс (данные с 1995). Очевидно, что 100-МГц Pentium и 4 МГц 8051 имеют очень разные временные масштабы, но концепция все та же выйти быстро!

 


 

Список литературы

 

1. https://ru.wikipedia.org/wiki/Прерывание

2. http://arduino.cc/en/Reference/attachInterrupt

.   https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_MRG/

.   https://kernel.org/doc/htmldocs/

 


 

Приложение

 

Драйвер клавиатуры на базе архитектуры Intel®

Решение, которое я нашел в том, чтобы написать что-то для прерывания клавиатуры и отключить регулярное обработчик прерывания клавиатуры в первую очередь. Так оно определяется как статический символ в исходных файлов ядра (в частности драйвера / / keyboard.c), нет никакого способа, чтобы восстановить его. Перед insmod'ing этот код, выполните на другом терминале sleep 120; reboot, если вы цените вашу файловую систему.

Этот код связывает себя IRQ 1, который является IRQ клавиатуры контролируемого в соответствии с архитектурой Intel. Потом, когда он получает прерывание клавиатуры, он читает состояние клавиатуры (это цель inb (0x64)) и скан-кода, который возвращает значение с клавиатуры. Затем, как только ядро думает, что это возможно, он выполняет got_char который дает код ключа, используемого (первые семь бит скан-кода) и была ли нажата кнопка на клавиатуре его (если 8-й бит равен нулю) или отпускании (тогда это один).

 

Пример 4.1. intrpt.c

 

/ *

* Intrpt.c - обработчик прерывания.

*

* Copyright (C) 2001 Питер Джей Зальцман

* /

 

/ *

* Необходимые заголовочные файлы

* /


 

/ *

* Стандартный модулей ядра

* /

#include <Linux / kernel.h> / * Мы делаем ядра работает * /

#include <Linux / module.h> / * В частности, модуль * /

#include <Linux / sched.h>

#include <Linux / workqueue.h>

#include <Linux / interrupt.h> / * Мы хотим прерывания * /

#include <ASM / io.h>

 

#define MY_WORK_QUEUE_NAME «WQsched.c»

struct workqueue_struct * my_workqueue;

 

/ *

* Это будет вызван ядром, как только это безопасно

* Сделать все нормально, разрешенный модулей ядра.

* /void got_char (void * scancode)

{(KERN_INFO «скан-код% X% С. \ п»,

(INT) * ((Char *) scancode) & 0x7F,

* ((Char *) scancode) & 0x80? «Отпущено»: «Нажата»);

}

 

/ *

* Эта функция ослуживает клавиатуру в прерывании. Он читает актуальны

* Информация от клавиатуры, а затем ставит не критичны по времени

* Часть в очереди. Это будет работать, когда ядро сочтет это возможным.

* /_t irq_handler (INT IRQ, void * dev_id, struct pt_regs * regs)

{

/ *

* Эти переменные являются статическими, так как они должны быть

* Доступны (через указатели) на нижней половине дня.

* /INT initialised = 0;unsigned char scancode;struct work_struct task;

unsigned char status;

 

/ *

* Чтение состояния клавиатуры

* /= inb (0x64);= inb (0x60);

(initialised == 0) {_WORK (& task got_char, & scancode);= 1;

} else {_WORK (& task got_char, & scancode);

}

_work (my_workqueue, & task);

 

return IRQ_HANDLED;

}

 

/ *

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

* /init_module ()

{_workqueue = create_workqueue (MY_WORK_QUEUE_NAME);

 

/ *

* С обработчик клавиатуры не будет сосуществовать с другим обработчиком,

* Как США, мы должны отключить его (освободить IRQ) прежде, чем мы делаем

* Что-нибудь. Так как мы не знаем, где он находится, нет никакого способа, чтобы

* Возможности переустановить его - поэтому компьютер придется перезагрузить

* Когда мы сделали.

* /_irq (1, NULL);

 

/ *

* Запрос IRQ 1, IRQ клавиатуры, чтобы перейти к нашей irq_handler.

* SA_SHIRQ означает, что мы готовы иметь суются обработчики на этом IRQ.

* SA_INTERRUPT могут быть использованы, чтобы обработчик в быстрого прерывания.

* /request_irq (1, / * о IRQ клавиатуры номер на ПК * /

irq_handler, / * наш обработчик * /_SHIRQ, «test_keyboard_irq_handler»,

(void *) (irq_handler));

}

 

/ *

* Убирать

* /cleanup_module ()

{

/ *

* Это только здесь для полноты картины. Это совершенно не имеет значения, так как

* Мы не есть способ восстановить нормальную прерываний от клавиатуры, так

* Компьютер совершенно бесполезно и должен быть перезагружен.

* /_irq (1, NULL);

}

 

/ *

* Некоторые функции work_queue связанные только доступны GPL лицензированных модулей

* /_LICENSE («GPL»);

 

На практике обращения с IRQ может быть немного сложнее. Оборудование часто разработаны таким образом, что цепи двух контроллеров прерываний, так что все IRQs от контроллера прерываний В каскадированы в определенной IRQ от контроллера прерываний А. Конечно, что требует, чтобы ядро находит, какие IRQ это действительно было потом, и что добавляет накладные расходы. Другие архитектуры предложить какую-то особую, очень низкие накладные расходы, так называемый «быстрый IRQ» или FIQs. Для того чтобы воспользоваться им требуется обработчики быть написан на ассемблере, поэтому они не очень вписывается в ядро. Они могут быть сделаны, чтобы работать похожи на других, но после этой процедуры, они больше не быстрее, чем «обычных» прерываний. SMP с поддержкой ядра, работающие на системах с более чем одним процессором нужно решить еще один грузовик проблем. Это не достаточно, чтобы знать, если некоторые прерываний имеет случилось, это также важно, по какой процессора (ов) это было для. Люди по-прежнему заинтересованы в более подробной информации, возможно, захотите сделать веб-поиска для «APIC» сейчас;)

Введение

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

Любое встроенное приложение (от холодильников до приборов в тепловозе) обычно включает в себя ряд функций. Даже простое приложение контроля температуры, например, включает в себя ряд задач, таких как чтение пользовательского ввода, вывода данных на дисплее, чтение выходных данных датчика температуры, и контроль на выходе вентилятора / нагревателя. Пропускная способность контроллера должна быть разделена между всеми этими задачами таким образом, что, для конечного пользователя, функции, как представляется, быть выполнены параллельно. Проектирование этого принимается решение фоновый процесс-то есть, основной процесс для контроллера - и прерывания контроллер через регулярные промежутки времени для всех других задач. Обратите внимание, что там может быть асинхронные прерывания, которые, например, могут произойти в любой произвольный момент: сигнал от таймера, сетевой карты или дискового накопителя, нажатие клавиш клавиатуры, движение мыши. Факт возникновения в системе такого прерывания трактуется как запрос на прерывание (англ. Interrupt request, IRQ). Правильное обращение прерывания, таким образом, становится важнейшей задачей.

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

 

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


 

Программно-управляемый ввод / вывод

 

Одним из распространенных видов управления ввода / вывода это программно-управляемый ввод / вывод, (часто называемый опросный В/В (от англ. poll - досл. голосовать, понятие в программировании заключаемое в периодической проверке по определенному интервалу времени о совершения какого-либо события и в соответствии выполнения процедуры обработки этого события)). Здесь все выполняется под контролем процедуры обработчика В/В и вход или выход инициируется этой процедурой.

Порядок обращения будет требовать информацию о статусе (синхронизация информации) от устройства (например, является ли устройство готово к приему данных). Эта информация, как правило, получают с помощью второго входного сигнала от устройства; один бит, как правило, достаточно, так что один входной `` порт '' может быть использован для сбора статуса или согласования информации от нескольких устройств ввода / вывода. (Порт имя, данное подключение к устройству; например, в ячейку памяти, в которую устройство ввода / вывода отображается). порт, как правило, реализуется в виде регистра (возможно набора из D тригеров), который также выступает в качестве буфера между процессором и реальному устройству ввода / вывода. Слово порт часто используется для обозначения самого буфера.

Как правило, там будет несколько устройств, связанные с процессором; процессор периодически проверяет `входной порт` статус, под управлением программы в соответствии с процедурой обработки ввода / вывода. Если устройство ввода / вывода требует обслуживания, это будет означать эту потребность путем изменения его вклад в `состояния '' порта`. Когда программа управления определяет, что это произошло (с чтения статуса порта), то соответствующая операция будет выполнена на устройства ввода / вывода, которые запрашиваемой услугой. Типичная конфигурация может выглядеть несколько, как показано на рисунке. Выходы, обозначенные `` рукопожатие в '' будут подключены к битов в `состояния` '' порта. Вход, обозначенный `` рукопожатие в «, как правило, быть получены путем соответствующей логикой декодирования, когда порт, соответствующий устройства был адресован.

 

Программно-управляемый ввод / вывод

 

Ввод/вывод управляемый программно имеет ряд преимуществ:

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

Порядок, в котором устройства обслуживаются определяется программой, этот порядок не обязательно фиксированной, но могут быть изменены с помощью программы, в случае необходимости. Это означает, что приоритет `` '' устройства могут быть изменены в соответствии с программным управлением. (`` Приоритет '' из определяет, какие из множества устройств, которые одновременно готовы к обслуживающей прерывание службе на самом деле будет обслуживаемых первым).

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

Возможно, главный недостаток программно-управляемом вводе / выводе это то, что много времени может быть потрачено на тестирования входов состояний устройств ввода / вывода, когда устройства не нуждаются в обслуживании. Это явление называется `` занятое ожидание '' или `` цикл ожидания «, в течение которого устройства ввода / вывода «опрашиваются» но не на операции ввода / вывода выполняющиеся не очень много времени тем самым происходит простой впустую процессором, когда есть другая работа, которая может быть выполнена за это время. Кроме того, если конкретное устройство имеет свои данные, доступные только в течение короткого времени, данные могут быть пропущены, потому что вход не был протестирован в соответствующее время, что может привести к трудно улавливаемым ошибкам и неопределенным поведениям системы.

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

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

 

while (1) { // Бесконечный цикл t = get_room_temperature();tu = get_user_temperature();

if (t > tu) // температура комнаты превышает заданную

set_heat_off(); // отключить _heat_on(); // включить отопление

sleep (SLEEP_TIMER); // ожидание-простой системы на опр. время

}

 


Поделиться с друзьями:

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

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

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

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.112 с.