рдУрдкрдирдПрдорд╕реАрдПрдкреАрдЖрдИ: рдорд▓реНрдЯреА-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рд▓рд┐рдирдХреНрд╕ рдФрд░ рдЖрд░рдЯреАрдУрдПрд╕ рдХреЛ рдПрдХ рд╕рд╛рде рдЪрд▓рд╛рдирд╛



рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рдПрдореНрдмреЗрдбреЗрдб рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдХ рдЪрд┐рдк рдкрд░ рдПрди-рдХреЛрд░ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд┐рдз рдУрдПрд╕ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд▓рд┐рдирдХреНрд╕ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд░рдЯреАрдУрдПрд╕ рд╣реИред Linux рдХреЗ рдХрдВрдзреЗ рдкрд░ рд╣реЗрд╡реАрд╡реЗрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реНрдЯреИрдХ рд╣реИрдВ, рдЬрдмрдХрд┐ RTOS рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред

рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдЖрдВрддрд░рд┐рдХ рдкрд░рдорд╛рдгреБ рд╡рд┐рдирд┐рдордпред рдпрджрд┐ рдЖрдк OpenMCAPI рдУрдкрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд┐рд╕реА рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕реАрдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдХреА рджрд░реНрдЬрдиреЛрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝реНрд▓рд┐рдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдереНрд░реВрдкреБрдЯ рд╕рдВрдЦреНрдпрд╛рдПрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдЖрдВрддрд░рд┐рдХ рдореЗрдореЛрд░реА рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХрд╛ рдХрд╛рд░реНрдп рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдХреА рдЕрдкрдиреА рдкрд░рдд рд▓рд┐рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдореЛрдВ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реНрдирд▓ рдиреНрдпреВрдХреНрд▓рд┐рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ API рдХреЛ рдорд╛рдирдХреАрдХреГрдд рд░реВрдк рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд▓реНрдЯреАрдХреЛрд░ рдПрд╕реЛрд╕рд┐рдПрд╢рди (MCA) рдиреЗ MCAPI (рдорд▓реНрдЯреАрдХреЛрд░ рдХрдореНрдпреБрдирд┐рдХреЗрд╢рдВрд╕ рдПрдкреАрдЖрдИ) рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдЬрд╛рд░реА рдХрд┐рдпрд╛, рдФрд░ рдЬрд▓реНрдж рд╣реА рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдкреНрд░рд╢реНрди рдореЗрдВ рдУрдкрдирдПрдорд╕реАрдПрдкреАрдЖрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдорд╕реАрдПрдкреАрдЖрдИ 2.0 рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ рдореЗрдВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЙрд░реНрдкреЛрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдореБрдХреНрдд рдмреАрдПрд╕рдбреА / рдЬреАрдкреАрдПрд▓ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЙрдиреНрдЪ рдФрд░ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреА рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рднреА рд╣реИред

