/ kernel / bugurt.h
bugurt.h
  1  /**************************************************************************
  2      BuguRTOS-4.0.x (Bugurt real time operating system)
  3      Copyright (C) 2018 anonimous
  4  
  5      This program is free software: you can redistribute it and/or modify
  6      it under the terms of the GNU General Public License as published by
  7      the Free Software Foundation, either version 3 of the License, or
  8      (at your option) any later version.
  9  
 10      This program is distributed in the hope that it will be useful,
 11      but WITHOUT ANY WARRANTY; without even the implied warranty of
 12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 13      GNU General Public License for more details.
 14  
 15      You should have received a copy of the GNU General Public License
 16      along with this program.  If not, see <http://www.gnu.org/licenses/>.
 17  
 18      Please contact with me by E-mail: shkolnick.kun@gmail.com
 19  
 20      A special exception to the GPL can be applied should you wish to distribute
 21      a combined work that includes BuguRTOS, without being obliged to provide
 22      the source code for any proprietary components. See the file exception.txt
 23      for full details of how and when the exception can be applied.
 24  **************************************************************************/
 25  
 26  /*****************************************************************************************
 27  ```````````````````````````````..:+oyhdmNNMMMMMMNmmdhyo+:..```````````````````````````````
 28  ``````````````````````````.:oydNMMMMMMMMMNNNNNNNNMMMMMMMMMNdy+:.``````````````````````````
 29  ```````````````````````:sdNMMMMMNdys+/::----------::/osydNMMMMMNds:```````````````````````
 30  ```````````````````.+hNMMMMmho/-..........................-/shmMMMMNh/.```````````````````
 31  ````````````````./hNMMMNho:...................................-:ohNMMMNh/`````````````````
 32  ``````````````.smMMMNy/-.......:////ss++/+-.......................-+yNMMMmo.``````````````
 33  ````````````-sNMMMd+-.....:////:-...-/s::..............+o/-..........-odMMMNs.````````````
 34  ``````````.sNMMNh/....................................-o:--............./hMMMNo.``````````
 35  `````````+mMMMh:-........................................-...............-/dMMMm/`````````
 36  ```````.yMMMm/...................-::--..................:-........--........+mMMMy.```````
 37  ``````:mMMMy-.......................-::-...............-:.........-::........-yMMMd:``````
 38  `````/NMMN+-..................::-.....-:-............../--.........-:/-.......-+NMMN:`````
 39  ````+NMMm::o/-..--/+o+o+++++o+osys+//::-::.............:/....-:-::-..-++-.......:NMMN/````
 40  ```/NMMm:.-++-+yhs/-``       `dMMMMMmho+:-..............:-/+yho/:/+oyo//o-......./mMMN:```
 41  ``-NMMm/....-/--::/o+o+oo+oo++oosyss+smyo/.............:yyho-`     smMMddh-......./NMMN.``
 42  `.hMMM/......-++:-.-:oooooooooosyyhhys/...............-+osyyyyysssssooo+ohhs-......+MMMh.`
 43  `+MMMy.......-::/++:-.....-:/++++o+o/--................--/oooo+o++o+++////-y/.......hMMM/`
 44  .mMMN:.........--:---...-::/+//::--.......................--//+//-...-.....+/......./NMMd`
 45  /MMMy............-::----------....----/+-.....................-++/:---....-o-........hMMN:
 46  yMMM/.............--:://///oo+++/+++oo+-.......................-://+/:--::::.........+MMMs
 47  mMMN:................----:/h:::/:/::---.........................--/osss+++:..........:NMMd
 48  MMMd-....................:mNs:-....................................--:odo:-..........:mMMN
 49  MMMd-....................yoshyoso:--................................../mm/...........:mMMM
 50  MMMm:..................../-o/h.y-:+dooo+/:--....................-/osydddmh...........:mMMN
 51  mMMN:........................+mNs `h.  -d/:/+h++ooooy+++s++y+++mo+y` yh.do...........:NMMh
 52  sMMM+........................-hmMo/ds  oMo`.-o     :h   s:`h` `Nysd.-Ny-h:...........+MMMo
 53  /MMMh........................./smMMMMd+NMMNNMh`    sN: .mNNMddNMMMMNmN+..............hMMN:
 54  .dMMN/........................./+hMMMMMMMMMMMMmhyyyNMNNMMMMMMMMMMMNsoo-............./NMMd`
 55  `+MMMh.........................-/+omMMMMMMMMMMMMMMMMMMMMMMMMMMMMms-/+...............hMMM/`
 56  `.hMMM+..........................:/-omMMMMMMMMMMMMMMMdmMdhMMMds/-..-...............oMMMy``
 57  ``.NMMN/............................--/hNN/h.`ys:dmsd:-syos+--+.................../NMMN.``
 58  ```/NMMm:...........................:+/--:+s++oo+osoo+/:-..-/+::-................/mMMN:```
 59  ````/NMMN:............................-/++/:-..........-//+/-..:+.--............/NMMN/````
 60  `````:NMMN+-.............../+-.............-://////////:-.......+s+::.........-oNMMN:`````
 61  ``````:mMMMy-..............:/o-.................................:yo//........-hMMMd-``````
 62  ```````.yMMMm+.............:o:++-...............................+y+o-......-+mMMMs.```````
 63  `````````/mMMMd/-...........-++:+/-.---........................-ho+/.....-/dMMMm/`````````
 64  ``````````.oNMMMh/............-++:++/////:....................-yo:o-...-+hMMMNo.``````````
 65  ````````````.sNMMMdo-...........-++::++:-:/+//:..............:o:/o-..-omMMMNo.````````````
 66  ``````````````.omMMMNy+-..........-/+-.:/+/:--:+++/++//:/::/+/-+/.-+hMMMMmo```````````````
 67  `````````````````/hNMMMNho:-...............-:/:-....--::::--..-/ohNMMMNy:`````````````````
 68  ```````````````````./hNMMMMmhs/-..........................-/shNMMMMNy/.```````````````````
 69  ```````````````````````:sdNMMMMMNdhso+/:----------:/+oshdNMMMMMNho:```````````````````````
 70  ``````````````````````````.:+ydNMMMMMMMMMMNNNNNNMMMMMMMMMMmds+:```````````````````````````
 71  ````````````````````````````````.:/osyhdmNNMMMMNNmdhyso/:.````````````````````````````````
 72  ******************************************************************************************
 73  *                                                                                        *
 74  *                   This logo was graciously delivered by 10003-kun ITT:                 *
 75  *                                                                                        *
 76  *                           http://www.0chan.ru/r/res/9996.html                          *
 77  *                                                                                        *
 78  *****************************************************************************************/
 79  #ifndef BGRT_H
 80  #define BGRT_H
 81  
 82  #ifdef __cplusplus
 83  #   define BGRT_CDECL_BEGIN extern "C" {
 84  #   define BGRT_CDECL_END   }
 85  #else
 86  #   define BGRT_CDECL_BEGIN
 87  #   define BGRT_CDECL_END
 88  #endif // __cplusplus
 89  BGRT_CDECL_BEGIN
 90  /*!
 91  \mainpage
 92  
 93  \~russian
 94  BuguRTOS - ядро операционной системы реального времени. Написано анонимусом ДЛЯ УДОВОЛЬСТВИЯ.
 95  \warning Распространяется под изменённой лицензией GPLv3, смотрите exception.txt.
 96  
 97  \~english
 98  The BuguRTOS is a RTOS bgrt_kernel. It is written by anonymous JUST FOR FUN.
 99  \warning BuguRTOS license is modified GPLv3, look at exception.txt for more info.
100  
101  */
102  
103  /*!
104  \file
105  \~russian
106  \brief Главный заголовочный файл.
107  
108  В этот файл включены все заголовочные файлы BuguRTOS.
109  В свою очередь все исходные тексты включают этот файл.
110  \~english
111  \brief The top header file.
112  
113  All other BuguRTOS headers are included here.
114  On the other hand all BuguRTOS source files include this file.
115  */
116  #define BGRT_CONCAT(a,b) a##b
117  #define BGRT_CONCAT2(a,b) BGRT_CONCAT(a,b)
118  #define BGRT_CONCAT3(a,b) BGRT_CONCAT2(a,b)
119  /*
120  ======================================================
121                  ОПРЕДЕЛЕНИЯ ТИПОВ
122                       TYPEDEFS
123  ======================================================
124  */
125  /*!
126  \~russian
127  \brief
128  Исполняемый код.
129  
130  Указатель на функцию типа void, принимающую в качестве аргумента указатель типа void.
131  
132  \~english
133  \brief
134  Executable code.
135  
136  A pointer to a void function, that takes void pointer as argument.
137  */
138  typedef void (* bgrt_code_t)(void *);
139  /*
140  ======================================================
141                       ИНКЛЮДЫ
142  ======================================================
143  BuguRTOS config (must be included first)
144  */
145  #include <bugurt_config.h>
146  
147  #ifndef BGRT_ASSERT
148  #define BGRT_ASSERT(c,msg) do{}while(0)
149  #endif // BGRT_ASSERT
150  
151  /*Basic types*/
152  #include "index.h"  /* ADLINT:SL:[W0073] No include guard! */
153  #include "item.h"   /* ADLINT:SL:[W0073] No include guard! */
154  #include "pcounter.h"
155  #include "xlist.h"
156  #include "pitem.h" /*Depends on xlist.h*/
157  
158  /*Kernel services (use basic types)*/
159  #include "crit_sec.h"
160  #include "proc.h"
161  #include "sched.h"
162  #include "sync.h"
163  #include "syscall.h"
164  #include "timer.h"
165  
166  #include <bugurt_port.h>
167  /*bgrt_map_t, depends on BGRT_INT_LOCK/FREE*/
168  #include "vint.h"
169  /*Kernel (kernel services, must be included after syscall.h and vint.h)*/
170  #include "kernel.h"
171  
172  #define BGRT_ST_OK          ((bgrt_st_t)0)  /*!< \~russian \brief Удачное завершение. \~english \brief Success.*/
173  #define BGRT_ST_ENULL       ((bgrt_st_t)1)  /*!< \~russian \brief Передан нулевой указатель. \~english \brief Null pointer argument. */
174  #define BGRT_ST_EOWN        ((bgrt_st_t)2)  /*!< \~russian \brief Ошибка владения. \~english \brief Ownership error. */
175  #define BGRT_ST_EEMPTY      ((bgrt_st_t)3)  /*!< \~russian \brief Список процессов пуст. \~english \brief The process list is empty. */
176  #define BGRT_ST_ESYNC       ((bgrt_st_t)4)  /*!< \~russian \brief Не тот объект типа #bgrt_sync_t. \~english \brief Wrong #bgrt_sync_t object. */
177  #define BGRT_ST_ETIMEOUT    ((bgrt_st_t)5)  /*!< \~russian \brief Иcтек таймаут #bgrt_sync_t. \~english \brief Timeout expired. */
178  #define BGRT_ST_ESTAT       ((bgrt_st_t)6)  /*!< \~russian \brief Ошибка состояния процесса. \~english \brief Process state error. */
179  #define BGRT_ST_EAGAIN      ((bgrt_st_t)7)  /*!< \~russian \brief Попробуйте ещё раз. \~english \brief Try again. */
180  #define BGRT_ST_SCALL       ((bgrt_st_t)8)  /*!< \~russian \brief Неправильный системный вызов. \~english \brief Wrong system call. */
181  #define BGRT_ST_ROLL        ((bgrt_st_t)9)  /*!< \~russian \brief Нужна следующая иттерация. \~english \brief Next itteration needed. */
182  #define BGRT_ST_IDLE        ((bgrt_st_t)10) /*!< \~russian \brief Простой системы. \~english \brief The system is IDLE. */
183  #define BGRT_ST_B4SC        ((bgrt_st_t)11) /*!< \~russian \brief Метка состояния перед обработкой системного вызова. \~english \brief A mark for the state "Before system call processed". */
184  
185  /*!
186  \~russian
187  \brief Низший приоритет.
188  
189  \~english
190  \brief Lowest priority level.
191  */
192  #define BGRT_PRIO_LOWEST ((bgrt_prio_t)BGRT_BITS_IN_INDEX_T - (bgrt_prio_t)1)
193  
194  /*!
195  \def BGRT_SPIN_INIT(arg)
196  \~russian
197  \brief Макрос-обёртка.
198  
199  Обёртка инициализации спин-блокировки arg->lock, на однопроцессорной системе - пустой макрос.
200  \~english
201  \brief Wrapper macro.
202  
203  Initialization wrapper for arg->lock spinlock. Empty macro in single core system.
204  */
205  /*!
206  \def BGRT_SPIN_LOCK(arg)
207  \~russian
208  \brief Макрос-обёртка.
209  
210  Обёртка захвата спин-блокировки arg->lock, на однопроцессорной системе - пустой макрос.
211  \~english
212  \brief Wrapper macro.
213  
214  Lock wrapper for arg->lock spinlock. Empty macro in single core system.
215  */
216  /*!
217  \def BGRT_SPIN_FREE(arg)
218  \~russian
219  \brief Макрос-обёртка.
220  
221  Обёртка освобождения спин-блокировки arg->lock, на однопроцессорной системе - пустой макрос.
222  \~english
223  \brief Wrapper macro.
224  
225  Lock wrapper for arg->lock spinlock. Empty macro in single core system.
226  */
227  /*!
228  \def BGRT_RESCHED_PROC(arg)
229  \~russian
230  \brief Макрос-обёртка.
231  
232  Обёртка функции #bgrt_resched.
233  \~english
234  \brief Wrapper macro.
235  
236  A wrapper for #bgrt_resched function.
237  */
238  
239  #ifdef BGRT_CONFIG_MP
240  #   define BGRT_SPIN_INIT(arg) bgrt_spin_init(&((arg)->lock))
241  #   define BGRT_SPIN_LOCK(arg) bgrt_spin_lock(&((arg)->lock))
242  #   define BGRT_SPIN_FREE(arg) bgrt_spin_free(&((arg)->lock))
243  #   define BGRT_RESCHED_PROC(proc) bgrt_resched(proc->core_id)
244  #   ifndef BGRT_KERNEL_PREEMPT
245  #       define BGRT_KERNEL_PREEMPT() bgrt_kblock_do_work(&bgrt_kernel.kblock[bgrt_curr_cpu()])
246  #   endif
247  #else /*BGRT_CONFIG_MP*/
248  #   define BGRT_SPIN_INIT(arg) do{}while (0)
249  #   define BGRT_SPIN_LOCK(arg) do{}while (0)
250  #   define BGRT_SPIN_FREE(arg) do{}while (0)
251  #   define BGRT_RESCHED_PROC(proc) bgrt_resched()
252  #   ifndef BGRT_KERNEL_PREEMPT
253  #       define BGRT_KERNEL_PREEMPT() bgrt_kblock_do_work(&bgrt_kernel.kblock)
254  #   endif
255  #endif /*BGRT_CONFIG_MP*/
256  /*
257  ======================================================
258     Внешние функции, определяемые пользователем
259          User defined external functions
260  ======================================================
261  */
262  #ifdef BGRT_CONFIG_MP
263  
264  /*!
265  \~russian
266  \brief
267  Инициализация спин-блокировки на многопроцессорной системе.
268  
269  Инициализация спин-блокировки на многопроцессорной системе.
270  
271  \warning Для внутреннего использования.
272  
273  \param lock Указатель на спин-блокировку.
274  \~english
275  \brief
276  Spin-lock initialization for MP system.
277  
278  \warning Internal usage function.
279  
280  \param lock a pointer to a spin-lock
281  */
282  extern void bgrt_spin_init(bgrt_lock_t * lock);
283  
284  /*!
285  \~russian
286  \brief
287  Захват спин-блокировки на многопроцессорной системе.
288  
289  Захват спин-блокировки на многопроцессорной системе.
290  
291  \warning Для внутреннего использования.
292  
293  \param lock Указатель на спин-блокировку.
294  \~english
295  \brief
296  Lock spin-lock on MP system.
297  
298  \warning Internal usage function.
299  
300  \param lock a pointer to a spin-lock
301  */
302  extern void bgrt_spin_lock(bgrt_lock_t * lock);
303  
304  /*!
305  \~russian
306  \brief
307  Освобождение спин-блокировки на многопроцессорной системе.
308  
309  \param lock Указатель на спин-блокировку.
310  
311  \warning Для внутреннего использования.
312  
313  \~english
314  \brief
315  Unlock spin-lock on MP system.
316  
317  \warning Internal usage function.
318  
319  \param lock a pointer to a spin-lock
320  */
321  extern void bgrt_spin_free(bgrt_lock_t * lock);
322  
323  /*!
324  \~russian
325  \brief
326  Возвращает id процессорного ядра.
327  
328  Возвращает id процессорного ядра, на котором исполняется.
329  
330  \warning Для внутреннего использования.
331  
332  \~english
333  \brief
334  Returns processor core id.
335  
336  This function returns an id of a processor core on which it is run.
337  
338  \warning Internal usage function.
339  */
340  extern bgrt_cpuid_t bgrt_curr_cpu(void);
341  
342  /* Доступ к объектам типа bgrt_ls_t должен быть атомарным!!!*/
343  /* A bgrt_ls_t access must be atomic!!! */
344  /*!
345  \~russian
346  \brief
347  Инициализация статистики
348  
349  Инициализирует структуру bgrt_ls_t, в которой хранится статистика.
350  
351  \warning Для внутреннего использования.
352  
353  \param stat Указатель на структуру статистики.
354  \~english
355  \brief
356  Statistic initialization.
357  
358  Initiates a bgrt_ls_t structure, in which processor core load information is stored.
359  
360  \warning Internal usage function.
361  
362  \param stat a pointer to a bgrt_ls_t structure.
363  */
364  extern void bgrt_stat_init(bgrt_ls_t * stat);
365  /*!
366  \~russian
367  \brief
368  Обновление статистики при запуске процесса/ вставки процесса в очередь сигнала.
369  
370  Обновление статистики при запуске процесса/ вставки процесса в очередь сигнала.
371  
372  \warning Для внутреннего использования.
373  
374  \param proc Указатель на процесс.
375  \param stat Указатель на структуру статистики.
376  \~english
377  \brief
378  Statistic update on load increase.
379  
380  Statistic increase on a process run or a process insert to a signal wait list.
381  
382  \warning Internal usage function.
383  
384  \param proc a pointer to a process.
385  \param stat a pointer to a bgrt_ls_t structure.
386  */
387  extern void bgrt_stat_inc(bgrt_proc_t * proc, bgrt_ls_t * stat);
388  /*!
389  \~russian
390  \brief
391  Обновление статистики при останове процесса/ удаления процесса из очереди сигнала.
392  
393  Обновление статистики при останове процесса/ удаления процесса из очереди сигнала.
394  
395  \warning Для внутреннего использования.
396  
397  \param proc Указатель на процесс.
398  \param stat Указатель на структуру статистики.
399  \~english
400  \brief
401  Statistic update on load decrease.
402  
403  Statistic update on a process stop or a process cut from a signal wait list.
404  
405  \warning Internal usage function.
406  
407  \param proc a pointer to a process.
408  \param stat a pointer to a bgrt_ls_t structure.
409  */
410  extern void bgrt_stat_dec(bgrt_proc_t * proc, bgrt_ls_t * stat);
411  /*!
412  \~russian
413  \brief
414  Перенос статистики.
415  
416  При передаче процессов из списка ожидающих сигнал в список готовых к выполнению надо обновить статистическую информацию в Ядре.
417  
418  \warning Для внутреннего использования.
419  
420  \param src_stat Указатель на структуру статистики сигнала.
421  \param dst_stat Указатель на структуру статистики Ядра.
422  \~english
423  \brief
424  Statistic merge.
425  
426  Updates Kernel and a signal statistic when signal wait list is merged with scheduler ready process list.
427  
428  \warning Internal usage function.
429  
430  \param src_stat a pointer to a signal statistic structure.
431  \param dst_stat a pointer to a Kernel statistic structure.
432  */
433  extern void bgrt_stat_merge(bgrt_ls_t * src_stat, bgrt_ls_t * dst_stat);
434  /*!
435  \~russian
436  \brief
437  Расчёт нагрузки.
438  
439  Расчёт нагрузки на одном процессорном ядре.
440  
441  \warning Для внутреннего использования.
442  
443  \param prio Приоритет процесса, для которого считаем нагрузку.
444  \param stat Указатель на структуру статистики Ядра.
445  \return Текущую оценку нагрузки на процессорном ядре, за которое отвечает stat.
446  \~english
447  Load calculation.
448  
449  Processor core load calculation.
450  
451  \warning Internal usage function.
452  
453  \param prio a priority of a process for which we want to compute a load.
454  \param stat a pointer to a Kernel statistic structure.
455  \return current estimation of the core load.
456  */
457  extern bgrt_load_t bgrt_stat_calc_load(bgrt_prio_t prio, bgrt_ls_t * stat);
458  /*!
459  \~russian
460  \brief
461  Перепланировка.
462  
463  Запускает перепланировку на одном из процессорных ядер.
464  
465  \warning Для внутреннего использования.
466  
467  \param core_id ID ядра, на котором надо перепланировать исполнение процессов.
468  \~english
469  \brief
470  Rescheduling.
471  
472  Launches a reschedule sequence on one of the processor cores of the system.
473  
474  \warning Internal usage function.
475  
476  \param core_id a processor core id.
477  */
478  extern void bgrt_resched(bgrt_cpuid_t core_id);
479  #else /* #ifdef BGRT_CONFIG_SAVE_POWER */
480  
481  /*!
482  \~russian
483  \brief
484  Перепланировка.
485  
486  Запускает перепланировку.
487  
488  \warning Для внутреннего использования.
489  
490  \~english
491  \brief
492  Rescheduling.
493  
494  Launches a reschedule sequence.
495  
496  \warning Internal usage function.
497  */
498  extern void bgrt_resched(void);
499  #endif /*BGRT_CONFIG_MP*/
500  
501  /*!
502  \~russian
503  \brief
504  Текущий процесс.
505  
506  \warning Для внутреннего использования.
507  
508  \return Указатель на текущий процесс, исполняемый на локальном процессоре.
509  \~english
510  \brief
511  Current process.
512  
513  \warning Internal usage function.
514  
515  \return a pointer to a current process on a local processor core.
516  */
517  extern bgrt_proc_t * bgrt_curr_proc(void);
518  
519  /*!
520  \~russian
521  \brief
522  Инициализация стека процесса.
523  
524  Подготовка стека к запуску процесса. Делает так, что после восстановления контекста процесса происходит вызов функции pmain(arg).
525  
526  \warning Для внутреннего использования.
527  
528  \param sstart Дно стека.
529  \param pmain Функция, которая будет вызвана после восстановления контекста.
530  \param arg Аргумент вызываемой функции.
531  \param return_address адрес возврата из pmain.
532  \return Указатель на вершину подготовленного стека.
533  \~english
534  \brief
535  A process stack initialization.
536  
537  This function prepares a process stack for running a process.
538  It treats a process stack in such a way that pmain(arg) is called when a process context is restored from a process stack.
539  
540  \warning Internal usage function.
541  
542  \param sstart a process stack bottom.
543  \param pmain a pointer to a function to call.
544  \param arg an argument to a function to call.
545  \param return_address an address to return from pmain.
546  \return a pointer to a prepared process stack top.
547  */
548  extern bgrt_stack_t * bgrt_proc_stack_init(bgrt_stack_t * sstart, bgrt_code_t pmain, void * arg, void (*return_address)(void));
549  /*!
550  \~russian
551  \brief
552  Инициализация Ядра.
553  
554  Подготовка Ядра к запуску.
555  \~english
556  \brief
557  The Kernel initiation.
558  
559  Initiates the Kernel before the OS start.
560  */
561  extern void bgrt_init(void);
562  /*!
563  \~russian
564  \brief
565  Запуск Ядра.
566  
567  Запуск Ядра. После вызова этой функции можно ничего не писать - все равно исполняться не будет.
568  \~english
569  \brief
570  The OS start.
571  
572  The OS start. It is not necessary to write any code after call of this function, because such a code won't be run normally.
573  */
574  extern void bgrt_start(void);
575  /*!
576  \~russian
577  \brief
578  Системный вызов.
579  
580  Код Ядра всегда выполняется в контексте Ядра. Это нужно для экономии памяти в стеках процессов.
581  Соответственно, если мы хотим выполнить какие либо операции над процессами, мьютексами, семафорами, сигналами,
582  то нам нужно "попросить" Ядро сделать эту работу.
583  
584  Именно для этого существует функция bgrt_syscall, которая передаёт управление Ядру для выполнения требуемой работы.
585  
586  \warning Для внутреннего использования.
587  
588  \param num номер системного вызова (что именно надо выполнить).
589  \param arg аргумент системного вызова (над чем это надо выполнить).
590  \~english
591  \brief
592  A system call.
593  
594  This function switches a processor core from a process context to the kernel context.
595  The kernel code is always run in the kernel context. This is done to save memory in process stacks.
596  A system calls are done on every operations with processes, mutexes, semaphores and signals.
597  The Kernel does all of this job.
598  
599  \warning Internal usage function.
600  
601  \param num a number of a system call (what is going to be done).
602  \param arg a system call argument (a pointer to an object to be processed).
603  */
604  extern bgrt_st_t bgrt_syscall(bgrt_syscall_t num, void * arg);
605  
606  /*!
607  \~russian
608  \brief
609  Переключение из контекста Ядра в контекст текущего процесса.
610  
611  \~english
612  \brief
613  Kernel to process context switch.
614  */
615  extern void bgrt_switch_to_proc(void);
616  
617  BGRT_CDECL_END
618  #endif /*BGRT_H*/