Linux Bare Metal Development Series 2 на основе IMX6ULLmini: используйте язык C и SDK, чтобы зажечь светодиод

Импорт файлов заголовков 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

 

 Просто измените его на ваше текущее имя пользователя здесь

рекомендация

отblog.csdn.net/qq_51519091/article/details/132347501