
qwerty
05.01.2018
11:21:15
я так и думал(

Ned Ogl
05.01.2018
11:24:15
Она живёт на стеке

Stepanos
05.01.2018
11:24:49

Google

Ned Ogl
05.01.2018
11:25:10

qwerty
05.01.2018
11:25:27
Замути структурку
я думаю в двух словах рассказать не получится)
Может статью знаете какую?

Ned Ogl
05.01.2018
11:25:44
Кстати, про асм и Ди. Не суйте асм в Ди, он там плохо сидит. Линкуйте отдельно

Evgeny
05.01.2018
11:26:14
нет, не очень. очень-очень маленькие и совсем не дженерик. хардкодю под STM32F103C8T6 - дешевый МК

Ned Ogl
05.01.2018
11:26:16
Интересен только inline llvm asm в случае с ldc

Evgeny
05.01.2018
11:26:56
Нормально он там сидит

Ned Ogl
05.01.2018
11:27:03

Evgeny
05.01.2018
11:27:04
по крайней мере x86

Ned Ogl
05.01.2018
11:27:10
Нет
Убого он там сидит
Тот же НАСМ гораздо приличнее

Evgeny
05.01.2018
11:27:33
Для мелочей он нормально сидит

Ned Ogl
05.01.2018
11:27:45
Ну, для мелочей да

Google

Ned Ogl
05.01.2018
11:27:55
Я прост ядро пилю
На х86-64

Stepanos
05.01.2018
11:28:07
https://github.com/mit-pdos/xv6-public

Ned Ogl
05.01.2018
11:28:10
Мне не обойтись без асм макросов

Stepanos
05.01.2018
11:28:23
вот прикольная темка, перепилить на D можно

Evgeny
05.01.2018
11:28:23
На х86-64
под это дело кто-то уже пилит ядро, можно надыбать на гитхабе

Ned Ogl
05.01.2018
11:29:11
И он абсолютно нормально работает?
Я по фану пилю
Чтоб научиться пилить
Не чтоб юзать

Stepanos
05.01.2018
11:30:20
все ОС по фану пилят)) не по фану - пилят существующие

Evgeny
05.01.2018
11:30:22

Ned Ogl
05.01.2018
11:30:39
Почему не lld?
Он ведь мультитаргет
То есть, кросслинчит искаропки

Evgeny
05.01.2018
11:31:07
не знаю насколько он мультитаргет, я не пробовал

Ned Ogl
05.01.2018
11:31:13
Плюс, понимает с недавних пор ld скрипты

Evgeny
05.01.2018
11:32:15
надо учесть, что я все творю под линупсом

Google

Ned Ogl
05.01.2018
11:32:28
Я тоже
А в чем у тебя сложности?

Evgeny
05.01.2018
11:32:46
как на виндовс готовить LDC для ARM я не знаю


Ned Ogl
05.01.2018
11:36:22
Прост для меня, человека, который никогда не прогал контроллеры, есть только две проблемы. Всё ведь рано или поздно упирается в адреса там всякие и прочее. Должна быть либа, которая хоть как-то оборачивает голое железо. Я просто даже не знаю, какую команду отдать СТМу, чтобы он на конкретной ноге выдал единицу, итд. Это надо даташит читать для каждого чипа и пилить отдельный D модуль с обёрткой. Тогда заведётся. Вторая проблема: зашив. Надо составить какой-то особый объектник в каком-то формате "прошивки". Для этого и нужен линкер, но я даже не знаю, как СТМы хавают прошивку, как их загнать в режим прошивки, как указать интерфейс, по которому будешь шить, тип памяти, в которую её положить, итд.
То есть как сделать вручную то, что делает фирменная IDE. У меня как-то валялась ардуинка и я хотел заняться реверсингом Arduino IDE, чтобы глянуть, как она компилит и шьёт. А потом забил. Вот хочу стм32 погонять немношк


Evgeny
05.01.2018
12:04:28
Для плюсов есть всякие либы, хорошие или не очень. Для D мало что есть. Поэтому я написал мелкую либку для более легкого маппинга "адресов".
Фактически это более удобный вариант низкоуровневой либы CMSIS - https://developer.arm.com/embedded/cmsis
Тончнее она (либа) только по функциональности совпадает с CMSIS, больше ничего общего между ними нет. Подход радикально иной. В моей либке используются всякие чисто дешные фичи, которые позволяют красиво все упаковать
что касается прошивки, то генерится обычный elf-бинарник, из которого тем же линкером вытаскивается "чисто прошивка"
шить можно разными способами, лично я заливаю через китайский копеечный клон STLink при помоще OpenOCD
Точнее через связку GDB + OpenOCD


