В написании использовался редактор 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