Перейти к содержимому

Как оформить курсовую работу по гост latex

  • автор:

Шаблон LaTeX для оформления письменных работ

Для оформления письменных работ студентов кафедры, например, таких как:

  • реферат,
  • курсовая работа,
  • выпускная квалификационная работа,
  • магистерская диссертация,

рекомендуется использовать официальный LaTeX -шаблон кафедры информационной безопасности.

Скачать шаблон (или клонировать) можно по ссылке на github :

Чижов Иван Владимирович
Доцент, учёный секретарь кафедры, к.ф.-м.н.

Мои научные интересы — теория помехоустойчивого кодирования в криптографии, криптографические свойства дискретных функций, алгебраические методы в криптографии.

©Кафедра информационной безопасности

Как оформить курсовую работу по гост latex

Кафедра радиофизики и нелинейной динамики

Оформление по ГОСТу в Latex

Оформление по ГОСТу в Latex

Оформление по ГОСТу в Latex

Оформление по ГОСТу в Latex

Оформление по ГОСТу в Latex

Оформление курсовых и дипломных работ по ГОСТу в Latex

Главная идея LaTeX состоит в том, что авторы должны думать о содержании, о том, что они пишут, не беспокоясь о конечном визуальном облике (печатный вариант, текст на экране монитора или что-то другое). Готовя свой документ, автор указывает логическую структуру текста (разбивая его на главы, разделы, таблицы, изображения), а LaTeX решает вопросы его отображения. Так содержание отделяется от оформления. Оформление при этом или определяется заранее (стандартное), или разрабатывается для конкретного документа.

Для использования Latex необходимо установить соответствующий вашей операционной системе пакет программ. Для редактирования исходных файлов .tex можно использовать как простой текстовый редактор (с последующей ручной компиляцией, например, с помощью команды pdflatex), так и специальные среды (такие как texmaker, gummi и другие). Вводные инструкции по использованию системы Latex без труда можно найти в интернете (инструкция на сайте habr.com и на сайте overleaf.com). На последней странице вы также найдете инструкцию по использованию русского языка в Latex.

Специальные символы в математических окружениях Latex можно найти в документации к используемой программной среде (texmaker documentation), в интернете, или с помощью специального графического сервиса.

Для оформления в стиле ГОСТ удобно использовать шаблон с сайта overleaf (скачать архив шаблона проекта). Есть возможность использовать как готовый шаблон онлайн, так и скомпилировать его на локальном компьютере. Также предлагается рассмотреть модификацию специально (для студентов кафедры радиофизики и нелинейной динамики).

Saved searches

Use saved searches to filter your results more quickly

Cancel Create saved search

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

LaTeX шаблоны для написания отчетов/дипломов/курсовых работ

mirea-ninja/Latex-Template-for-Report-Diploma-Thesis

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Cancel Create

  • Local
  • Codespaces

HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

39a603a Feb 18, 2023

Git stats

Files

Failed to load latest commit information.

Latest commit message
Commit time

README.md

���� LaTeX шаблон для написания отчетов/дипломов/курсовых работ

Готовый шаблон, который оформлен по ГОСТу 2021.

Для работы с шаблоном рекомендуется использовать Overleaf (настройка редактора).

  • Шрифт для курсовой Times New Roman, размер – 14 пт.
  • Междустрочный интервал должен быть равен 1.5 cантиметра.
  • Каждая новая строка должна начинаться с отступа равного 1.25 сантиметра.
  • Текст, который является основным содержанием, должен быть выровнен по ширине.
  • Ширина левого поля должна равняться 3 сантиметра, а правое 1 сантиметра. Верхнее и нижнее должны равняться 2 сантиметра.

Доступно изменение параметров в Settings/format.tex.

Содержание туториала

�� Подробный туториал по использованию внутри шаблона
�� Вставка собственного PDF документа в качестве титульного листа
�� Вставка рисунков
�� Оформление списка литературы
⌨️ Вставка и подсветка листингов

Как использовать с Overleaf

  1. Откройте Overleaf
  2. Нажмите на New Project, выберите Upload Project
  3. Выгрузите .zip архив с шаблоном
  4. Menu \ Settings \ Compiler \ XeLaTeX
  5. Все готово к использованию.
  • Learn LaTeX in 30 minutes
  • Викиучебник

Дистрибутивы пакетов с XeLaTeX компилятором

Редакторы исходного кода

