You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Для добавления обычного примера команды выводящей сообщение “hello world” необходимо создать файл “hello.c” с исходным кодом на языке Си.
3
-
2
+
Чтобы написать пример команды "Hello, World!" -- нужно создать файл "hello.c" с исходным кодом на языке "C":
4
3
```c
5
4
#include<stdio.h>
6
5
@@ -9,14 +8,18 @@ int main(int argc, char **argv) {
9
8
return 0;
10
9
}
11
10
```
12
-
13
11
И затем добавить описание модуля.
14
12
15
13
## Добавление модуля
16
-
Все модули и интерфейсы системы описываются в my-файлах: файлах с расширением .my или имеющих имя Mybuild (без расширения).
17
-
Структурно каждый my-файл содержит объявление пакета, которому принадлежат все определяемые в файле сущности, (опционально) список импортируемых имен из других пакетов, а также определения самих модулей и интерфейсов.
18
-
К примеру, для добавления новой команды для встроенного в ядро командного интерпретатора создадим новый файл Hello.my со следующим содержимым:
14
+
Все модули и интерфейсы системы описываются в "my"-файлах. **"My"-файлы** -- это файлы, имеющие расширение **".my"** или имя **"Mybuild"**.
15
+
16
+
**Структурно каждый "my"-файл содержит:**
19
17
18
+
* объявление пакета, которому принадлежат все определяемые в файле сущности
19
+
* список импортируемых имен из других пакетов (опционально)
20
+
* определения самих модулей и интерфейсов
21
+
22
+
Например, чтобы добавить команду в командный интерпретатор, встроенный в ядро, нужно создать файл "Hello.my" с таким содержанием:
20
23
```java
21
24
package embox.cmd.tutorial
22
25
@@ -26,26 +29,28 @@ module hello {
26
29
source "hello.c"
27
30
}
28
31
```
32
+
В этом примере мы описали простой модуль с единственным атрибутом "source" -- файлом "hello.c", который будем скомпилирован и связан с ядром, если модуль будет добавлен в сборку.
33
+
34
+
**Аннотация "@Cmd"** регистрирует модуль в системе как команду встроенного интерпретатора. Это позволяет запускать модуль по имени "hello".
35
+
36
+
Опциональный **параметр "help"** содержит строку, которая будет выведана при запуске команды “help hello” (если модуль "help" включен в сборку).
29
37
30
-
В этом примере описывается простой модуль имеющий всего один атрибут (source) - файл с исходным кодом “hello.c”, которых будет скомпилирован и связан с ядром в случае добавления модуля в сборку.
31
-
Аннотация @Cmd регистрирует модуль в системе как команду встроенного интерпретатора, позволяя, таким образом, запускать ее по имени “hello”. Необязательный параметр help содержит строку, которая будет выведана при запуске команды “help hello” (если модуль help также включен в сборку). Аннотация @AutoCmd позволяет использовать привычную функцию main() в качестве точки входа в программу.
38
+
**Аннотация "@AutoCmd"** позволяет использовать привычную функцию "main()" в качестве точки входа в программу.
32
39
33
40
### Атрибуты модуля
34
-
Модуль hello достаточно примитивен и не определяет никаких внешних зависимостей или опций. Единственный его атрибут - source - определяет набор исходных файлов для компиляции.
35
-
Опции
36
-
Теперь модифицируем пример таким образом, чтобы строка приветствия задавалась в виде опции. Для этого используется атрибут option.
**Модуль "hello"** достаточно примитивен и не определяет никаких внешних зависимостей или опций.
42
+
Единственный его атрибут - "source" - определяет набор исходных файлов для компиляции.
38
43
44
+
### Опции
45
+
Теперь давайте зададим строку приветствия в виде опции. Для этого мы воспользуемся атрибутом "option" и добавим модулю "hello" опцию "greeting":
39
46
```c
40
47
// ...
41
48
module hello {
42
49
// ...
43
50
option string greeting = "World"
44
51
}
45
52
```
46
-
47
-
И модифицируем файл исходного кода hello.c таким образом, чтобы команда после слова “Hello” выводила строку, содержащуюся в значении опции greeting:
48
-
53
+
И изменим файл "hello.c" таким образом, чтобы команда после слова "Hello" выводила строку, которая содержится в значении опции "greeting":
49
54
```c
50
55
#defineGREETING OPTION_STRING_GET(greeting)
51
56
@@ -55,8 +60,7 @@ module hello {
55
60
```
56
61
57
62
## Включение в сборку
58
-
Для того, чтобы новый модуль оказался в результирующем образе ядра, его необходимо добавить в конфигурацию сборки, которая описывается в файле conf/mods.conf:
59
-
63
+
Для того, чтобы новый модуль оказался в результирующем образе ядра, его необходимо добавить в конфигурацию сборки, которая описывается в файле "conf/mods.conf":
60
64
```
61
65
package genconfig
62
66
@@ -65,15 +69,20 @@ configuration conf {
65
69
include embox.cmd.tutorial.hello
66
70
}
67
71
```
68
-
Для того, чтобы переопределить значение опции, в конфигурации следует задать новые значения для опций в скобках после указания модуля:
69
-
72
+
Чтобы изменить значение опции, следует указать новое значение в скобках:
70
73
```
71
74
// ...
72
75
include embox.cmd.tutorial.hello(greeting="Everyone")
73
76
// ...
74
77
```
78
+
Как и многие атрибуты модуля, конфигурация поддерживает добавление аннотаций.
79
+
Чаще всего используется аннотация **"@Runlevel"**. Она позволяет загружать модули поэтапно и определять порядок их загрузки.
80
+
81
+
**Как правило, на ранних стадиях (runlevel=0) загружаются:**
75
82
76
-
Как и многие атрибуты модуля, конфигурация также поддерживает добавление аннотаций. Наиболее часто используемой является аннотрация @Runlevel, позволяющая разбить загрузку системы на стадии и определить, на каком этапе загружать тот или иной модуль.
83
+
* драйверы устройств, необходимых для корректного функционирования системы (например, контроллер прерываний)
84
+
* основные компоненты системы
85
+
Также на ранних стадиях исполняются низкоуровневые тесты и процедуры самодиагностики.
77
86
78
-
Как правило, на ранних стадиях (runlevel=0) загружаются драйверы устройств, необходимых для корректного функционирования системы (например, контроллер прерываний), основные компоненты системы, а также исполняются низкоуровневые тесты и процедуры самодиагностики. Следует отметить, что runlevel определяет лишь максимальную стадию, на которой должен быть запущен данный модуль. Таким образом, если какой-либо модуль, загружаемый на нулевой стадии, зависит от модуля, загружаемого позже, последний все-равно будет загружен раньше, т.е. на нулевой стадии.
87
+
**Обратите внимание**: порядок загрузки модулей по зависимостям имеет самый высокий приоритет. Поэтому опция "@Runlevel" работает в тех случаях, когда она не противоречит порядку загрузки по зависимостям.
0 commit comments