Evgeny
05.01.2018
12:10:05
заодно можно и худо-бедно отлаживать
Но в целом STM32 на D - это явно не для профессионалов. Я-то чисто как хобби это делаю, мне не впадлу даташиты курить и тратить время на ковыряние в ld-скриптах
если же зарабатывать на этом деле, то D - не годится пока для этих целей
Также я не заморачивался сильно с обобщенностью, реализую только обработку той части железа, которое мне нужно. Пока есть только инициализация, немножко работы c OLED-экраном через SPI, и чтение состояния энкодера на таймерах. Ну и просто ногами подергать тоже можно.
Расширяется это дело легко, но никаким вменяемым обобщенным высокоуровневым API даже не пахнет.
Короче основные сложности я уже решил. Я начал статейку писать по мотивам своей работы, но слишком ленив, чтобы ее закончить


Igor
05.01.2018
14:57:39
вот пояснение про RAII для betterC (https://dlang.org/blog/2018/01/04/dmd-2-078-0-has-been-released/)
One of the limitations in -betterC mode has been the absence of RAII. In normal D code, struct destructors are executed when an instance goes out of scope. This is handled by DRuntime, and since the runtime isn’t available in -betterC mode, neither are struct destructors. With DMD 2.078.0, the are in the preceding sentence becomes were.

Pavel
05.01.2018
15:02:18
А как работает try finally в betterC? Я так понимаю там же нельзя исключения кидать?

Google

Igor
05.01.2018
15:04:11
получается что исключения нельзя а вот записать try..finally - можно

Evgeny
05.01.2018
15:06:52
они сделали некий резанный вариант try/catch/finally
что мешает в обычном режиме, если не бросается исключение убирать зависимость от рантайма?

Pavel
05.01.2018
15:10:55

Igor
05.01.2018
15:10:58

Pavel
05.01.2018
15:11:16
Или если будет segfault то finally все равно выполнится?

Evgeny
05.01.2018
15:11:48
segfault - это не исключение, так что конечно не выполнится

Igor
05.01.2018
15:11:59

Admin
ERROR: S client not available

Evgeny
05.01.2018
15:12:19
хотя в виндовс не знаю, в линукс точно нет

Igor
05.01.2018
15:12:52
просто импементировали через такой можно скзать костыль…

Pavel
05.01.2018
15:13:35
Просто это совсем не в духе D - плодить бессмысленные конструкции.

Evil
05.01.2018
15:14:36
На правах рекламы
Боты и исследования
Чат боты, игры в чатах, заработок, разработка.
https://t.me/SatansonBlog
Мой канал
Начал вот

Igor
05.01.2018
15:16:18

Evgeny
05.01.2018
15:17:21
попробуй new вставить в свой код и компильнуть с betterC

Google

Pavel
05.01.2018
15:18:22
хм есть у меня одна идея.

Evgeny
05.01.2018
15:18:27
компилятор никаких ошибок не выдаст, линкер выдаст,

Pavel
05.01.2018
15:18:40
А есть где 078 онлайн попробовать?

Evgeny
05.01.2018
15:19:39

Pavel
05.01.2018
15:20:16
Да да
void test()
{
try {
writeln("try1");
return;
writeln("try2");
} finally {
writeln("try finally");
}
}
Вот в такой штуке try finally будет напечатано все равно.
Это я проверил на обычном D, в 2.078 betterC должно так же работать.

Evgeny
05.01.2018
15:23:09
В такой код превращается вот в это (ради чего и пилилось):
void test()
{
scope(exit) writeln("try finally");
writeln("try1");
}

Pavel
05.01.2018
15:23:50
Вот так то выглядит гораздо красивее

Evgeny
05.01.2018
15:24:36
Поэтому finally не нужен.
особенно если учесть, что еще есть scope(success) и scope(failure)
чем вообще принципиально отличается betterC от обычного режима? Фактически умолчальными настройками линкера

Igor
05.01.2018
15:28:07
тогда непонятно - часть фич для betterC находится в настройках для линкера, часть в компиляторе?

Evgeny
05.01.2018
15:28:49
понятия не имею. я вот только что заснул в betterC вот такой код:
extern(C) void main() {
throw new Exception("error");
}
И что, думаете компилятор поругалса? А вот хуй. Только линкер ругнулся

Igor
05.01.2018
15:30:09
ладно, пусть пилят, я им всё-равно не пользуюсь

Evgeny
05.01.2018
15:30:24
экзешники полчаются меньше ага, потому что в режиме betterC рантайм отрывается принудительно. Что мешает в обычном режиме отрывать его, если он не используется я не знаю
А так nogc уже достаточно чтобы не напортачить
да и кто запрещает сделать свой микрорантайм с обработкой new/delete?
впиливать GC в дешку было ошибкой. Не потому что GC - это плохо, а потом что в дешке нормальный GC сделать невозможно