WYSIWYM (То, что ты видишь, есть то, что ты имеешь в виду)

  • Разработчик Stulk3
  • Спасибо SyntOwl за подборку программ,
  • Спасибо ValeryVerkhoturov за помощь с шаблоном

About

LaTeX шаблоны для написания отчетов/дипломов/курсовых работ

Скиньте шаблон для курсовой работы в Латехе(LaTeX) ⁠ ⁠

Скиньте шаблон для курсовой работы в Латехе(LaTeX) Python, Программирование, IT, Google, Linux, Программист, Windows, LaTeX ПО, Курсовая, Помощь, C++, Без рейтинга

Для курсовой нет общих для всех особых правил оформления. Она должна удовлетворять какому-то минимальному набору правил (ГОСТ), которого придерживается Ваш вуз, а потому, Вам не подойдет чей-то готовый шаблон, если только это не будет Ваш коллега (а почему Вы не спросите про правила оформления у своего научного руководителя? и зачем именно шаблон? — курсовая не настолько сложный документ). Минимальный уровень документа, к которому начинают относиться хоть сколько-нибудь строго — это ВКР бакалавра. Могу дать шаблон для ВКР из СПбГУ: https://github.com/itonik/spbu_diploma , но подозреваю, что он Вам не подойдет.

Похожие посты
1 день назад

Пацан к успеху шёл, не получилось, не фартануло⁠ ⁠

Пацан к успеху шёл, не получилось, не фартануло IT юмор, Программист, Программирование, Python, Картинка с текстом, IT, ВКонтакте (ссылка)

1 день назад

Установка Windows 11 на старый ПК/ноут с BIOS и MBR⁠ ⁠

Установка Windows 11 на старый ПК/ноут с BIOS и MBR Windows, Windows 11, Windows 10, IT, Компьютерная помощь, Компьютер, Решение проблемы, Видео, Длиннопост

Установленная Windows 11 на старый комп с Bios и MBR

Поздравляю с Новым Годом мой самый любимый сайт pikabu.ru и всех его обитателей!

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

Надеюсь, после этой статьи, Майкрософты не «пофиксят» эту фишку.

Примерно месяц назад ко мне в гости зашёл друг, который, как и я, техник-айтишник. У нас произошёл интересный спор про достоинства и недостатки операционной системы Windows 11, и её отличия от Windows 10. Я топил за Windows 10, поясняя что её только доделали, а 11 сделана на её основе, не отличается по производительности, но с новыми ограничениями и багами + интерфейс отстойный. Сам не пробовал, но в интернете читал и видел. Друг же топил за 11, отталкиваясь от субъективного опыта использования..

«Давай установим и сравним!» — так и началась история этой статьи.

Первый блин комом. Так как у меня старенький комп(в игры не играю), Windows 11 при установке сообщила что моё железо не отвечает минимальным системным требованиям.. В тот вечер на этом всё и закончилось. Но это событие возбудило интерес.. Так что держите результат!

Сразу хочу сказать, что найденный способ простой, эффективный, и не требует вмешательств в дистрибутив Windows 11. Но при этом, статья написана для опытных пользователей, а не совсем новичков. Поехали!

Для эксперимента нам потребуется:

  1. Старенький комп/ноут без UEFI т.е. с BIOS, но поддерживающий Windows 10. Назовём «ПК-1».
  2. Современный комп/ноут с UEFI, поддерживающий Windows 11, или виртуальная машина с такими же качествами. Назовём «ПК-2».
  3. Установочные флешки c Windows 10 и Windows 11, либо загрузочная флешка с Windows PE типа LiveUSB и установочные ISO образы этих систем.
  4. Загрузочная флешка с Windows PE типа LiveUSB с Acronis True Image на борту. Для примера я буду использовать загрузочную флешку WinPE SergeyStrelec, https://sergeistrelec.name/ .

Ну что, готовы? Продолжаем!

  1. Устанавливаем Windows 11 на «ПК-2», но с соблюдением условий: ни в процессе установки, ни после, не подключаем интернет и не устанавливаем драйверы. Доходим до этапа, когда видим рабочий стол, и перезагружаем машину.
  2. Загружаемся с флешки WinPE на «ПК-2», и с помощью Acronis True Image снимаем образ жёсткого диска/SSD. Кладём этот образ на эту же флешку. Больше нам ПК-2 не понадобится.
  3. Устанавливаем Windows 10 на «ПК-1» любым удобным способом.
  4. Загружаемся с флешки WinPE на «ПК-1». Далее будут иллюстрации, присаживайтесь поудобней.

