mp_config.c

マルチプロセッササポートモジュール ソースファイル(Nios2用) [詳細]

#include "fdmp_kernel.h"
#include "check.h"
#include "task.h"
#include <nios2.h>

mp_config.cのインクルード依存関係図

ソースコードを見る。

マクロ定義

#define MAGIC_START   0x87654321
 同期用のマジックナンバー

関数

BOOL proc_init[NO_PROC] __attribute__ ((section(".shared"), nocommon))
 起動時同期用変数
void mp_initialize (void)
 同期用のデータ初期化(マスタプロセッサのみ実行)
void mp_init_sync (void)
 マスタプロセッサによる初期化を待つ(マスタプロセッサ以外が実行)
void mp_start (void)
 全てのプロセッサのEXCCBの初期化待ち
BOOL local_acquire_lock (LOCKOBJ *lockobj)
 (他プロセッサ上のローカル資源の)ロックの取得
 asm (".globl my_local_acquire_lock")
 自プロセッサ上のローカル資源のロックも同じルーチンを使用.
 asm ("my_local_acquire_lock = local_acquire_lock")
void local_release_lock (LOCKOBJ *lockobj)
 (他プロセッサ上のローカル資源の)ロックの解放
 asm (".globl my_local_release_lock")
 自プロセッサ上のローカル資源の開放も同じルーチン


説明

マルチプロセッササポートモジュール ソースファイル(Nios2用)

mp_config.c で定義されています。


マクロ定義

#define MAGIC_START   0x87654321
 

同期用のマジックナンバー

mp_config.c50 行で定義されています。

参照元 mp_init_sync().


関数

volatile INT exccb_available __attribute__ (section(".shared"), nocommon)   ) 
 

起動時同期用変数

asm ".globl my_local_release_lock"   ) 
 

自プロセッサ上のローカル資源の開放も同じルーチン

asm  ) 
 

asm ".globl my_local_acquire_lock"   ) 
 

自プロセッサ上のローカル資源のロックも同じルーチンを使用.

BOOL local_acquire_lock LOCKOBJ lockobj  ) 
 

(他プロセッサ上のローカル資源の)ロックの取得

mp_config.c148 行で定義されています。

参照先 current_ipending()FALSElock_object::lock_ptrmutex_try_lock()TRUE.

00149 {
00150     do {
00151         if (mutex_try_lock((unsigned int)(lockobj->lock_ptr), PRCID) != 0){
00152             return (FALSE);
00153         }
00154     } while (current_ipending() == 0);
00155     
00156     return (TRUE);
00157 }

関数の呼び出しグラフ:

void local_release_lock LOCKOBJ lockobj  ) 
 

(他プロセッサ上のローカル資源の)ロックの解放

mp_config.c169 行で定義されています。

参照先 lock_object::lock_ptrmutex_unlock().

00170 {
00171     mutex_unlock((unsigned int)(lockobj->lock_ptr), PRCID);
00172 }

関数の呼び出しグラフ:

void mp_init_sync void   ) 
 

マスタプロセッサによる初期化を待つ(マスタプロセッサ以外が実行)

mp_config.c93 行で定義されています。

参照先 MAGIC_START.

00094 {
00095     INT i;
00096     INT cnt = 0;
00097 
00098     if (!((exccb_available == 0) || (exccb_available == MAGIC_START))) {
00099         exccb_available = 0;
00100     }
00101 
00102     while (1) {
00103         for (i = 0; i < 300; i++);
00104         cnt++;
00105         if (exccb_available == MAGIC_START) {
00106             break;
00107         }
00108     }
00109     
00110     syslog(LOG_NOTICE,"receive %x(cnt=%d)",exccb_available, cnt);
00111 }

void mp_initialize void   ) 
 

同期用のデータ初期化(マスタプロセッサのみ実行)

mp_config.c77 行で定義されています。

参照先 FALSE.

00078 {
00079     INT i;
00080 
00081     sys_start = 0;
00082     exccb_available = 0;
00083     for (i = 1; i <= NO_PROC; i++) {
00084         proc_init[i-1] = FALSE;
00085     }
00086     exccb_available = MAGIC_START;
00087 }

void mp_start void   ) 
 

全てのプロセッサのEXCCBの初期化待ち

mp_config.c117 行で定義されています。

参照先 MASTER_PROCTRUE.

00118 {
00119     INT i, j, flag;
00120 
00121     proc_init[PRCID - 1] = TRUE;
00122 
00123     if (MASTER_PROC()) {
00124         do {
00125             flag = 0;
00126             for (i = 1; i <= NO_PROC; i++) {
00127                 if (proc_init[i-1] == TRUE) {
00128                     flag++;
00129                 }
00130             }
00131             for (j =0; j < 100; j++);
00132         } while (flag < NO_PROC);
00133         sys_start = MAGIC_START;
00134         exccb_available = 0;
00135     }
00136     else {
00137         while (sys_start != MAGIC_START) {
00138             for (j = 0; j < 100; j++);
00139         }
00140     }
00141 }


Copyright © 2006 by TAKAGI Nobuhisa.
このページは Mon Apr 3 23:49:16 2006 に Doxygen によって生成されました。