OpenMCAPI рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢реБрд░реВ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдпрд╛ рд╢реЗрдпрд░реНрдб рдореЗрдореЛрд░реА (рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ mpc85xx рдФрд░ mv78xx0 рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред

рдУрдкрдирдПрдорд╕реАрдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдирдХреНрд╕ рдФрд░ рдЖрд░рдЯреАрдУрдПрд╕ рдХреА рдмрд╛рддрдЪреАрдд рдХреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрдореВрд░реНрдд рд╕реНрддрд░реЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ (рдЪрд┐рддреНрд░ 1 рджреЗрдЦреЗрдВ):


рдЪрд┐рддреНрд░рд╛ред 1. рдУрдкрдирдПрдорд╕реАрдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдирдХреНрд╕ рдФрд░ рдЖрд░рдЯреАрдУрдПрд╕ рдХреА рдмрд╛рддрдЪреАрдд рдХреА рд╕рдВрд░рдЪрдирд╛

рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
  1. MCAPI рдЬреЗрдиреЗрд░рд┐рдХ рдмрд╛рд╣реНрдп MCAPI API рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
  2. OS рд▓реЗрдпрд░ рдЬреЗрдиреЗрд░рд┐рдХ MCAPI рд▓реЗрдпрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рднрд╛рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ libmcapi / mcapi / linux / mcapi_os.c рдФрд░ рдЗрд╕рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИ:
  3. рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдПрдХ рдЕрдореВрд░реНрдд рдкрд░рдд рд╣реИ рдЬреЛ рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рд╕реНрддрд░ рдкрд░ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ libmcapi / shm / shm.c рдФрд░ libmcapi / shm / linux / shm_os.c рдлрд╛рдЗрд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИ:
  4. рдУрдПрд╕ рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдореЙрдбреНрдпреВрд▓ libmcapi / shm / linux / kmod рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИ:

рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкрд░рд┐рд╡рд╣рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рддрдЪреАрдд рдХреЗ рддрдВрддреНрд░ рдХреА рдкреВрд░реА рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕реЗ рдУрдкрдирдПрдорд╕реАрдПрдкреАрдЖрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдВрддрд░рд┐рдХ рдореЗрдореЛрд░реА рддрдВрддреНрд░ рдФрд░ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЖрдЧреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ mpc85xx рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо ( рдлреНрд░реАрд╕реНрдХреЗрд▓ рдХреЗ P1020 рдЪрд┐рдк ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ред рд╕реЙрдлреНрдЯрд╡реЗрдпрд░: рдкреИрдЪ рдХреЗ рд╕рд╛рде рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╕рдВрд╕реНрдХрд░рдг 2.6.35, рдЬреЛ рдХрд┐ рдлреНрд░реАрд╕реНрдХреЗрд▓ QorIQ_SDK_V1_03 рд╡рд┐рдХрд╛рд╕ рдХрд┐рдЯ (рдПрд╕рдбреАрдХреЗ) (рдЙрдирдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдЙрдкрд▓рдмреНрдз рд╣реИ) рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, RTEMS рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо (RTOS) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ git рдкрд░ git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: //git.rtems.org/rtems.git

рдЖрдВрддрд░рд┐рдХ рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлреНрд░реАрд╕реНрдХреЗрд▓ рдХрдо рд╕реЗ рдХрдо рджреЛ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
  1. рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕рд░ рдЗрдВрдЯрд░рдкреНрдЯреНрд╕ (IPIs) - рдЗрдВрдЯреНрд░рд╛рдХреНрд▓рд┐рдпрд░ рдЗрдВрдЯрд░рдкреНрдЯ, рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рдЗрдВрдЯрд░рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде 4 рдЯреБрдХрдбрд╝реЗ рддрдХред
  2. рд╕рдВрджреЗрд╢ рдЗрдВрдЯрд░рдкреНрдЯреНрд╕ (MSGRs) - рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рд▓рд┐рдЦрддреЗ рд╕рдордп рд╡реНрдпрд╡рдзрд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде 32-рдмрд┐рдЯ рдЖрдВрддрд░рд┐рдХ рд╕рдВрджреЗрд╢, 8 рдЯреБрдХрдбрд╝реЗ рддрдХред

Openmcapi рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП OS рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MSGRs рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рдЪрд┐рддреНрд░ 2 рджреЗрдЦреЗрдВ):


рдЪрд┐рддреНрд░рд╛ 2. рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛

рдЕрдВрддрд░рд┐рдХреНрд╖ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рд╕реНрдореГрддрд┐ рдХреНрд╖реЗрддреНрд░ рдХреЛ рджреЛ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

/* SM driver mamagement block */ struct _shm_drv_mgmt_struct_ { shm_lock shm_init_lock; mcapi_uint32_t shm_init_field; struct _shm_route_ shm_routes[CONFIG_SHM_NR_NODES]; struct _shm_buff_desc_q_ shm_queues[CONFIG_SHM_NR_NODES]; struct _shm_buff_mgmt_blk_ shm_buff_mgmt_blk; }; 

рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
  1. рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рд▓реЙрдХ shm_init_lock рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдЭрд╛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрди-рдХреЛрд░ рдХреА рдкрд╣реБрдВрдЪ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рд╡реИрд░рд┐рдПрдмрд▓ shm_init_field рдореЗрдВ рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдПрдВрдб рдХреБрдВрдЬреА рд╣реИ, рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ SHM_INIT_COMPLETE_KEY рдорд╛рди рд▓реЗрддрд╛ рд╣реИред
  3. Shm_routes - рдЖрдВрддрд░рд┐рдХ рд╕рдВрдЪрд╛рд░ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдореЗрдВ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХреЛрд░ (рдиреЛрдбреНрд╕) рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ CONFIG_SHM_NR_NODES рд╕рдВрдЪрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 2 рдиреЛрдбреНрд╕ред
  4. Shm_queues - рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдб рд╕реЗ рдЬреБрдбрд╝реА рд╕рдВрджреЗрд╢ рдХрддрд╛рд░реЗрдВ, CONFIG_SHM_NR_NODES рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 2 рд▓рд╛рдЗрдиреЗрдВред
  5. Shm_buff_mgmt_blk - рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдмрдлрд░ рдкреНрд░рдмрдВрдзрди рд╕рдВрд░рдЪрдирд╛ (SHM_BUFFER)ред



рдкреЛрд░реНрдЯрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╕рдВрдЪрд╛рд░ рддрдВрддреНрд░ рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдЖрд░реЗрдЦ рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рддрдВрддреНрд░ OpenMCAPI рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдВрдЬреАрд░ рджреЗрдЦреЗрдВ 3):