Установка Windows 11 на старый ПК/ноут с BIOS и MBR Windows, Windows 11, Windows 10, IT, Компьютерная помощь, Компьютер, Решение проблемы, Видео, Длиннопост

Вот на таком ПК проводился эксперимент. WinPE — SergeyStrelec. https://sergeistrelec.name/

5. Сразу после загрузки WinPE, нужно отформатировать раздел с установленной системой(обычно C:\), желательно, штатными средствами WinPE в быстром варианте. Именно форматируем, а не пересоздаём, чтобы никакие идентификаторы разделов не сбились. Нужно это для того, чтобы потом Acronis True Image не создавал проблем с выбором диска для распаковки, и чтобы не морочиться с загрузчиками.

Установка Windows 11 на старый ПК/ноут с BIOS и MBR Windows, Windows 11, Windows 10, IT, Компьютерная помощь, Компьютер, Решение проблемы, Видео, Длиннопост

Форматируем раздел с установленной Windows 10

6. Запускаем Acronis True Image, и выбираем созданный на «ПК-2» образ диска с установленной Windows 11.

Установка Windows 11 на старый ПК/ноут с BIOS и MBR Windows, Windows 11, Windows 10, IT, Компьютерная помощь, Компьютер, Решение проблемы, Видео, Длиннопост

Выбираем созданный на «ПК-2» образ диска с установленной Windows 11

7. Метод восстановления: «Восстановить диски или разделы», «Далее>»

Установка Windows 11 на старый ПК/ноут с BIOS и MBR Windows, Windows 11, Windows 10, IT, Компьютерная помощь, Компьютер, Решение проблемы, Видео, Длиннопост

8. Выбираем только раздел с Windows 11, т.е. диск (C:), жмём «Далее>»

Установка Windows 11 на старый ПК/ноут с BIOS и MBR Windows, Windows 11, Windows 10, IT, Компьютерная помощь, Компьютер, Решение проблемы, Видео, Длиннопост

Выбираем только раздел с Windows 11, т.е. диск (C:)

9. Хранилище нового раздела — выбираем наш отформатированный диск (C:), «Принять». Кстати, именно на этом этапе возникает затык: если диск не отформатирован, то мы его не сможем выбрать.

Установка Windows 11 на старый ПК/ноут с BIOS и MBR Windows, Windows 11, Windows 10, IT, Компьютерная помощь, Компьютер, Решение проблемы, Видео, Длиннопост

Выбираем наш отформатированный диск (C:).

10. «Далее>», «Приступить», ждать..

Установка Windows 11 на старый ПК/ноут с BIOS и MBR Windows, Windows 11, Windows 10, IT, Компьютерная помощь, Компьютер, Решение проблемы, Видео, Длиннопост

11. После окончания процесса, запускаем Acronis Disk Director или другую дисковую утилиту, чтобы удалить «Раздел восстановления», который остался от Windows 10. Windows 11 новый такой создаст сама.

Установка Windows 11 на старый ПК/ноут с BIOS и MBR Windows, Windows 11, Windows 10, IT, Компьютерная помощь, Компьютер, Решение проблемы, Видео, Длиннопост

Удаляем «Раздел восстановления» Windows 10.

12. Перезагружаем ПК-1, Первую загрузку Windows 11 нужно выполнить с отключенным интернетом, иначе будут ошибки BSOD. А вот уже как рабочий стол увидите, тогда можно и интернет подключать, тогда всё и заработает.

13. Радуемся новенькой системе на стареньком ПК!

Вот так выглядит первый запуск Windows 11 на стареньком ПК с BIOS и MBR)

Способ нашёл и проработал я, статью тоже напечатал: тег «Моё».

Всем, кто дочитал до конца, бесконечная благодарность. С Новым Годом всех, ещё раз! Счастья, здоровья, и беззаботности вам.

Показать полностью 9 1
2 дня назад

Чат GPT становится все больше похожим на программистов. ⁠ ⁠

Чат GPT становится все больше похожим на программистов. IT юмор, IT, Программирование, Искусственный интеллект, Повтор

* Код, который ты мне дал, не работает. Можешь исправить?

* У меня всё работает.

2 дня назад

SQL задача про IN и NOT IN с объяснением⁠ ⁠

SQL задача про IN и NOT IN с объяснением Программирование, IT, Собеседование, SQL, Ms SQL, Oracle, Субд, База данных, Telegram (ссылка)

Всем отличного начала нового года! Вчера утром в своём Телеграм-канале опубликовал интересную задачу по SQL с собеседования про IN и NOT IN.

