В написании использовался редактор Atom
, а в качестве генератора pdf
DILLINGER
Для освоение материала курса, студенту необходимо иметь начальные знания:
- Архитектура ЭВМ;
- Программирование на ЯПВУ Си;
- Дискретная математика.
Целями данного курса являются:
- Выбор и настройка окружения для разработки в зависимости от целевой ОС и задачи. Написание вспомагательных
batch
скриптов для упрощения взаимодействия с окружением и утилитами. Получение базовых навыков использования терминалаUnix-like
иWindows
ОС. Работа с пакетными менеджерами. - Овладеть средствами автоматизации сборки, на примере утилиты
cmake
. Научиться по выданному заданию распределить функциональные части приложения по модулям, определить вид модуля, границы его использования, конфигурирование, описание интерфейсов и т.д. Знать принципы непрерывной интеграции и доставкиCI/CD
. - Овладеть средствами контроля версий на примере
git
. Знать жизненный цикл кода в рамках использования контроля версий.
- История. Тьюринг, тезисы Черча. Вычислимость. Парадигмы программирования. История языка Си. С++ и Бьярн Страуструп с обобщенным программированием, как логическое продолжение языка. Стандарты языка.
POSIX
. Почему язык Си и почему стандартC89
(индекс TIOBE). - Окружение. Окружение сборки. Окружение разработки.
IDE
,JetBrains CLion
,Microsoft Visual Studio Community Edition
.MinGW-64
. Проект. Структура проекта. Автоматизация сборки.cmake
. Непрерывная интеграция. - Системы управления версиями.
CVS
,SVN
,Mercurial
,Git
. Базовые команды.Index
,Commit
,Revert
,Merge
,Rebase
,Pull
,Push
,Branch
,Tag
. Последовательность работы. Разрешение конфликтов. - Основы Виды языков: компилируемость, транслируемость, интерпритируемость. Виртуальная машина,
native
код,JIT
. Процесс, стадии и порядок компиляции. Линковка, виды (статическая, динамическая). Динамически разделяемые библиотеки. Исполняемые модули. Виды:ELF
,PE
. Таблица импорта. Порядок загрузки исполняемого модуля(библиотеки). Базовый адрес. - Язык Си. Компилятор
gcc
,cl
. Флаги компиляторов. Работа препроцессора. Организация кода в языке Си: блок подключения заголовочных файлов, описание прототипов функций, описание глобальных переменных, описание реализации функций, точка входа. Типы данных. Структуры. Строки. Массивы. Переменный. Область видимость. Блок кода. Операции. Типы вызовов функций:cdecl
,stdcall
,pascal
,fastcall
. Адрес возврата. Таблица функций (процесс компиляции). Описание конструкций языка: ветвления, циклы, переходы условные и безусловные. - Память. Типы памяти (статическая, динамическая, стек). Виды памяти в ОС: сегментная, страничная, сегментно-страничная. Виртуальная память. Помещение переменных в нужные сегменты. Получение доступа к сегментам. Средства работы с динамической памятью в языке.
Embedded
как ограничение по ресурсам (в частности по памяти). Указатели. Представление памяти. Опасности при использовании прямого доступа к памяти. Опасняе функции. Виды атак.Memory Leak
, отслеживание.Valgrind
. - Базовые структуры: строки, массивы, списки, деревья, ассоциативные массивы. Базовые алгоритмы. Итераторы, продолжения и т.д.
- Файлы. Типы файлов в стандартной библиотеке и в ОС. Базовые функции работы с файлами.
Unix-like
- все является файлом. Дескриптор файла. Ограничение процесса в ОС. Стандартные потоки ввода, вывода. Демон, как специфичный объект вUnix-like
ОС. Системный сервис вWindows
- ответUnix-like
ОС. Виды доступа к файлу (последовательный,random
). Перенаправление ввода вывода. Конвеер в терминале, базовые понятия (каналы и именнованые каналы далее). Атрибуты файлов, изменение атрибутов.NTFS
потоки, чтение и управление. - Сокеты. Типы сокетов (сетевые,
unix
). Сетевое взаимодействие. МодельOSI
. ПротколыARP
,ICMP
,TCP/IP
,UDP
. Фрагментация иMTU
. Порты. Сетевые адреса. Создание и базовые функции работы с сокетами (Windows
,Unix-like
). Блокирующие и не блокирующие сокеты. Конфигурирование сокетовfcntl
. - Многопоточное программирование. Решаемые задачи, проблемы. Процессы, потоки, смена контекста, приоритеты.
pthread
,fork
. Форк бомба. Создание, конфигурирование и управление потоком. - Синхронизация. Синхронизация потоков. Примитивы синхронизации: критические секции, спинлок, семафор, мьютексы, атомарные операции,
condition variable
, барьеры. Применимость. Проблемы: взаимная блокировка, использованиеcpu
вместо ожидание, исчерпание ресурсов (дескрипторы потоков, стек потока).Thread Local Storage
. - Межпроцессное взаимодействие. Предпосылки и задачи. Примитивы:
FIFO
,unix
сокеты, каналы (fork
и наследование дескрипторов),shared
память, блокировка файлов. Создание процесса и передача аргументов, специфика ОС. Мониторинг процесса. Управление процессом, сигналы, код возврата. Виртуальная память процесса. Запуск кода в адресном простанстве процесса. - Тестирование. Модульное тестирование. Интеграционное. Эмуляция.
Mock
. Нагрузочное тестирование. - Анализ кода*. Анализ кода: виды, предпосылки. Статический анализ. Дедуктивный анализ.
farma-c
- Контроллеры*. Гарвардская архитектура,
ARM
,Cortex-M3
. ПереферияI2C
,USART
,SPI
,CAN
,WDT
,Timer
,GPIO
,PWM
,RTC
. Программирование.RTOS
- Проверка кода на соответствие Стилю
Сборка проекта осуществляется в окружении, описанном в лекции 2. Для Windows
рекомендуется использовать MSYS2
оболочку и соответственно утилиты(порядок установки описан также в лекции 2).
Перед началом сборке следует получить свежие исходники из репозитория, выполнив команду git pull
в директории репозитория или если у вас его нет git clone https://github.com/BasePractice/c_programming.git
.
После получения или обновления исходных кодов и лекций, для сборки практических работ, следует перейти в диреторию _02.Practice
. В зависимости от операционной системы сборки создайте директорию сборки:
.build_l64
дляUnix
подобных.build_msc_x64
дляWindows
и компиляторmsvc
.build_w64
дляWindows
и компиляторmingw64
перейдите в созданную ранее директорию и исполните команду для ОС:
Windows
иmsvc
компилятора -cmake .. -DCMAKE_BUILD_TYPE=Debug -G "NMake Makefiles"
Windows
иmingw
компилятора -cmake .. -DCMAKE_BUILD_TYPE=Debug -G "MinGW Makefiles"
Unix
подобных иgcc
компилятора -cmake .. -DCMAKE_BUILD_TYPE=Debug
после генерации проекта утилитой cmake
следует исполнить команду make
за исключением msvc
компилятора, для сборки с его использованием следует исполнить команду nmake