20230318:
Ранее я не продолжал обновлять, потому что это казалось мне утомительным. Мне нужен был только один компилятор, и я не хотел иметь дело с запутанными библиотеками, которые были слишком далеки от меня. Недавно я увидел в журнале Dlang, что он может поддерживать побитовые операции, хотя всё ещё есть много ошибок. Но его можно использовать.
Я сразу же отправил версию, которая компилируется и записывается на STM32F401CC, и работает нормально. Я считаю, что мы можем перейти к этапу тестирования.
Старая система была отменена, и я также не уверен, буду ли я её изменять в будущем. Однако цель модификации — создать библиотеку для разработки, полностью избегая кросс-компиляции с базовыми библиотеками C, ориентированными на исходный код.
Конкретные параметры компилятора можно найти в файлах dub.json и ldc2.conf.
Компиляция:
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 может правильно распознавать подсказки кода.
Передняя часть использует язык 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) {}
}
Инструмент svd уже переписан, код не упорядочен и отправлен.
LDC — the LLVM D compiler. 1.1 Просто установите LDC — the LLVM D compiler.
IDE можно использовать VScode, дополнительную информацию можно найти в моей статье.
Просто используйте dub для сборки.
Настройте 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 )