Клонирование жесткого диска часть II.
Важно, чтобы вы прочитали статью по ссылке выше, очень внимательно, потому что она предлагает много полезной информации о HAL в системе Windows. По данным Microsoft, в документации на HAL, «Когда вы создаёте образ Sysprep, образ должен содержать правильный тип HAL на целевом компьютере.» Если тип HAL будет несоответствием, развертывание SysPrep не удастся. Чтобы убедиться, что при развертывании образа у вас правильный HAL, следуйте приведенной ниже таблице:
Так как же определить тип HAL эталонного компьютера, так что бы вы смогли сравнить его с запланированным целевым компьютером и убедились, что они имеют совместимый HAL?
Для этого следуйте следующим шагам:
Например, увидеть как на скриншоте ниже:

Подготовка файлов SysPrep
Создание файла ответов Sysprep.inf
Выполнить SysPrep на эталонном компьютере
Выше приведённая опция позволяет вам продолжить активацию Windows, и не восстанавливать идентификаторы безопасности (полезно, если вы не дублируете компьютер). Если вы копируете компьютер (ссылки и целевые компьютеры должны быть как есть), то вам необходимо создать идентификатор безопасности, два компьютера не должны иметь одинаковый идентификатор.
Нажатие на «Выход» в качестве загрузочного режима отключения не будет перезагружать или выключить компьютер после Sysprep. Это позволит вашей установке образа Macrium Reflect после SysPrep. Чтобы запустить Sysprep, нажмите кнопку «reseal».
Клонировать ваши изображения с использованием Macrium Reflect
ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ
Блог технической поддержки моих разработок
Урок 32. Работа с АЦП через функции библиотеки HAL (продолжение).
Продолжим работу с АЦП через HAL-функции. Научимся запускать преобразование от таймера, считывать результат по прерыванию. Разработаем 4х канальный вольтметр среднего значения. Повторим проекты из предыдущих уроков, в которых АЦП работает в режиме сдвоенных преобразований.
В этой статье реализуются проекты уроков 28 и 29 с использованием HAL-библиотеки. Логику работы АЦП я подробно не объясняю. Если что-то непонятно, то лучше вернитесь к предыдущим урокам. Для понимания материала этого урока режимы и логику функционирования АЦП надо знать.
Четырех канальный вольтметр среднего значения.
Реализуем с использованием HAL-функций проект вольтметра из урока 28. Научимся работать с АЦП в фоновом режиме с использованием прерываний. А именно:
В этом проекте ожидание конверсии АЦП не будет блокировать выполнение основного цикла.
В результате должен получиться 4х канальный вольтметр среднего значения вполне применимый в практических задачах.
Повторю алгоритм работы программы.
За основу я взял проект из предыдущего урока Lesson31_1. В нем уже установлена библиотека для работы с LCD-дисплеем и конфигурирован UART.
Копируем проект или создаем новый. Открываем конфигуратор STM32CubeMX.
Настраиваем АЦП. Мы будем использовать только 4 инжектированных каналов.
Запускать АЦП будем от таймера 2. Поэтому в качестве источника внешнего запуска выбираем событие таймера 2.
Осталось задать параметры каналов в последовательности сканирования.
Результат будем считывать по прерыванию АЦП. Поэтому разрешаем его в закладке NVIC Settings.
Настраиваем таймер 2. Мы научились делать это в уроке 16.
Наша задача конфигурировать таймер, чтобы он сбрасывался каждые 100 мкс.
В окне Parameter Settings задаем:
Прерывание по таймеру разрешать не надо. Мы запускаем АЦП по событию таймера.
Все. Создаем проект.
Считывание результата преобразование можно производить в обработчике прерывания, как это мы делали в уроке 28.
void ADC1_2_IRQHandler(void) <
Для нас важно, что достаточно создать в программе тело функции, не заботясь об остальном.
/ * USER CODE BEGIN 0 */
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc)
<
Здесь и будем работать с результатом АЦП.
Callback-вызов общий для двух АЦП. Если используются оба модуля, то надо делать проверку, от которого из них пришел вызов функции.
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc)
<
if(hadc->Instance == ADC1)
<
// обработка АЦП1
Вот как выглядит блок чтения и усреднения результатов преобразований вольтметра.
Остается в основном цикле периодически проверять флаг готовности flagReady и выводить измеренные величины на дисплей и в UART.
Еще надо добавить в исходный код калибровку АЦП
А также запуск его в режиме с прерываниями
и запуск таймера 2.
Компилируем программу, загружаем в микроконтроллер.
У меня не заработало. Таймер 2 генерирует событие по перезагрузке, но АЦП по нему не запускается.
Непонятно, как это влияет. Тем более, что регулярные каналы мы не используем, а внешний запуск для них запрещен.
Такое состояние битов EXTSEL устанавливает CubeMX при запрещении регулярных каналов.
Можно разрешить регулярные каналы и установить источник запуска для них любой, кроме программного. Можно изменить биты EXTSEL в регистре CR2.
// hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO;
в блоке конфигурации АЦП. При этом бит разрешения внешнего запуска для регулярных каналов остался в запрещающем состоянии.
После этого вольтметр заработал правильно.
Проект можно загрузить по ссылке
Зарегистрируйтесь и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!
Работает с этим устройством и программа верхнего уровня из урока 28.
Проект 4х канального вольтметра с использованием АЦП в режиме сдвоенных преобразований.
Разработаем устройство подобное предыдущему проекту, только добавим условие, что пары каналов 0, 1 и 2, 3 должны считываться одновременно.
Модули АЦП будут работать в режиме сдвоенных преобразований, а точнее в режиме одновременных преобразований инжектированных каналов. Напомню, что это режим, при котором оба АЦП запускаются одновременно по сигналу запуска АЦП1.
Настраиваем систему тактирования, как в предыдущем проекте.
Для первого АЦП выбираем каналы IN0 и IN2.
Для второго каналы IN1 и IN3.
В обоих модулях запрещаем преобразования регулярных групп, для инжектированных задаем по два преобразования и настраиваем параметры каналов.
Теперь доступны все режимы АЦП1.
Выбираем Dual injected simultaneous mode.
Источник запуска – событие таймера 2.
Разрешаем прерывание АЦП 1.
Таймер 2 настраиваем аналогично предыдущему проекту.
Прерывание по таймеру разрешать не надо. Мы запускаем АЦП по событию таймера.
Не забудем про UART1.
В Atollic TrueStudio:
/* USER CODE BEGIN Includes */
#include «LCD780.h»
#include «DelayDWT.h»
/* USER CODE END Includes */
// инициализация дисплея
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPAEN ;
initDelayDwt();
init_LCD(GPIOA, 1
Теперь можно работать с функциями библиотеки LCD-дисплея.
Создаем Callback-функцию окончания преобразования инжектированных каналов. Она повторяет аналогичную функцию предыдущего проекта, за исключением строк чтения результата.
sumADC[0] += HAL_ADCEx_InjectedGetValue(&hadc1, 1);
sumADC[1] += HAL_ADCEx_InjectedGetValue(&hadc2, 1);
sumADC[2] += HAL_ADCEx_InjectedGetValue(&hadc1, 2);
sumADC[3] += HAL_ADCEx_InjectedGetValue(&hadc2, 2);
Результаты преобразований хранятся в регистрах разных модулях АЦП.
Остается в основном цикле периодически проверять флаг готовности flagReady и выводить измеренные величины на дисплей и в UART.
Добавим в исходный код калибровку АЦП
А также запуск его в режиме с прерываниями
и запуск таймера 2.
Подкорректируем биты EXTSEL регулярной группы.
// hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO;
Еще надо разрешить запуск АЦП2. HAL-функция конфигурации почему-то этого не делает.
ADC2->CR2 |= ADC_CR2_JEXTTRIG; // разрешение запуска АЦП2
Источник запуска задавать не нужно. Второй АЦП запускается от первого.
Зарегистрируйтесь и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!
Внешне работа устройства ничем не отличается от предыдущего проекта.
Проект простого осциллографа.
Повторим второй проект урока 29 – цифровой осциллограф. Напомню, что в нем мы создали цифровой осциллограф со следующими параметрами.
Чтобы создать устройство со временем выборки 0,5 мкс (частота 2 мГц) необходимо использовать оба АЦП в режиме быстрых преобразований со смещением во времени. При этом АЦП должны работать с максимальным быстродействием. Все временные расчеты в уроке 29.
Проверку окончания преобразования и чтение результатов мы не сможем реализовать с помощью HAL-функций. Вызов функций достаточно длительная операция, а нам необходимо в цикле с периодом всего 1 мкс делать одну проверку и два чтения.
Поэтому настройку АЦП сделаем с помощью библиотеки HAL, а цикл сканирования оставим без изменений, т.е. с использованием обращений к регистрам CMSIS.
Я копировал проект Lesson29_2 и переименовал его в Lesson32_3.
Удалил блок инициализации АЦП.
Открыл проект конфигуратором CubeMX.
Настроил частоту тактирования АЦП на 14 мГц.
Теперь настраиваем АЦП.
Для первого модуля:
Для второго АЦП задаем абсолютно такую же конфигурацию.
Возвращаемся к АЦП 1 и задаем режим быстрых преобразований со смещением во времени.
И разрешение запуска АЦП 2.
ADC2->CR2 |= ADC_CR2_EXTTRIG; // разрешение запуска АЦП2
Строки запуска преобразования заменяем одной функцией.
Останавливаем преобразование функцией
И все. Вот мой проект цифрового осциллографа.
Зарегистрируйтесь и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!
Проверить можно программой верхнего уровня из урока 29.
Это синусоидальный сигнал частотой 1 кГц.
Это частота 500 Гц
Сигналы подавал с генератора через неэкранированные провода, без емкостного фильтра на входе АЦП. Поэтому есть шум.
В следующем уроке начнем изучать контроллер прямого доступа к памяти (DMA).
Борьба за производительность или кто отнимал процессорное время
Началось все с «Неваляшки». О том, что это такое и для чего это было надо описано тут: http://habrahabr.ru/company/oktell/blog/108726/. То есть, мы имели четыре работающих сервера call-центра, одинаково настроенных и с примерно одинаковой конфигурацией внешних и внутренних линий, пользователей и настройкой внутренней БД. На каждый из серверов со стороны оператора связи поступала равномерная звонковая нагрузка, но сервера реагировали на это по разному!
N Конфигурация сервера и операционная система
1 T1300 @ 1.66 1 Гб ОЗУ, Windows 2003 Standard Ed. R2 SP1 32 bit
2 Intel Core Duo E8400 @ 3000 4 Гб ОЗУ, Windows 2003 Standard Ed.SP1 32 bit
3 Intel Pentium 4 3GHz 2 Гб ОЗУ, Windows 2003 Standard Ed. SP2 32 bit
4 E3400 @ 2.60 2 Гб ОЗУ, Windows 2003 Standard Ed. R2 SP2 32 bit
Столкнулись с жалобами на качество связи. Причем, жаловались не на каждый звонок, а на «некоторые». Жаловались на «кваки», очень характерные для VoIP телефонии. Довольно оперативно было выяснено, что причиной появления «кваков» было непредсказуемый рост занятости процессора на одном (первом) из серверов call-центр при возрастании нагрузки. И это при всем притом, что другие сервера такой нагрузки вообще не замечали, и никакого роста нагрузки на процессор при таком же количестве вызовов не наблюдалось. Даже, несмотря на то, что первый сервер был значительно слабее всех остальных, такой картины — роста занятости процессора до 100% — наблюдаться не должно было.
Не стоит, наверное, говорить, что мы прошли стандартный путь «протирки фар», «пинания колес» и пр. В конечном итоге пришли к мнению, что ни настройки самого call-центр, ни его СУБД, на поведение сервера не влияет. Отправной точкой для понимания сущности проблемы послужил тот факт, что в диспетчере задач в списке процессов ни один из процессов не занимал процессорного времени, вместе с тем, на мониторинге быстродействия хронология загрузки процессора показывала непрерывную загрузку процессора ядра на уровне 20%.

Задались целью получить ответ на вопрос чем же занято ядро в том случае, когда нагрузки на все остальные сервисы отсутствуют. Process Explorer — штатная утилита от Microsoft — подсказала, что основным потребителем ресурсов является «Hardware Interrupts». Для дальнейшего анализа причин такого потребления была скачана другая штатная утилита от Microsoft — «Kernrate View». Как и было описано в рекомендациях по использованию, в командной строке выполнили «C:\Program Files\KrView\Kernrates\Kernrate_i386_XP.exe >> log.txt» и, спустя некоторое время, нажав Ctrl-C, остановили. Получили файл log.txt, содержащий информацию вида:
/==============================\
\==============================/
Date: 2010/12/08 Time: 1:09:14
Machine Name: RESERVCC
Number of Processors: 1
PROCESSOR_ARCHITECTURE: x86
PROCESSOR_LEVEL: 6
PROCESSOR_REVISION: 0e08
Physical Memory: 1015 MB
Pagefile Total: 2450 MB
Virtual Total: 2047 MB
PageFile1: \??\C:\pagefile.sys, 1524MB
OS Version: 5.2 Build 3790 Service-Pack: 1.0
WinDir: C:\WINDOWS
Kernrate User-Specified Command Line:
Kernrate_i386_XP.exe
Kernel Profile (PID = 0): Source= Time,
Using Kernrate Default Rate of 25000 events/hit
P0 K 0:00:36.671 (28.5%) U 0:00:09.671 ( 7.5%) I 0:01:22.343 (64.0%) DPC 0:00:29.484 (22.9%) Interrupt 0:00:00.281 ( 0.2%)
Interrupts= 136809, Interrupt Rate= 1063/sec.
Total Profile Time = 128687 msec
Total Avg. Rate
Context Switches, 609407, 4736/sec.
System Calls, 5078088, 39461/sec.
Page Faults, 119817, 931/sec.
I/O Read Operations, 11671, 91/sec.
I/O Write Operations, 209479, 1628/sec.
I/O Other Operations, 229216, 1781/sec.
I/O Read Bytes, 39981700, 3426/ I/O
I/O Write Bytes, 19240135, 92/ I/O
I/O Other Bytes, 7130204725, 31107/ I/O
— Results for Kernel Mode:
— OutputResults: KernelModuleCount = 99
Percentage in the following table is based on the Total Hits for the Kernel
Time 44651 hits, 25000 events per hit — Module Hits msec %Total Events/Sec
intelppm 27457 128685 61 % 5334149
hal 12284 128685 27 % 2386447
ntkrnlpa 2868 128685 6 % 557174
win32k 525 128685 1 % 101993
alder9xp 427 128685 0 % 82954
tcpip 254 128685 0 % 49345
Ntfs 251 128685 0 % 48762
afd 120 128685 0 % 23312
RDPDD 109 128685 0 % 21175
e1e5132 109 128685 0 % 21175
iaStor 97 128685 0 % 18844
NDIS 39 128685 0 % 7576
RDPWD 31 128685 0 % 6022
fltMgr 26 128685 0 % 5051
amon 12 128685 0 % 2331
termdd 10 128685 0 % 1942
CLASSPNP 10 128685 0 % 1942
ftdisk 7 128685 0 % 1359
ipsec 3 128685 0 % 582
Npfs 2 128685 0 % 388
USBPORT 2 128685 0 % 388
volsnap 2 128685 0 % 388
TDTCP 1 128685 0 % 194
rdbss 1 128685 0 % 194
ws2ifsl 1 128685 0 % 194
netbt 1 128685 0 % 194
watchdog 1 128685 0 % 194
PartMgr 1 128685 0 % 194
Далее определяем какой именно драйвер загружает процесс «Hardware Interrupts». В списке лога «Kernrate View» он будет верхним, и рядом в процентах будет показана его доля занимания ядра. Тут стоит обратить внимание, что проценты показывают не общий процент от загрузки системы, а процент загрузки серверного ядра драйверами.
Определили, что этим драйвером является Intelppm (Intel processor power manager). Дальше — google нам в помощь. Интернет велик, могуч и безграничен. Довольно быстро поняли, что проблема с Intelppm возникает, не так уж и часто, вместе с тем, мы были не одни столкнувшиеся с такой бедой. Результат не замедлил себя обнаружить, нашлась статья, в которой не только описывается сама проблема, но и обозначается путь ее решения (Постоянный адрес оригинала статьи тут: http://www.osp.ru/text/print/302/5818429.html)
Далее следуя рекомендациям Стивена Догерти понимаем, что intelppm, является драйвером управления электропитанием процессора, который не нужен на сервере, где питание от аккумулятора и не используется вовсе. Вариантов решений было предложено несколько: переустановка, обновление или остановка неисправного драйвера. Какой варианты выберете вы — смотрите сами, вполне логично тут следовать оригинальным рекомендациям Догерти.
Мы полезли в реестр. Данные драйвера процессора Intel находятся в разделе реестра HKEY_LOCAL_MACHINE/SYSTEM/Current Control Set/Services/intelppm. Для отключения драевера intelppm изменили значение параметра Start с 1 на 4. Специалисты Microsoft, конечно, рекомендуют делать резервную копию реестра, но мы то с вами русские люди, да и что там один параметр поменять с 1 на 4. 
Рестарт помог убедиться, что загрузка процессора в среднем находится в пределах 60-70% даже при полной(!) загрузке сервера call-центр звонками.
Очень интересно выглядит при этом диспетчер устройств: 
Жалуется, ябедничает, плачет: «Драйвер для этого устройства был отключен. Возможно, необходимые функции исполняет другой драйвер. (Код 32), Нажмите кнопку „Диагностика“, чтобы запустить мастер диагностики для данного устройства.» Но на безопасность полетов это уже не влияет 😉
Описание драйверов HAL STM32F4xx, частичный перевод

Делюсь небольшой проделанной работой — это частичный перевод оригинального описания
HAL разработан для применения такой архитектуры программирования, когда необходимые функции выполняются верхним слоем приложения, за счет применения промежуточного уровня HAL. При такой архитектуре программирования верхний уровень приложения не «привязан» к микроконтроллеру (МК), т.к обращается к ресурсам МК только через библиотеку драйверов HAL. Такая структура пользовательского приложения улучшает повторное использование кода, и гарантирует его легкую переносимость на другие устройства STM32.
Драйверы HAL предоставляют полный набор готовых к использованию API, которые упрощают реализацию пользовательского приложения. В качестве примера — встроенные устройства коммуникации (связи) содержат интерфейсы API для инициализации и настройки устройства, управления передачей данных на основе опроса, в прерываниях или через DMA, а так же для управления ошибками связи.
API-интерфейсы драйверов HAL, делятся на две категории: 1) Общие (generic) API, которые обеспечивают общие, для всех серий STM32, функции. 2) Расширенные (extension) API, которые содержат специфические или индивидуальные функции для данного семейства или его части.
Драйверы HAL являются функционально-ориентированными, а не ориентированны на внутренние периферийные устройства. Например, API таймера делится на несколько категорий, по функциям, предоставляемым внутренним устройством таймера: базовый таймер (basic timer), захвата (capture), широтно-импульсной модуляции (PWM), и т.д…
Исходный код библиотеки драйверов разработан в соответствии со Strict ANSI-C, что делает код независимым от инструментов разработки. Весь исходный код проверен с помощью инструмента статистического анализа CodeSonarTM, полностью документирован и является MISRA-C 2004 совместимым.
Драйверы слоя HAL реализуют обнаружение ошибок во время выполнения (run-time failure detection), HAL проверяет входные значения всех функций. Такая динамическая проверка способствует повышению надежности встроенного ПО. Обнаружение ошибок во время выполнения программы, также, способствует ускорению разработки пользовательских приложений и процесса отладки.
Далее — в приложенном файле
Сразу скажу, что переведена, фактически, только 2 глава, в которой описано, как устроен HAL. Старался перевести максимально «корректно», а как получилось…
Если кем-то будут замечены ляпусы — исправлю.
Обсуждение на форуме
ITGuides.ru
Вопросы и ответы в сфере it технологий и настройке ПК
Пошаговая инструкция по правильной настройке BIOS на компьютере
BIOS является системной программой, вшитой в специальный чип, расположенный на материнской плате любого компьютера. Настройка bios позволяет немного подкорректировать некоторые параметры вашего ПК и увеличить его работоспособность.
Бытует неправильное мнение, что настройка bios собьется при отсутствии напряжения. Чтобы этого не случилось, на «материнку» ставят литиевый аккумулятор или специальную батарейку, поддерживающую настройки биоса на компьютере по умолчанию. Эта программа является посредником и обеспечивает взаимодействие устройств с ОС. А как же включить bios?
Настройки биоса на компьютере по умолчанию
После подключения к сети вашего персонального друга (компьютера) начинается загрузка основной ОС, затем подключается винчестер, с которого загружается «Виндоус» или другая ОС. Настройки биоса не включаются автоматически на персональном устройстве.
Для входа в этот режим настроек необходимо после включения компьютера подождать одиночный звуковой сигнал или начало надписи о загрузке, а затем несколько раз нажать кнопку «F2» или «DEL (Delete)» (зависит от «материнки»). Правильный вариант высвечивается внизу экрана.
После этого включаются настройки биоса на компьютере по умолчанию. Количество и названия основных пунктов меню, расположенных вверху таблицы настроек bios, могут отличаться. Мы рассмотрим основные разделы и подразделы одного из вариантов такого меню, которое состоит из пунктов:
Видео руководство по правильной настройке BIOS компьютера
Как настроить биос — основные разделы
В меню Main BIOS Setup вы попадаете сразу, как зайдете в БИОС
Если вы хотите перестроить режимы винчестера, то после нажатия кнопки «Ввод» вы попадете в его меню по умолчанию. Для нормальной работы необходимо выставить «стрелками» и кнопкой «Ввод» в пунктах:
ADVANCED — раздел непосредственных настроек основных узлов компьютера. Рисунок 2. Он состоит из подразделов:
Раздел Advanced зачастую содержит детальные настройки процессора, чипсета, устройств, опции по разгону и т.д.
POWER — смена настроек питания. Для нормальной работы необходимо выставить «стрелками» и кнопкой «Ввод» в пунктах:
Настройка биос — остальные разделы
BOOT — управление параметрами непосредственной загрузки. Состоит из:
Раздел Boot необходим для указания загрузочных устройств и соответствующих им приоритетов загрузки
TOOLS — служит для обновления БИОС.
EXIT — выход из BIOS. Имеет 4 режима:
В меню Exit можно сохранить измененные настройки, а также сбросить БИОС на настройки по-умолчанию
Как правильно настроить bios в картинках по умолчанию, знает почти каждый пользователь. Но если вы начинающий пользователь, войдите в интернет. В сети существует множество ресурсов, в которых есть страницы «настройка системы bios в картинках».
Отблагодари меня, поделись ссылкой с друзьями в социальных сетях:






