С первого взгляда кажущееся правильным решение на самом деле ложно. Чтобы верно ответить в задаче, нужно знать как СУБД обрабатывает элементы множества, указанные для оператора IN / NOT IN в запросе.

Вначале вот текст самой задачи. Ниже я поясню правильное решение:

В таблице CLIENTS пять строк. В первых двух строках в поле CLIENT_TYPE значение 1, ещё в двух строках в CLIENT_TYPE значение 2 и в последней строке поле CLIENT_TYPE не заполнено, то есть в последней строке в поле CLIENT_TYPE значение NULL.

Есть два запроса:
1)
SELECT * FROM CLIENTS WHERE CLIENT_TYPE IN (1)
2)
SELECT * FROM CLIENTS WHERE CLIENT_TYPE NOT IN (2, NULL)
Результирующие наборы данных, полученные в результате выполнения этих запросов, будут одинаковыми или разными?

Здесь поставь чтение на паузу и ответь на вопрос самостоятельно.

На сегодня на канале следующий разброс ответов:

SQL задача про IN и NOT IN с объяснением Программирование, IT, Собеседование, SQL, Ms SQL, Oracle, Субд, База данных, Telegram (ссылка)

Первый запрос отбирает клиентов, у которых в столбце тип указано значение 1. В результате будут отобраны две строки. Здесь все понятно. Так как в таблице клиентов ещё остаются строки, не попавшие в выбор первого запроса, со значениями в столбце тип 2 и NULL, то видится, что второй запрос должен как раз вернуть такой же результирующий набор данных. Однако, тут дело в коварном NULL в значениях для оператора NOT IN. СУБД представляет оператор NOT IN:

SELECT * FROM CLIENTS WHERE CLIENT_TYPE NOT IN (2, NULL)

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

SELECT * FROM CLIENTS WHERE ( (CLIENT_TYPE <> 2) AND (CLIENT_TYPE <> NULL) )

С NULL не допустимо использовать операторы сравнения. При сравнении с NULL (= NULL, <> NULL) результат будет всегда отрицательным.

Второй запрос не вернёт ни одной строки данных.

Ещё больше полезного и интересного в моём Телеграмм-Канале.

Показать полностью 1
Поддержать
2 дня назад

Тот мир который все заслужили⁠ ⁠

Тот мир который все заслужили

Поддержать
2 дня назад

Документация⁠ ⁠

Документация

Поддержать
3 дня назад

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI?⁠ ⁠

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Зачастую в процессе разработки собственных устройств или моддинга уже существующих, встаёт задача выполнения стороннего кода: будь то ваши собственные программы с SD-флэшек, или программы, написанные другими пользователями с помощью SDK для вашего устройства. Тема компиляторов и кодогенерации достаточно сложная: чтобы просто загрузить ELF или EXE (PE) программу, вам нужно досконально разбираться в особенностях вашей архитектуры: что такое ABI, релокации, GOT, отличие -fPIE от -fPIC, как писать скрипты для ld и т. п. Недавно я копал SDK для первых версий Symbian и основываясь на решениях из этой ОС понял, каким образом можно сделать крайне «дешевую» загрузку любого нативного кода практически на любом микроконтроллере, совершенно не вникая в особенности кодогенерации под неё! Сегодня мы с вами: узнаем, что происходит в процессе загрузки программы ядром Linux, рассмотрим концепцию, предложенную Symbian Foundation и реализуем её на практике для относительно малоизвестной архитектуры — XTensa (хотя она используется в ESP32, детали её реализации «под капотом» для многих остаются загадкой). Интересно? Тогда добро пожаловать под кат!

❯ Как это работает?

Думаю, для многих моих читателей реализация процесса загрузки exe-программ и dll-библиотек в память процесса оставалась эдаким чёрным ящиком, в детали реализации которого вдаваться не нужно. Отчасти это так и есть: современные ОС разруливают процесс загрузки бинарников в память сами, не требуя от программиста вообще ничего, даже понимания того, куда будет загружена его библиотека или программа.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Давайте для общего понимания вкратце разберемся, как происходит загрузка программ в Windows/Linux:

1. Система создаёт процесс и загружает в память программы секции из ELF/PE. Обычные программы для своей работы используют 3 секции: .text (код), .data (не-инициализированный сегмент памяти для глобальных переменных), .bss (сегмент памяти для инициализированных переменных). Каждому процессу выделяется собственное адресное пространство, называемое виртуальной памятью, которое не позволяет программе испортить память ядра, а также позволяет не зависеть от разметки физической памяти на выполняющей машине. Концепцию виртуальной памяти реализует специальной модуль в процессоре, называемый MMU.

