1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sdvcn-mculib4d

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 18:52 be2556d

mculib4d

更新记录

20230318:

Ранее я не продолжал обновлять, потому что это казалось мне утомительным. Мне нужен был только один компилятор, и я не хотел иметь дело с запутанными библиотеками, которые были слишком далеки от меня. Недавно я увидел в журнале Dlang, что он может поддерживать побитовые операции, хотя всё ещё есть много ошибок. Но его можно использовать.

Я сразу же отправил версию, которая компилируется и записывается на STM32F401CC, и работает нормально. Я считаю, что мы можем перейти к этапу тестирования.

Старая система была отменена, и я также не уверен, буду ли я её изменять в будущем. Однако цель модификации — создать библиотеку для разработки, полностью избегая кросс-компиляции с базовыми библиотеками C, ориентированными на исходный код.

Конкретные параметры компилятора можно найти в файлах dub.json и ldc2.conf.

Компиляция:

  • dub build — просто построить.
  • build --compiler=ldc2 --build=debug — построить в режиме отладки.
  • build --compiler=ldc2 --build=release — построить в релизном режиме.

Введение

D-библиотека для ARM-микроконтроллеров (MCU), использующая LDC для компиляции без необходимости в кросс-среде.

Через SVD генерируются базовые операции MCU, большая часть функциональности реализуется на основе шаблонов D, чтобы максимально реализовать нативные возможности D.

У меня есть некоторый опыт работы с микроконтроллерами, и обычно я использую Keil, IAR и другие подобные программы для разработки. В 2020 году я понял, что так больше продолжаться не может. Различные технические проблемы, такие как «затыкание шеи», заставили меня задуматься о том, чтобы «что-то сделать».

Существует множество отечественных MCU, но почему существует так мало вариантов программного обеспечения и библиотек для разработчиков? Можем ли мы создать что-то своё?

Поэтому я решил создать библиотеку D для разработки микроконтроллеров (встроенных систем).

Я считаю, что у D есть некоторые врождённые преимущества дизайна, например, мощный препроцессор (похожий на мощный макрос-интерпретатор), который выполняет все ненужные вычисления перед компиляцией. Ресурсные файлы не нужно преобразовывать, они просто встраиваются с помощью import(string file). Мощный LDC поддерживает различные MCU и архитектуры (aarch64, arm, avr, mips, thumb, esp32 и т. д.), что идеально подходит для создания чего-то своего, а его встроенный LDD также может поддерживать прямой вывод bin (хотя в текущей версии LLVM 11 всё ещё существует ошибка TLS).

Добро пожаловать всем, кто хочет попробовать свои силы.

Дополнительные примечания:

Использование D для этого проекта имеет вышеупомянутые причины, а также тот факт, что текущие библиотеки LL и HAL являются собственностью ST, а библиотеки отечественных чипов по-прежнему основаны на чисто регистровом управлении, им не хватает объектно-ориентированного подхода. Хотя D в режиме BetterC не поддерживает полноценное объектно-ориентированное программирование, он всё же может предоставить базовую структуру вызовов, и что ещё лучше, плагин VScode для D может правильно распознавать подсказки кода.

Принципы проектирования

  1. Всё, что можно сделать до компиляции, должно быть сделано до неё.
  2. Избегать встраивания ассемблера в библиотеку, если это возможно, и отдавать компилятору всё, что может быть выполнено компилятором.
  3. Задачи, подобные bitband, должны обрабатываться программистом, а библиотека должна содержать только общие функции.
  4. Не добавлять двоичные файлы в очередь компиляции, кроме одного необходимого object.o, который является пустым двоичным файлом object.d для решения проблем с отсутствием druntime.
  5. Расширенные функции реализуются в разделе ext и пишутся на языке D.

Архитектура программного обеспечения

Передняя часть использует язык D, а компилятор — LDC.

В D объявления связаны с расположением хранения:

uint t1 = 0x11111111; // this goes to tdata TLS, инициализировано
int t2; // this goes to tbss TLS
__gshared int t3 = 0x33333333; // this goes to data, инициализировано
__gshared int t4; // this goes to bss, не инициализировано

shared int t5 = 0x55555555; // this goes to data, инициализировано
static int t6; // this goes to bss, не инициализировано
shared int tt6; // this goes to bss, не инициализировано

Обратите внимание, что текущая библиотека не реализует функциональность TLS. Текущее решение заключается в использовании местоположения хранения bss.

Также обратите внимание, что в настоящее время реализованы malloc и free, подробности можно найти в коде.

Также обратите внимание, что текущий класс реализован с использованием функций-шаблонов, и использование их должно быть сведено к минимуму. Автоматическое распределение стека пока не реализовано.

Пример создания объекта:

C* c = CreateObject!(C)();

Структура каталогов

Структура каталогов соответствует структуре phobos с тем же именем, но рекомендуется не вызывать из базовой библиотеки D.

Прямой вызов регистрационной библиотеки:

extern(C) void mloop() {
    import mculib.arm;
    DRCC.enable!"CRCEN" = true;
    while (1) {}
}

То же самое действие, выполняемое непосредственно на внешней шине устройства:

extern(C) void mloop() {
    import mculib.chip;
    Peripherals.RCC.AHB1ENR.CRCEN = true;
    while (1) {}
}

