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*/