рдЪрд┐рддреНрд░рд╛ред 3. рд╕рд╛рдЭрд╛ рд╕реНрдореГрддрд┐ (рдУрдкрдирдПрдорд╕реАрдПрдкреАрдЖрдИ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдЪрд╛рд░ рдХреЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рддрдВрддреНрд░ рдХреЗ рдПрд╕рдбреАрдПрд▓ рдЖрд░реЗрдЦред

рдЖрд░реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:

RTEMS рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯрд┐рдВрдЧ рд╡рд┐рд╡рд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ OS рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред



RTEMS (рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдПрдХреНрдЬреАрдХреНрдпреВрдЯрд┐рд╡) рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ RTOS, рдлреБрд▓-рдлреАрдЪрд░реНрдб рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдУрдкрди рд╕реНрдЯреИрдВрдбрд░реНрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ (APIs), POSIX рдорд╛рдирдХ рдФрд░ BSD рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИред рдпрд╣ рдЕрдВрддрд░рд┐рдХреНрд╖, рдЪрд┐рдХрд┐рддреНрд╕рд╛, рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рдХрдИ рдЕрдиреНрдп рдПрдореНрдмреЗрдбреЗрдб рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣реИред RTEMS рдореЗрдВ ARM, PowerPC, Intel, Blackfin, MIPS, Microblaze рдЖрджрд┐ рдЬреИрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ tcp / ip, http, ftp, telnet рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╕реНрдЯреИрдХ рд╣реЛрддрд╛ рд╣реИред рдЖрд░рдЯреАрд╕реА, рдирдВрдж, UART рдФрд░ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХреАрдХреГрдд рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЪрд▓рд┐рдП OpenMCAPI рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рд▓рд┐рдВрдХ рдкрд░ рд╕реНрдерд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ [1] рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
  1. OS рдкрд░рдд рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдлрд╛рдЗрд▓реЗрдВ:
    • libmcapi / mcapi / rtems / mcapi_os.c;
    • libmcapi /include/rtems/mgc_mcapi_impl_os.h

  2. рд╕рдВрдЧрдд рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдлрд╝рд╛рдЗрд▓:
    • libmcapi / shm / rtems / shm_os.cред

  3. OpenMCAPI рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рдлрд╝ -рдмрд┐рд▓реНрдбрд░ рдореЗрдВ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВред

рдЪреВрдВрдХрд┐ рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо P1020 (рдкрд╛рд╡рд░рдкреАрд╕реА, 500 рд╡реА 2) рдФрд░ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдЖрд░рдЯреАрдУрдПрд╕ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдХрд░реНрдиреЗрд▓ / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдкреГрдердХреНрдХрд░рдг рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:
  1. libmcapi / рд╢рд╛рдорд┐рд▓ / arch / powerpc / atomic.h;
  2. libmcapi / shm / rtems / kmod /ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, OS рд▓реЗрдпрд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ RTEMS POSIX- рд╕рдВрдЧрдд рдХреЙрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдлрд╛рдЗрд▓реЗрдВ mcapi_os.c рдФрд░ mgc_mcapi_impl_os.h рдХреЗрд╡рд▓ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдХреЙрдкреА рдХреА рдЧрдИ рдереАрдВред

рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ shm_os.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдЬреЗрдирд░рд┐рдХ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рд▓реЗрд╡рд▓ (рдлрд╝рд╛рдЗрд▓ libmcapi / shm / shm.c) рд╕реЗ рдХреЙрд▓ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдФрд░ MSGR рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕рдЪреЗрдВрдЬ рддрдВрддреНрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп:

1) mcapi_status_t openmcapi_shm_notify (mcapi_uint32_t unit_id, mcapi_uint32_t рдиреЛрдб_id) - рдлрд╝рдВрдХреНрд╢рди рджреВрд░рд╕реНрде рдХреЛрд░ (рдУрдВ) рдХреЛ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рднреЗрдЬрддрд╛ рд╣реИ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЖрд░реЗрдЦ (рдЪрд┐рддреНрд░ 3 рджреЗрдЦреЗрдВ) рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдиреАрдЪреЗ рд╣реИ:



 /* send notify remote core */ mcapi_status_t openmcapi_shm_notify(mcapi_uint32_t unit_id, mcapi_uint32_t node_id) { mcapi_status_t mcapi_status = MCAPI_SUCCESS; int rc; rc = shm_rtems_notify(unit_id); if (rc) { mcapi_status = MGC_MCAPI_ERR_NOT_CONNECTED; } return mcapi_status; } static inline int shm_rtems_notify(const mcomm_core_t target_core) { struct mcomm_qoriq_data *const data = &mcomm_qoriq_data; /* If the target is the local core, call the interrupt handler directly. */ if (target_core == mcomm_qoriq_cpuid()) { _mcomm_interrupt_handler(NO_IRQ, data); } else { mcomm_qoriq_notify(target_core); } return 0; } /* Wake up the process(es) corresponding to the mailbox(es) which just received * packets. */ static int _mcomm_interrupt_handler(rtems_vector_number irq, struct mcomm_qoriq_data *data) { register int i; void *mbox = data->mbox_mapped; for (i = 0; i < data->nr_mboxes; i++) { int active; switch (data->mbox_size) { case 1: active = readb(mbox); break; case 4: active = readl(mbox); break; default: active = 0; } if (active) { LOG_DEBUG("%s: waking mbox %d\n", __func__, i); (void) rtems_event_send( data->rid, MMCAPI_RX_PENDING_EVENT ); } mbox += data->mbox_stride; } if (irq != NO_IRQ) { mcomm_qoriq_ack(); } return 0; } 


2) mcapi_uint32_t openmcapi_shm_schedunitid (рд╢реВрдиреНрдп) - рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдХрд░реНрдиреЗрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдЕрд░реНрдерд╛рдд, рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд░реНрдиреЗрд▓ ) рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдкрдврд╝рдХрд░ tialially рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдиреАрдЪреЗ рд╣реИ:

 /* Get current cpu id */ mcapi_uint32_t openmcapi_shm_schedunitid(void) { return (mcapi_uint32_t) ppc_processor_id(); } 


3) mcapi_status_t openmcapi_shm_os_init (рд╢реВрдиреНрдп) - рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕реНрдЯреНрд░реАрдо рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ rtems_task_create рдФрд░ rtems_task_start рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдиреАрдЪреЗ рд╣реИ:

 /* Now that SM_Mgmt_Blk has been initialized, we can start the RX thread. */ mcapi_status_t openmcapi_shm_os_init(void) { struct mcomm_qoriq_data *const data = &mcomm_qoriq_data; rtems_id id; rtems_status_code sc; if( RTEMS_SELF != data->rid ) { return MCAPI_ERR_GENERAL; } sc = rtems_task_create( rtems_build_name( 'S', 'M', 'C', 'A' ), MMCAPI_RX_TASK_PRIORITY, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &id); if( RTEMS_SUCCESSFUL != sc ) { return MCAPI_ERR_GENERAL; } /* global save task id */ data->rid = id; sc = rtems_task_start( id, mcapi_receive_thread, 0 ); if( RTEMS_SUCCESSFUL != sc ) { perror( "rtems_task_start\n" ); return MCAPI_ERR_GENERAL; }; return MCAPI_SUCCESS; } static rtems_task mcapi_receive_thread(rtems_task_argument argument) { int rc; do { rc = shm_rtems_wait_notify(MCAPI_Node_ID); if (rc < 0) { perror("shm_rtems_wait_notify"); break; } MCAPI_Lock_RX_Queue(); /* Process the incoming data. */ shm_poll(); MCAPI_Unlock_RX_Queue(0); } while (1); printk("%s exiting!\n", __func__); } static inline int shm_rtems_wait_notify(const mcapi_uint32_t unitId) { rtems_event_set event_out; int ret = 0; while(1) { LOG_DEBUG("mcomm_mbox_pending start\n"); (void) rtems_event_receive( MMCAPI_RX_PENDING_EVENT, RTEMS_DEFAULT_OPTIONS, RTEMS_NO_TIMEOUT, &event_out ); LOG_DEBUG("rtems_event_receive\n"); ret = mcomm_mbox_pending(&mcomm_qoriq_data, (mcomm_mbox_t)unitId); LOG_DEBUG("mcomm_mbox_pending end ret=%d\n", ret); if(ret != 0) { return ret; }; } return 0; } 


4) mcapi_status_t openmcapi_shm_os_finalize (рд╢реВрдиреНрдп) - рдлрд╝рдВрдХреНрд╢рди rtems_task_delete рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░реАрдо рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдиреАрдЪреЗ рд╣реИ:

 /* Finalize the SM driver OS specific layer. */ mcapi_status_t openmcapi_shm_os_finalize(void) { struct mcomm_qoriq_data *const data = &mcomm_qoriq_data; rtems_id id = data->rid; rtems_status_code sc; sc = rtems_task_delete(id); if( RTEMS_SUCCESSFUL != sc ) { return MCAPI_ERR_GENERAL; } return MCAPI_SUCCESS; } 


5) void * openmcapi_shm_map (рд╢реВрдиреНрдп) - MSGRs рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп, рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рддреИрдпрд╛рд░ рдХрд░рдирд╛ред рд╕реНрд░реЛрдд рдХреЛрдб рдиреАрдЪреЗ рд╣реИ:

 /* full open mcom device and get memory map addres*/ void *openmcapi_shm_map(void) { void *shm; int rc; size_t shm_bytes; // low level init // mcomm_qiroq_probe(); shm_bytes = shm_rtems_read_size(); if (shm_bytes <= 0) { perror("read shared memory size\n"); return NULL; } /* initialized device. */ rc = shm_rtems_init_device(); if (rc < 0) { perror("couldn't initialize device\n"); goto out; } shm = shm_rtems_read_addr(); if (shm == NULL) { perror("mmap shared memory"); goto out; } return shm; out: return NULL; } static size_t shm_rtems_read_size(void) { struct mcomm_qoriq_data *const data = &mcomm_qoriq_data; return (size_t) (data->mem.end - data->mem.start); } static inline int shm_rtems_init_device(void) { struct _shm_drv_mgmt_struct_ *mgmt = NULL; /* xmmm */ return mcomm_dev_initialize(&mcomm_qoriq_data, (uint32_t)&mgmt->shm_queues[0].count, CONFIG_SHM_NR_NODES, sizeof(mgmt->shm_queues[0].count), ((void *)&mgmt->shm_queues[1].count - (void *)&mgmt->shm_queues[0].count)); } static void *shm_rtems_read_addr(void) { struct mcomm_qoriq_data *const data = &mcomm_qoriq_data; return (void*)data->mem.start; } 


6. void openmcapi_shm_unmap (void * shm) - рдлрд╝рдВрдХреНрд╢рди MSGRs рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрдВрдж рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░рджреНрдж рдХрд░рддрд╛ рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдиреАрдЪреЗ рд╣реИ:

 /* full close mcom device and revert memory */ void openmcapi_shm_unmap(void *shm) { /* deinitialized device. */ shm_rtems_deinit_device(); // low level deinit // mcomm_qoriq_remove(); } static inline int shm_rtems_deinit_device(void) { return mcomm_dev_finalize(&mcomm_qoriq_data); } 

рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдирд┐рдореНрди-рд╕реНрддрд░ рдкреНрд░рд╛рдкреНрдд рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ mcapi_receive_thread (рдКрдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рджреЗрдЦреЗрдВ)ред рдЬрдм рдХреЛрдИ рдереНрд░реЗрдб рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, rtems_event_receive рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ, рдЗрд╕реЗ рдЗрд╡реЗрдВрдЯ рд╕реНрдЯреИрдВрдбрдмрд╛рдп рдореЛрдб (RTEMS рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдЗрд╡реЗрдВрдЯ рддрдВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд) рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░, рдЬрдм рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯ рдЗрд╡реЗрдВрдЯ рдЖрддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЗрдВрдЯрд░рдкреНрдЯ_рд╣реИрдВрдбрд▓рд░ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЪрд┐рддреНрд░ 3 рджреЗрдЦреЗрдВ, "HW-Receive" рдЖрд░реЗрдЦ), рдкрд░рд┐рд╡рд░реНрддрди рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ (рдУрдкрдирдореЗрдХреНрдкреА рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди - shm_oll) () рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд░реЛрдз рдХреЗ рд╕рд╛рдеред рдереНрд░реЗрдб рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯрддрд╛ рд╣реИред

рдУрдкрдирдПрдорд╕реАрдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдирдХреНрд╕ рдФрд░ рдЖрд░рдЯреАрдИрдПрдордПрд╕ рдХреА рдмрд╛рддрдЪреАрдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВред рдкрд░реАрдХреНрд╖рдг рдмреЗрдВрдЪ рдПрдХ рд╕реНрдерд╛рдкрд┐рдд P1020 рдкреНрд░реЛрд╕реЗрд╕рд░ (2 рдХреЛрд░) рдХреЗ рд╕рд╛рде рдлреНрд░реАрд╕реНрдХреЗрд▓ P1020RDB-PB рд╕реЗ рдбрд┐рдмрдЧ рдмреЛрд░реНрдб рд╣реИред рдЖрд╡реГрддреНрддрд┐: рдХреЛрд░ рдЖрд╡реГрддреНрддрд┐ - 800 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ, DDR2 - 400 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ, CCB - 400 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬред рдЧреБрдард▓реА рдкрд░ 0/1, рд▓рд┐рдирдХреНрд╕ / RTEMS рдХреНрд░рдорд╢рдГ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдереЗред рдПрдХреНрд╕рдЪреЗрдВрдЬ рджреЛ-рддрд░рдлрд╝рд╛ рдерд╛, 10,000 рджреЛ-рддрд░рдлрд╝рд╛ рдкрд╛рд░реНрд╕рд▓ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рд╕рдордп рдХреЛ рдорд╛рдкрд╛ред рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдкрд┐рдд рд╣реИрдВ:

рд╕рдВрдЦреНрдпрд╛
рдЯреЗрд╕реНрдЯ рд╡рд┐рд╡рд░рдг
рдПрдХ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рд╕рдордп, рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб
1
512 рдмрд╛рдЗрдЯ рд╕рдордорд┐рдд рдкреИрдХреЗрдЯ
37.5
2
рд╕рдордорд┐рдд рдкреИрдХреЗрдЯ 52430 рдмрд╛рдЗрдЯ рдХрд╛ рдЖрдХрд╛рд░
121
3
100 kB рд╕рдордорд┐рдд рдкреИрдХреЗрдЯ
346
4
1k / 100k-linux / rtems рдЕрд╕рдордорд┐рдд рдкреИрдХреЗрдЬ
185

рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╕реЗ, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдУрдкрдирдПрдорд╕реАрдПрдкреАрдЖрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдорд╕реАрдПрдкреАрдЖрдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЧреНрдп рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕реНрд░реЛрдд рдХреЛрдб рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддреА рд╣реИ; рдкреЛрд░реНрдЯрд┐рдВрдЧ (рдкрд╛рд╡рд░рдкреАрд╕реА рдФрд░ рдЖрд░реНрдо рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо) рдХреЗ рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг; рдПрдХ рдореБрдлреНрдд рд▓рд╛рдЗрд╕реЗрдВрд╕ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рджрд░реНрд╢рдиред

[!] рдкреНрд░рд╢реНрди рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдЙрдиреНрд╣реЗрдВ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рд░реБрд╕реНрд▓рд╛рди рдлрд┐рд▓реАрдкреЛрд╡рд┐рдЪ , рдкреНрд░реЛрдорд╡рдб рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХреНрд╕ рдбрд┐рдЬрд╛рдЗрди рд╕реЗрдВрдЯрд░ рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

Source: https://habr.com/ru/post/In186806/


All Articles