2. Если бы наши программы не использовали никаких зависимостей в виде динамических библиотек, то на этом процесс загрузки можно было бы закончить: каждая программа имеет свой адрес загрузки, относительно которого линкер строит связи между обращениями к коду/данным программы. Фактически, для самых простых программ линкеру остаётся лишь прибавить адрес загрузки программы (например, 0x100) к каждому абсолютному обращению к памяти.
Однако современные программы используют десятки библиотек и для всех предусмотреть собственный адрес загрузки не получится: кто-то где-то всё равно будет пересекаться и вероятно, портить память. Кроме того, современные стандарты безопасности в Linux рекомендуют использовать позиционно-независимый код, дабы использовать преимущества ASLR (Address Space Layout Randomization, или простыми словами возможность загрузить программу в случайное место в памяти, дабы некоторые уязвимости, завязанные на фиксированном адресе загрузки программы перестали работать).

3. Поэтому для решения этой проблемы придуман т. н. динамический линкер, который уже на этапе загрузки программы или библиотеки патчит программу так, чтобы её можно было загрузить в любой участок памяти. Для этого используются данные, полученные от обычного линкера а этапе компиляции программы: помимо .text, .data и .bss, линкер создаёт секции .rel и .rel-plt, которые называются релокациями. Если объяснять совсем условно, то релокации — это просто запись вида «какой абсолютный адрес в коде программы нужно пропатчить» -> «на какое смещение его пропатчить». Самая простая релокация выглядит вот так:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

.rel-plt же служит для резолвинга вызовов к dll/so: изначально программа ссылается на заранее определенные в процессе компиляции символы, которые уже в процессе загрузки патчатся на физические адреса функций из загруженной библиотеки.

И казалось бы — всё очень просто, пока в дело не вступают GOT (Global Offset Table — глобальная таблица смещений) и особенности реализации конкретного ABI. И ладно бы x86 или ARM, там всё разжевано и понятно, однако на других архитектурах начинаются проблемы и не всегда очевидно что и где за что отвечает.

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

  1. Писать полноценный загрузчик ELF-бинарников. ELF может оказаться громоздким для некоторых окружений и его реализация может оказаться тривиальной не для всех.
  2. Зарезервировать определенный сегмент в памяти (пусть с 0xFFF по 0xFFFF) и скомпилировать нашу программу с адресом загрузки 0xFFF с параметром -fno-pic. В таком случае, линкер сгенерирует обращения к памяти по абсолютным адресам — если переменная лежит по адресу 0xFFF, то программа будет обращаться сразу к этому адресу памяти, без необходимости что либо динамически линковать. Именно такой подход использовался во времена ZX Spectrum, Commodore 64 и MS-DOS (однако там роль «виртуальной памяти» выполняла такая особенность 8086, как сегменты). У такого подхода есть и минусы: относительная невозможность загрузки сразу нескольких программ одновременно, зарезервированное пространство линейно отъест небольшой кусок памяти у основной прошивки, нет возможности динамической аллокации секций. Зато такой код теоретически будет работать быстрее, чем PIC.

Недавно мы сидели в чате ELF-сцены (разработка нативных программ под телефоны Siemens, Sony Ericsson, Motorola и LG с помощью хаков) и думали, как же можно реализовать загрузчик сторонних программ на практически неизвестных платформах. Кто-то предлагал взять ELF под основу — однако с его реализацией под некоторые платформы есть трудности, а кто-то предлагал писать «бинлоадер» — самопальный формат бинарников, который получается из, например, тех же эльфов.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

В это же время я копал SDK для Symbian и хорошо помнил, что в прикладных приложениях для этой ОС нет поддержки глобальных переменных вообще. Да, сегмент .data и .bss полностью отсутствует — переменные предлагается хранить в структурах. Почему так сделано? Всё дело в том, что каждая программа в Symbian — это dll-библиотека, которую загружает EKA и создаёт экземпляр CApaApplication. И дабы была возможность загрузить dll один раз для всех программ (что справедливо для системных библиотек), ребята полностью выкинули возможность использования любых глобальных переменных. А ведь идея интересная!

