キーワードから探す

※スペースで区切って複数検索が可能です。

カテゴリで絞り込む

ID:543
作成日: 2025/09/10

サーマルシャットダウンとは何ですか?またサーマルシャットダウンが発生した場合、どのようにすればよいですか?

カテゴリ SDK-AcapLib2   
対象製品 APX-36124 APX-3666 APX-36121 APX-36124-DFラベル図.png

サーマルシャットダウンとは、FPGA の温度上昇によるデバイス破損を防止するための保護機能です。
サーマルシャットダウンに対応しているボードは、FPGA の内部温度が規定値に達した場合、コールバック関数でユーザーに通知を行い、さらなる温度上昇と破壊防止のため FPGA の一部機能を停止します。

そのため、コールバック関数でサーマルシャットダウンの通知が発生した場合は、以下の手順で対応してください。

1. PCをシャットダウンします。
2. 基板を十分に冷やします。(エアフローや周囲温度低減など対策を行って下さい)
3. PCを起動します。


また、コールバック関数で温度以上を検知する場合のサンプルプログラムは以下となります。


◆ サンプルプログラム(温度異常イベントのコールバック登録例)

	// エラー情報出力例
	void ErrMsg(const char *ErrorMsg, int Line)
	{
		ACAPERRORINFOEX ErrInfoEx = { 0 };

		// 第一引数は予約なので0
		AcapGetLastErrorCodeEx(0, &ErrInfoEx, FALSE);

		printf("[Line:%d] %s\n", Line, ErrorMsg);
		printf(" nChannel = %d\n", ErrInfoEx.nChannel);
		printf(" dwCommonErrorCode = 0x%x\n", ErrInfoEx.dwCommonErrorCode);
		printf(" dwBoardErrorCode = 0x%x\n", ErrInfoEx.dwBoardErrorCode);
		printf(" dwExtendErrorCode = 0x%x\n", ErrInfoEx.dwExtendErrorCode);
		printf(" dwAckCode = 0x%x\n", ErrInfoEx.dwAckCode);
		printf(" nBaseErrorCode = 0x%x\n", ErrInfoEx.nBaseErrorCode);
		printf(" nGCErrorCode = 0x%x\n", ErrInfoEx.nGCErrorCode);

		if (ErrInfoEx.pErrMsg != NULL)
		{
			printf(" Msg: %s\n", ErrInfoEx.pErrMsg);
		}
	}

	// 温度異常用コールバック関数例
	void ThermalCallback(int nChannel, DWORD dwEvent, int nFrameNo, int nMemoryNo, void* pParam)
	{
		HANDLE hAcap = (HANDLE)pParam;
		int val = 0;

		// 割り込み要因(アラームステータス)の取得
		if (AcapGetInfo(hAcap, nChannel, ACL_ALARM_STATUS, 1, &val) == 0)
		{
			ErrMsg("Failed to get ACL_ALARM_STATUS.", __LINE__);
			return;
		}

		printf("ThermalCallback!! Ch %d AlarmStatus = 0x%x\n", nChannel, val);
	}

	// コールバック登録例
	int main(void)
	{
		HANDLE hAcap = INVALID_HANDLE_VALUE;
		int ch = 1;
		ACAPBOARDINFOEX bi = { 0 };

		// ボード情報の取得
		if (AcapGetBoardInfoEx(&bi) != ACL_RTN_OK)
		{
			// サーマルシャットダウン中のボードが存在する場合、
			// BoardErrorCodeにACL_3300_THERMAL_SHUTDOWN_ERRORが発生します。
			// サーマルシャットダウン発生基板を特定するにはWindowsイベントログを参照してください。
			ErrMsg("Failed to AcapGetBoardInfoEx.", __LINE__);
			return -1;
		}

		if (bi.nBoardNum == 0)
		{
			printf("Found no boards.\n");
			return -1;
		}

		// ボードインデックス0の基板をOpen(必要に応じて選択ロジックを実装)
		hAcap = AcapOpen(bi.BOARDINDEX[0].pBoardName,
			bi.BOARDINDEX[0].nBoardID,
			ch);

		if (hAcap == INVALID_HANDLE_VALUE || hAcap == NULL)
		{
			// サーマルシャットダウン中のボードが存在する場合、
			// BoardErrorCodeにACL_3300_THERMAL_SHUTDOWN_ERROR(0x**54)が設定されます。
			// サーマルシャットダウン発生基板を特定するにはWindowsイベントログを参照してください。
			ErrMsg("Failed to open Acap.", __LINE__);
			return -1;
		}

		// コールバック登録
		// デバイスハンドルhAcapをpParamに渡すことで、
		// ThermalCallback 内から AcapGetInfo が使用できます。
		if (AcapRegistCallbackEx(hAcap,
			ch,
			ACL_INT_DEVICE_ALM,
			ThermalCallback,
			hAcap) == 0)
		{
			ErrMsg("Failed to AcapRegistCallbackEx.", __LINE__);
			return -1;
		}

		printf("Waiting Thermal events... \n");
		while (1)
		{
			Sleep(1000);
		}

		// 到達しない例だが、終了処理の参考として
		// AcapClose(hAcap);

		return 0;
	}

※サーマルシャットダウンの通知が発生した場合、復旧にはPCのシャットダウンが必要となるため、AcapRegistCallback関数やAcapSetEvent関数を用いて再度コールバック関数やイベントの再登録を行うことはできません。このとき、ボードエラーコードで0x**25が、拡張エラーコードで0xFFFFFC17(-1001)が発生します。


◆ Windowsイベントログについて


コールバック関数でサーマルシャットダウンの通知が発生した場合、ドライバがWindows イベントログを出力します。
この出力内容を確認することでサーマルシャットダウンが発生した基板のBoardID、SerialNo を確認することができます。


1. スタートメニュー右側の検索ボックスに「イベントビューアー」と入力します。

検索窓

2. 検索結果にイベントビューアーが表示されるので起動します。

イベントビューアー
3. Windowsログを開き、システムを選択すると、イベントが表示されます。エラーを選択すると、サーマルシャットダウンが発生した基板のBoardID、SerialNoが確認できます。

サーマルシャットダウン
この内容は参考になりましたか?
ご回答いただきまして、ありがとうございます。
今後の参考にさせていただきます。
ご意見・ご感想、ありがとうございます。

関連するご質問

Now Loading...

Now Loading...