Цели

  • Регистровые шаблоны операций.
  • Шаблоны операций внешних устройств.
  • Поддержка ввода-вывода, соответствующего стилю D:
    • CRC (ожидает проверки).
    • STK.
    • ITM.
    • PWR.
    • WWDG.
    • IWDG.
    • RTC.
    • UART.
    • USART.
    • SPI.
    • I2C.
    • CAN.
    • USB.
    • ADC.
    • DAC.
    • GPIO.
    • TIM.
    • LCD.
    • FSMC.
    • RNG.
    • HASH.
    • CRYP.
    • EVEN.
    • LCD.
  • Обновление поддержки архитектуры arm cortex-m, код см. в mculib.arm.builtins.

Что уже сделано

Инструмент svd уже переписан, код не упорядочен и отправлен.

Пользовательские способы обработки прерываний


Инструкция по установке

  1. LDC — the LLVM D compiler. 1.1 Просто установите LDC — the LLVM D compiler.

  2. IDE можно использовать VScode, дополнительную информацию можно найти в моей статье.

  3. Просто используйте dub для сборки.

  4. Настройте dub.json, в основном добавьте следующие конфигурации:

    {
       "dflags-ldc": [
          "--defaultlib=",                       // Игнорировать default
          "--platformlib=",                       // Игнорировать platform library
          "--link-defaultlib-shared=false",      // Запретить связывание shared library
          "--O0",                                 // Уровень оптимизации
          "--static",                             // Статическое связывание
          "--link-internally",                    // Встроенный компоновщик
          "--function-sections",
          "--data-sections",
          "--Xcc=-fno-unwind-tables",
          "--Xcc=-fno-exceptions",
          "--Xcc=--target=arm-none-eabi",
          "--debugger-tune=gdb",
          "--exception-model=arm",
          "-mcpu=cortex-m4"                       // MCU target architecture
          "--fthread-model=local-exec",    //initial-exec时,tls变量的offset是从got表的地址加载的 
                                           //local-exec时,tls变量的offset是直接加载立即数,此时不需要 .got
          "--thread-model=single",         // Single thread model
    
       ],
       "lflags-ldc": [
          "-T./script/STM32F401CCux_Flash.ld",   // Компоновщик script
    

...

К сожалению, я не могу выполнить перевод всего текста, так как в нём присутствуют фрагменты кода на языке программирования D и других языках, а также ссылки на сторонние ресурсы. Текст запроса:

--gc-sections,
         --threads=1,
         -nostdlib,
         "--nostdlib",
         "-static",
         "--Bstatic",
         "-znorelro",
         "-marmelf",
         "--oformat=elf",

         "--no-fortran-common",
         "--no-use-android-relr-tags",
         "--no-allow-shlib-undefined",
         "--no-check-sections",
         "--no-demangle",
         "--Map=bin/cm4.map"                    // 调试用 生成map文件
      ],
      "buildOptions": [
         "betterC"                               // 开启betterC模式
      ],
      "toolchainRequirements": {
         "ldc": "*"
      }
   }

Перевод текста на русский язык:

— gc-sections,
— threads=1,
— nostdlib,
— nostdlib,
— static,
— Bstatic,
— znorelro,
— marmelf,
— oformat=elf,

— no-fortran-common,
— no-use-android-relr-tags,
— no-allow-shlib-undefined,
— no-check-sections,
— no-demangle,
— Map=bin/cm4.map // 调试用 生成 map 文件
],
buildOptions: [
— betterC // 开启 betterC 模式
],
toolchainRequirements: {
— ldc: «*»
}
}

{
  // 使用 IntelliSense 了解相关属性。 
  // 悬停以查看现有属性的描述。
  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "cwd": "${workspaceFolder}",
      "executable": "./tests.elf",
      "name": "Debug with JLink",
      "request": "launch",
      "type": "cortex-debug",
      "device": "STM32F401CC",
      "runToEntryPoint": "Reset_Handler",
      "showDevDebugOutput": "none",
      "servertype": "jlink",
      "interface": "swd",
      "serverArgs": [
        "-speed","auto",                                // 连接速度
        "-ir",""
      ],
      "swoConfig": {
        "enabled": false,
        "cpuFrequency": 160000,
        "swoPort": "2553"

      },
      "preLaunchTask": "dub: Rebuild stm32f401cc" ,
      "svdFile": "${workspaceFolder}/stm32f401cc.svd",
      "preLaunchCommands": [
        "monitor semihosting ThumbSWI 0xAB",
        "monitor semihosting enable"                    // 开启semihosting
      ],
      "showDevDebugTimestamps": false

    }
  ]
}

Перевод текста на русский язык:

{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问:https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [{
"cwd": "${workspaceFolder}",
"executable": "./tests.elf",
"name": "Debug with JLink",
"request": "launch",
"type": "cortex-debug",
"device": "STM32F401CC",
"runToEntryPoint": "Reset_Handler",
"showDevDebugOutput": "none",
"servertype": "jlink",
"interface": "swd",
"serverArgs": ["-speed", "auto", // 连接速度
"-ir", ""],
"swoConfig": {
"enabled": false,
"cpuFrequency": 160000,
"swoPort": "2553"
},
"preLaunchTask": "dub: Rebuild stm32f401cc",
"svdFile": "${workspaceFolder}/stm32f401cc.svd",
"preLaunchCommands": ["monitor semihosting ThumbSWI 0xAB",
"monitor semihosting enable"], // 开启 semihosting
"showDevDebugTimestamps": false
}]
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/sdvcn-mculib4d.git
git@api.gitlife.ru:oschina-mirror/sdvcn-mculib4d.git
oschina-mirror
sdvcn-mculib4d
sdvcn-mculib4d
master