Однако в таком подходе есть несколько серьезных ограничений:

  • Отсутствие глобальных переменных может стать проблемой при портированиии уже существующего софта, хотя вашим программам ничего не мешает передавать в каждую функцию структуру с глобальным стейтом, который можно при необходимости изменять. Кроме того, нет ограничений на использование C++ (за исключением необходимости ручной реализации new/delete и отсутствием исключений).
  • Отсутствие преинициализированных данных. Вот это уже может стать относительно серьёзной проблемой, у которой, тем не менее, есть свои обходные решения. Например если вы храните команды для инициализации дисплея в таблице, или какие-либо калибровочные данные — вы не сможете их объявить, просто используя инициализаторы в C. Тоже самое касается и строковых литерал. Тут есть два варианта: часть таблиц можно вынести на стек (если эти самые таблицы достаточно маленькие), либо подгружать необходимые данные из бинарника с помощью основной прошивки (например, LoadString и т. п.).

Давайте же на практике посмотрим, имеет ли право на жизнь такой подход!

❯ Практическая реализация

Формат нашего бинарника будет до безобразия прост: небольшой заголовок в начале файла и просто сырой дамп сегмента .text, который можно экспортировать из полученного elf даже без необходимости писать скрипт для линкера. При этом нужно учесть, что ESP32 — это микроконтроллер частично Гарвардской архитектуры, т. е. шина данных и кода у него расположены отдельно. Однако у чипа есть полноценный MMU, который позволяет маппить регионы физической памяти в виртуальную память, чем мы и воспользуемся в итоге!

Заголовок нашего бинарника будет выглядеть вот так:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Программа общается с основной прошивкой посредством псевдо-syscall’ов: функции, которая в качестве первого аргумента ожидает номер нужной службы и один 32х-битный указатель для описания структуры с параметрами. Реализация syscall’ов — одна из самых простых и неприхотливых с точки зрения обратной совместимости с будущими прошивками.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Концептуально всё очень просто: GetGlobalStateSize сообщает нашему загрузчику размер структуры для хранения глобального стейта, в то время как Start уже фактически заменяет main() в нашей программе. Необходимости в crt0 нет, поскольку весь необходимый инит выполняет бутлоадер ESP32. Впрочем, при желании вы можете выделить отдельный стек для вашей программы — это повысит надежность, если выполняемая программа удумает испортить стек.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Собираем нашу программу:

xtensa-esp32-elf-cc.exe test.c -fno-pic -nostdlib -nostartfiles -Wl,—section-start=.text=0x0

xtensa-esp32-elf-objcopy.exe —only-section=.text —output-target binary a.out run.bin

-fno-pic отключает генерацию кода, зависимого от GOT, -nostdlib и -nostartfiles убирает из билда crt0 и stdlib, благодаря чему мы получаем только необходимый код. —section-start задает смещение для загрузки секции .text на 0x0 (в идеале это делать необходимо из скрипта для ld).
objcopy скопирует из полученного ELF только необходимую нам секцию .text.

Как же это работает на практике? Давайте дизассемблируем выходной бинарник и посмотрим, что у нас дает на выхлопе cc:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Обратите внимание, что Start вызывает подфункции с помощью инструкции CALLX8, которая в отличии от обычного Immediate-версии CALL8, выполняет переход относительно текущего адреса в PC, благодаря чему переход полностью независим от адреса загрузки программы в памяти. А благодаря тому, что все данные, в том числе и указатель на глобальный стейт передаются через стек, нет необходимости релокейтить сегменты данных.

По итогу всё, что нужно от загрузчика бинарников — это загрузить программу в память для инструкций, выделить память для структуры с стейтом программы и передать управление Start. Всё!
Конкретно в случае ESP32, у нас есть два возможных решения задачи загрузки программы в память:

  1. Загрузить программу в IRAM. Такая возможность теоретически есть, однако на практике загрузчик ESP32 устанавливает права только на чтение и выполнение на данный регион памяти. Попытка что-то скопировать туда закончится исключением SIGSEGV. Кроме того, сегмент IRAM относительно небольшой — всего около 200Кб.
  2. Самопрограммирование. Для этого, в esp32 есть два механизма — Partition API и SPI Flash API. Я выбрал Partition API для простоты реализации.

Для нашей прошивки необходимо будет переразметить флэш-память. Для этого запускаем idf.py menuconfig, идём в Partition Table -> Custom partition table CSV. Создаём в папке проекта partitions.csv, куда пишем:

# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
executable, data, undefined, 0x110000, 0x10000

Для заливки программы можно использовать соответствующее Partition API, либо parttool.py :

parttool.py —port «COM41» write_partition —partition-name=executable —input «run.bin»

Переходим к загрузчику программы:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *