Страница 1 из 1
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 27.10.21 22:11
БудДен
Переместил за skip там же - мигает.
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 27.10.21 22:23
БудДен
Попытался поместить в код инициализации модуля Environment - не работает. Да и вообще, какой-то он не живой на вид, в дизассемблинге не видно, чтобы там что-то вызывалось.
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 27.10.21 22:49
БудДен
Воткнул вызов прямо в Modules.Main - работает.
Код: Выделить всё
PROCEDURE {FINAL} Main;
PROCEDURE InitializeGC EXTERN "GarbageCollector.Initialize";
PROCEDURE TerminateGC EXTERN "GarbageCollector.Terminate";
BEGIN {UNCOOPERATIVE, UNCHECKED}
CODE
mov r0,#3F000000H
orr r0,r0,#200000H
mov r2,#8000H
Loop:
str r2,[r0,#20H]
mov r1,#0100000H
WaitA:
subs r1,r1,#1
bne WaitA
str r2,[r0,#2CH] ; clear bit
mov r1,#010000H ; wait a while
WaitB:
subs r1,r1,#1
bne WaitB
b Loop ; again and again
(* SYSTEM.SetActivity (NIL);
SYSTEM.SetFramePointer (NIL);
Environment.Initialize;
InitializeGC;
Processors.Initialize;
Activities.Execute (PublishRegisteredModules);
Processors.Terminate;
FinalizeModules;
Activities.Terminate;
Queues.Terminate;
Environment.Terminate;
TerminateGC;
Environment.Exit (Environment.status); *)
END END Main;
Ну что, продвижение за сегодня неплохое. Дальше нужно, чтобы функции вызывались. Нужно разобраться с этими "фиксапами" - похоже, что они там есть, а я что-то сомневаюсь, что они там должны быть, ведь статическая же сборка. Мне кажется, что либо должен где-то быть код, который их разрешает и превращает в настоящие адреса, либо что-то не так с линковкой.
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 27.10.21 23:09
БудДен
Изменил команду линковки, теперь сборка делается так:
Код: Выделить всё
Release.Build --build --path="./" A2RPiCooperative ~
StaticLinker.Link -a --fileName=kernel.img --extension=Gof --displacement=8000H --path="./" Trace CPU Runtime Counters Processors Queues BaseTypes Timer Activities ExclusiveBlocks HeapManager Interrupts Environment Mutexes Machine Heaps Modules GarbageCollector Objects Kernel ~
Так тоже мигает:
Код: Выделить всё
PROCEDURE {NOPAF} Led1*;
CODE
mov r0,#3F000000H
orr r0,r0,#200000H
mov r2,#8000H
Loop:
str r2,[r0,#20H]
mov r1,#010000H
WaitA:
subs r1,r1,#1
bne WaitA
str r2,[r0,#2CH] ; clear bit
mov r1,#010000H ; wait a while
WaitB:
subs r1,r1,#1
bne WaitB
b Loop ; again and again
END Led1;
PROCEDURE {FINAL} Main;
PROCEDURE InitializeGC EXTERN "GarbageCollector.Initialize";
PROCEDURE TerminateGC EXTERN "GarbageCollector.Terminate";
BEGIN {UNCOOPERATIVE, UNCHECKED}
Led1;
Led1;
Led1;
(* SYSTEM.SetActivity (NIL);
SYSTEM.SetFramePointer (NIL);
Environment.Initialize;
InitializeGC;
Processors.Initialize;
Activities.Execute (PublishRegisteredModules);
Processors.Terminate;
FinalizeModules;
Activities.Terminate;
Queues.Terminate;
Environment.Terminate;
TerminateGC;
Environment.Exit (Environment.status); *)
END Main;
Следующая задача - чтобы процедура мигания вызывалась из другого модуля (а что-то не факт, что она вызывается) - это уже на завтра.
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 27.10.21 23:48
БудДен
Перенёс пр-ру мигания в RPI.Environment.Mod - мигает.
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 28.10.21 01:02
БудДен
Код: Выделить всё
tag = 00000005
memtag = 0000011C
memTag.size = 989855744
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 28.10.21 12:25
БудДен
Оно теперь падает где-то в районе включения остальных процессоров - загрузка начинает выполняться повторно. Либо я своими отладочными выводами вмешался в какую-то гонку и изменил в ней победителя, либо достигнут предел работоспособности. Пойду читать их учебные курсы...
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 28.10.21 16:13
БудДен
Имеется устойчивое ощущение, что код инициализации модуля не то, что не вызывается, а даже не линкуется. Картина слегка смазана тем, что я довольно долго читал дизассемблерный листинг от старого ядра, однако то, что не вызывается - это факт. Это непохоже на правду, т.к. там инициализируются некие константы. Возможно, я что-то не понял. Попробую найти хоть одну работающую кооперативную сборку для любой платформы и посмотрим, как она линкуется и вызывается ли там этот код.
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 28.10.21 19:08
БудДен
В некооперативной сборке код вызывается.
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 28.10.21 20:40
БудДен
Посмотрел на современной (октябрь 2021) ЯОС - поломана генерация кода, ассемблерные инструкции кривые. Нахаляву не прокатило :)
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 28.10.21 20:43
БудДен
В общем, принимаем гипотезу, что блоки между begin..end должны всё же выполняться, будем смотреть их судьбу и выяснять, почему не выполняются.
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 29.10.21 00:41
БудДен
Что-то не так в начале многопроцессорности. Попытался обойтись одним процессором, но логика на это не рассчитана и сразу падает. Видимо, нужно прочитать исходник. Также нужно внимательно смотреть - любая пр-ра без атрибута Cooperative сама по себе ожидает работающей многозадачности (т.к. компилятор вставляет куски кода).
Короче, сегодня ни черта не продвинулся.
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 29.10.21 23:21
БудДен
Не понял, почему и как, но дела пошли чуть лучше после удаления одной строчки, которая зависала. Блоки инициализации модулей, оказывается, вызываются из процедуры PublishRegisteredModules, Однако, до модуля Kernel дело всё же не доходит - похоже, виснет в Objects при создании активного объекта "clock".
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 30.10.21 00:32
БудДен
EmitCooperativeSwitch -> Activities.Switch
Re: Пытаюсь запустить под ARM, часть 2
Добавлено: 27.03.22 15:42
БудДен
Итог работы - под RPi2 кооперативное ядро загружается, см.
https://tvoygit.ru/budden/ja-o-s/src/br ... erry-pi.md