Импорт файлов заголовков SDK
sudo chown -R gec /opt
Используйте эту команду, чтобы предоставить разрешения для gec, в противном случае прав доступа недостаточно для чтения, как показано на рисунке ниже.
Цель: решить проблему проверки и установки адреса регистра
-
устройства/MCIMX6Y2/MCIMX6Y2.h
Запись периферийных регистров и связанных с ними операций
-
устройства/MCIMX6Y2/драйверы/fsl_iomuxc.h
Мультиплексирование контактов документа и связанные с ним операции
Примечание :
MCIMX6Y2.h комментирует следующие заголовочные файлы для включения
#include "core_ca7.h" #include "system_MCIMX6Y2.h"
Добавьте следующие определения макросов:
#define __O volatile #define __IO volatile #define __I volatile const #define uint32_t unsigned int #define uint16_t unsigned short #define uint8_t unsigned char
Используйте язык C
Цель: повысить эффективность разработки
Введение в состав bin-файла
Разделы являются основными строительными блоками программ:
-
Раздел .text: текст кода
-
Сегмент .rodata: переменные только для чтения, такие как переменные, измененные константой
-
Сегмент .data: ненулевые глобальные переменные, статические переменные
-
.bss: глобальные переменные со значением 0, статические переменные
-
.comment: хранить комментарии
-
...
Подготовьте языковую среду C
-
очистить сегмент bss
Сегмент bss — это область хранения глобальных или статических переменных, которые необходимо инициализировать во время работы программы. Переменные в разделе bss не выделяют определенное пространство памяти во время компиляции, но будут очищены во время выполнения после загрузки программы в память.
Операция очистки сегмента bss называется «очисткой сегмента bss», что означает обнуление пространства памяти всех переменных в сегменте bss. Обычно это происходит при запуске программы. Очистив сегмент bss, вы можете гарантировать, что все глобальные и статические переменные будут инициализированы нулевым значением перед использованием. Это позволяет избежать непредсказуемого поведения при использовании этих переменных в неинициализированном состоянии.
Очистку сегмента bss выполняет операционная система или библиотека времени выполнения, они будут проходить через пространство памяти сегмента bss при загрузке программы в память и обнулять его содержимое. Таким образом, все переменные, расположенные в сегменте bss, будут иметь предопределенное значение по умолчанию, то есть нулевое значение, прежде чем программа начнет выполняться.
Следует отметить, что будут очищены только переменные, расположенные в сегменте bss, а глобальные или статические переменные, которые были явно инициализированы в коде, затронуты не будут.
-
указатель стека (sp)
Указатель стека (Stack Pointer) — это указатель на вершину стека (Stack) при выполнении программы. Стек — это структура данных, используемая для хранения вызовов функций, локальных переменных и других временных данных в соответствии с принципом LIFO.
Указатель стека (SP) динамически перемещается во время выполнения программы, отражая текущее положение вершины стека. Обычно указатель стека перемещается вниз (уменьшается), чтобы указывать на одну запись в стеке за раз.
Когда функция вызывается, она помещает в стек адрес возврата, параметры и другие необходимые данные. Указатель стека будет перемещаться вниз соответственно для размещения новых данных. Когда функция завершается, указатель стека перемещается на свободные данные, ранее помещенные в стек.
Конкретная реализация указателя стека зависит от базовой аппаратной архитектуры и операционной системы. В некоторых архитектурах указатель стека может храниться в определенном регистре, таком как ESP (расширенный указатель стека) в архитектуре x86 или регистр SP (указатель стека) в архитектуре ARM. В других случаях указатель стека может храниться в определенном месте памяти.
Правильное использование указателя стека очень важно для правильного выполнения программы и управления памятью. В процессе программирования мы должны следить за правильной работой стека, следить за правильным перемещением указателя стека во время вызова функции и процесса возврата, а также избегать таких проблем, как переполнение стека .
Периферийные устройства управления программой Bare Metal
Особенности: чтение таблицы данных, установка значения регистра
-
Узнайте, какие регистры связаны с периферией
-
Узнайте, как устанавливаются регистры, связанные с периферией
импорт скрипта компоновщика
Назначение: Указать адрес ссылки, положение начального кода в текстовом сегменте и положение других сегментов
Официальный источник: Использование LD, компоновщика GNU.
SECTIONS{ . =xxx //Начальный адрес ссылки .Название раздела { xxx *(.Имя раздела) } ... }
Это пример фрагмента скрипта компоновщика, который определяет структуру памяти программы и начальные адреса сегментов. Ниже приводится краткое описание каждого сегмента:
.text
: Содержит исполняемый код программы и данные только для чтения..text
Разделы выровнены по 4-байтовым границам и содержатbuild/start.o
объектные файлы и все остальные.text
разделы..rodata
: Содержит постоянные данные только для чтения..rodata
Сегменты выровнены по 4-байтовым границам и содержат все.rodata
разделы..data
: содержит инициализированные глобальные и статические переменные..data
Сегменты выровнены по 4-байтовым границам и содержат все.data
разделы..bss
: содержит неинициализированные глобальные и статические переменные..bss
Сегменты выровнены по 4-байтовым границам и содержат все.bss
секции иCOMMON
секции.
Этот скрипт компоновщика также определяет два символа __bss_start
и __bss_end
, которые указывают на .bss
начальный и конечный адреса сегмента соответственно. Эти символы могут использоваться в программе для определения размера и местоположения сегмента BSS.
Стоит отметить, что это всего лишь пример фрагмента сценария компоновщика, а точная структура памяти и определения разделов могут различаться в зависимости от целевой платформы и набора инструментов. При фактическом использовании вам необходимо написать и настроить скрипт компоновщика в соответствии с вашими потребностями и целевой средой.
Модификация Makefile
-
Совместимость с файлами сборки .s
-
Добавить команду компилятора
-
Добавить команду записи SD-карты
Ошибка
gec@ubuntu:~/bare_mental/part_3$ make burn
cp build/led.bin /home/embedfire/bare_mental/part_1/download_tool
cp: невозможно создать простой файл '/home/embedfire/bare_mental/part_1/download_tool': такого файла нет Или каталог
Makefile:45: рецепт для целевого 'прожечь' не удалось
сделать: *** [прожечь] Ошибка 1
Просто измените его на ваше текущее имя пользователя здесь