Как стать автором
Обновить

Учим систему страничной адресации и обработке прерываний

Время на прочтение 5 мин
Количество просмотров 7.3K
Системное программирование *
Приветствую. Сегодня поговорим обо всём понемногу. Введём в нашу наработку paging, разберёмся с прерываниями и их видами. Напишем несколько функций, добавим сие в код из предыдущего поста.
Читать дальше →
Всего голосов 28: ↑23 и ↓5 +18
Комментарии 14

Обработка аппаратных прерываний в архитектуре intel. i8080 — i80486, PIC, ISA, conventional PCI

Время на прочтение 6 мин
Количество просмотров 8.5K
Системное программирование *
В топике даётся обзор в исторической перспективе механизмов, используемых для сопряжения внешних устройств с CPU архитектуры x86.

Спойлер
Я понял, что никогда уже не допишу этот грандиозный обзор во всей его полноте, поэтому я просто убрал «часть 1» из названия. Возможно эта часть всё же будет кому-нибудь полезна.
Читать дальше →
Всего голосов 20: ↑20 и ↓0 +20
Комментарии 8

Многозадачность в ядре Linux: прерывания и tasklet’ы

Время на прочтение 6 мин
Количество просмотров 73K
Блог компании Embox Системное программирование *C *
Котейка и младшие братьяВ предыдущей своей статье я затронула тему многопоточности. В ней речь шла о базовых понятиях: о типах многозадачности, планировщике, стратегиях планирования, машине состояний потока и прочем.

На этот раз я хочу подойти к вопросу планирования с другой стороны. А именно, теперь я постараюсь рассказать про планирование не потоков, а их “младших братьев”. Так как статья получилась довольно объемной, в последний момент я решила разбить ее на несколько частей:
  1. Многозадачность в ядре Linux: прерывания и tasklet’ы
  2. Многозадачность в ядре Linux: workqueue
  3. Protothread и кооперативная многозадачность

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

Рассказывать я постараюсь подробно, описывая основное API и иногда углубляясь в особенности реализации, особо заостряя внимание на задаче планирования.
Читать дальше →
Всего голосов 94: ↑93 и ↓1 +92
Комментарии 31

Что именно происходит, когда пользователь набирает в адресной строке google.com? Часть 1

Время на прочтение 7 мин
Количество просмотров 128K
Браузеры
Перевод первой части материала с github, обстоятельно объясняющего работу интернета: что именно происходит, когда пользователь набирает в адресной строке google.com?

Кнопка «ввод» возвращается в исходное положение


Для начала отсчёта выберем момент, когда кнопка «ввод» утоплена. В этот момент замыкается контур, отвечающий за эту кнопку. Небольшой ток проходит по логическим контурам клавиатуры. Они сканируют состояние всех переключателей, гасят паразитные электрические импульсы, и преобразовывают нажатие в код клавиши 13. Контроллер кодирует код для передачи в компьютер. Теперь это почти всегда делается через USB или Bluetooth, а раньше в процессе участвовали PS/2 или ADB.
Читать дальше →
Всего голосов 83: ↑65 и ↓18 +47
Комментарии 45

Переходим с STM32 на российский микроконтроллер К1986ВЕ92QI. Опрашиваем клавиши, генерируем ШИМ. Часть вторая

Время на прочтение 30 мин
Количество просмотров 21K
Отладка *C *
Туториал

Вступление.

В предыдущей статье мы с вами повторили общую структуру таймера и детально рассмотрели ручной способ настройки ШИМ канала с использованием CMSIS. Но многим не нравится «копаться в регистрах» и они предпочитают принципиально другой уровень абстракции, позволяющий, как им кажется, упростить задачу. В этой статье я попытаюсь показать вам все плюсы и минусы данного подхода.
Читать дальше →
Всего голосов 15: ↑13 и ↓2 +11
Комментарии 16

Переходим с STM32 на российский микроконтроллер К1986ВЕ92QI. Практическое применение: управляем яркостью светодиода

Время на прочтение 5 мин
Количество просмотров 20K
Отладка *C *
Туториал

Вступление


В двух предыдущих статьях мы генерировали при помощи ШИМ тактовый сигнал нужной нам частоты, получая на светодиоде равный промежутки свечения и его отсутствия. Данная задача имеет место быть на практике (в одной из последующих статей мы с ней точно столкнемся). Но чаще всего ШИМ используют по другому назначению. Одно из самых распространенных — управление яркостью светодиодов или скоростью вращения моторов. Так же при помощи ШИМ можно генерировать звук (о чем будет следующая статья). А в данной статье мне хотелось бы рассказать, как на нашем контроллере можно реализовать управление яркостью светодиода.


Читать дальше →
Всего голосов 18: ↑15 и ↓3 +12
Комментарии 0

Примитивы для реализации 1-Wire master при помощи PWM и ICP для STM8L и STM32

Время на прочтение 4 мин
Количество просмотров 10K
SCADA *Программирование микроконтроллеров *Разработка для интернета вещей *
В предыдущей статье был представлен вариант реализации примитивов для асинхронной работы с шиной 1-wire для микроконтроллеров Atmel. Ну а сейчас вашему вниманию предлагается реализацию того же самого, но на более мощных микроконтроллерах семейства STM8L (для отладки использовалась обычная оценочная плата STM8L-Discovery с извлеченным LCD-дисплеем). С минимальными изменениями описываемая реализация может быть адаптирована и для семейства STM32.


Читать дальше →
Всего голосов 6: ↑6 и ↓0 +6
Комментарии 11

(Не) любителям protothreads посвящается: Высокоуровневые функции для работы с 1-Wire

Время на прочтение 8 мин
Количество просмотров 6.8K
Системное программирование *C *SCADA *Программирование микроконтроллеров *Разработка для интернета вещей *
Подразумевается, что мы будем писать прошивку под «голое железо». В противном случае применение protothreads смысла не имеет, т.к. мультизадачность должна обеспечиваться средствами ОС. Подразумевается также, что нам необходимо реализовать несколько более-менее сложных алгоритмов, связанных с операциями ввода-вывода. Ну и, как всегда в микроконтроллерах, очевидные требования по экономии RAM и энергопотребления.
Читать дальше →
Всего голосов 15: ↑15 и ↓0 +15
Комментарии 1

Ошибка обработки вложенных прерываний в STM8 (не описана в errata)

Время на прочтение 2 мин
Количество просмотров 7.2K
Процессоры
В семействе STM8 заложена очень полезная возможность экономии энергии в случае, когда быстрые и критичные ко времени обработки выполняются по прерываниям, а низкоприоритетные задачи работают в фоновом режиме. Для этого используется бит AL в регистре GCR и машинная команда WFI. Однако здесь был обнаружен подводный камень, не описанный в текущей версии errata на кристалл.
Читать дальше →
Всего голосов 19: ↑18 и ↓1 +17
Комментарии 20

Прерывания от внешних устройств в системе x86. Часть 2. Опции загрузки ядра Linux

Время на прочтение 13 мин
Количество просмотров 19K
Настройка Linux *Системное программирование *
В предыдущей части мы рассмотрели эволюцию доставки прерываний от устройств в x86 системах (PIC → APIC → MSI), общую теорию и все необходимые термины.

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

  • pci=nomsi
  • noapic
  • nolapic

Также мы посмотрим на порядок, в котором ОС смотрит таблицы роутинга прерываний (ACPI/MPtable/$PIR) и какое влияние на него окажет добавление опций загрузки:

  • pci=noacpi
  • acpi=noirq
  • acpi=off

Возможно вы пробовали комбинации из всех этих опций, когда какое-либо устройство не работало из-за проблемы с прерываниями. Разберём, что именно они делают и как они меняют вывод /proc/interrupts.
Читать дальше →
Всего голосов 34: ↑34 и ↓0 +34
Комментарии 4

Прерывания от внешних устройств в системе x86. Часть 3. Настройка роутинга прерываний в чипсете на примере coreboot

Время на прочтение 12 мин
Количество просмотров 6.6K
Open source *Системное программирование *C *
Туториал
Продолжаем рассматривать настройку прерываний от внешних устройств в системе x86.
В части 1 (Эволюция контроллеров прерываний) мы рассмотрели теоретические основы контроллеров прерываний и общие термины, в части 2 (Опции загрузки ядра Linux) посмотрели как на практике ОС осуществляет выбор между контроллерами. В этой части мы рассмотрим как BIOS настраивает роутинг IRQ на контроллеры прерываний в чипсете.

Никакие современные компании по разработке BIOS (AwardBIOS/AMIBIOS/Insyde) не раскрывают исходники своих программ. Но к счастью есть Coreboot — проект по замене проприетарного BIOS на свободное программное обеспечение. В его коде мы и посмотрим, как настраивается роутинг прерываний в чипсете.



Читать дальше →
Всего голосов 36: ↑36 и ↓0 +36
Комментарии 5

External Interrupts in the x86 system. Part 1. Interrupt controller evolution

Время на прочтение 9 мин
Количество просмотров 18K
Системное программирование *
Туториал
This article is about the interrupt delivery process from external devices in the x86 system. It tries to answer questions such as:

  • What is PIC and what is it for?
  • What is APIC and what is it for? What is the purpose of LAPIC and I/O APIC?
  • What are the differences between APIC, xAPIC, and x2APIC?
  • What is MSI? What are the differences between MSI and MSI-X?
  • What is the role of the $PIR, MPtable, and ACPI tables?

If you want to know the answer for one of these questions, or if you simply want to know about interrupt controller evolution, please, welcome.
Read more →
Всего голосов 20: ↑19 и ↓1 +18
Комментарии 0

External Interrupts in the x86 system. Part 2. Linux kernel boot options

Время на прочтение 14 мин
Количество просмотров 5.9K
Настройка Linux *Системное программирование *
Туториал

In the last part we discussed evolution of the interrupt delivery process from the devices in the x86 system (PIC → APIC → MSI), general theory, and all the necessary terminology.


In this practical part we will look at how to roll back to the use of obsolete methods of interrupt delivery in Linux, and in particular we will look at Linux kernel boot options:


  • pci=nomsi
  • noapic
  • nolapic

Also we will look at the order in which the OS looks for interrupt routing tables (ACPI/MPtable/$PIR) and what the impact is from the following boot options:


  • pci=noacpi
  • acpi=noirq
  • acpi=off

You've probably used some combination of these options when one of the devices in your system hasn't worked correctly because of an interrupt problem. We'll go through these options and find out what they do and how they change the kernel '/proc/interrupts' interface output.

Read more →
Всего голосов 2: ↑2 и ↓0 +2
Комментарии 0

External Interrupts in the x86 system. Part 3. Interrupt routing setup in a chipset, with the example of coreboot

Время на прочтение 13 мин
Количество просмотров 4.8K
Open source *Системное программирование *C *
Туториал

We continue to investigate external device interrupt routing setup in the x86 system.


In Part 1 (Interrupt controller evolution) we looked at the theory behind interrupt controllers and all the necessary terminology. In Part 2 (Linux kernel boot options) we looked at how in practice the OS chooses between different interrupt controllers. In this part we will investigate how the BIOS sets IRQ to the interrupt controllers routing in a chipset.


None of the modern BIOS developer companies (AwardBIOS/AMIBIOS/Insyde) open their source code. But luсkily there is coreboot — a project aimed at replacing proprietary BIOS with free firmware code. In its source code we'll see what is needed to setup the interrupt routing in a chipset.



Read more →
Всего голосов 2: ↑2 и ↓0 +2
Комментарии 0