/      English

始動関数 main(), WarmMain()

始動関数 main(), WarmMain()
ファームウェアの始動関数について記述しています。

始動関数 main(), WarmMain()

本ドキュメントではTWELITE GOLDでのファームウェアの始動関数およびコールバック関数について記述しています。

main(), WarmMain()

TWELITE GOLDではファームウェアはmain()関数から開始します。また、スリープの復帰はWarmMain()から行われます。これら関数はweak指定されているためユーザーが独自に定義することも可能です。

__attribute__((weak)) int main(void);
__attribute((weak)) void WarmMain(void);

int main(void) {
    ToCoNet_vInit_Cold_Pre();
	ToCoNet_vBoard_Init(FALSE);
	ToCoNet_vInit_Cold(0, 0);
	ToCoNet_vMain(NULL);
}

void WarmMain(void)
{
    vAHI_OnWakeup_MW(FALSE);
    ToCoNet_vInit_Warm_Pre();
	ToCoNet_vBoard_Init(TRUE);
	ToCoNet_vInit_Warm(0);
	ToCoNet_vMain(NULL);
}
// source/twenet_main.c

コールドブート(電源投入・リセット)時の呼び出しフロー

main()
  ToCoNet_vInit_Cold_Pre()    <= メモリ初期化
                                 TWENET C:cbAppColdStart(FALSE), MWX:init_cold()の呼び出し

  ToCoNet_vBoard_Init(FALSE)
    vAHI_RegEvMgr_MW()        <= mwfライブラリの初期化
    BOARD_InitBootPins()
      BOARD_InitPins()        <= この関数で各ピンの初期化
    BOARD_BootClockRUN()      <= クロックの初期化
    vAHI_FRWTStart_MW()       <= FRWT(WTIMER)の開始
    G_TWENET_CHIPSENSOR_AUTO_ON_BOOT()
                              <= オンチップの温度センサーの取得準備
    GPIO_PortInit()           <= GPIO の初期化
    checkIrqPending()         <= 割り込み状態のクリア
    AES_Init()                <= AES 暗号化の初期化
    __enable_irq()            <= 割り込み開始

  ToCoNet_vInit_Cold()        <= TWENET の初期化
                                 TWENET C:cbAppColdStart(TRUE), MWX:setup()の呼び出し

  ToCoNet_vMain()             <= TWENET メインループ

ウォームブート(RAM保持スリープ復帰)時の呼び出しフロー

WarmMain()
  vAHI_OnWakeup_MW(FALSE)     <= 復帰直後のペリフェラル処理

  ToCoNet_vInit_Warm_Pre()    <= TWENET C:cbAppWarmStart(FALSE), MWX:init_warm() の呼び出し

  ToCoNet_vBoard_Init(TRUE)
    BOARD_BootClockRUN()      <= クロックの初期化
    vAHI_FRWTSetBootCount_MW() <= FRWT(WTIMER)の起床時カウント保存
    G_TWENET_CHIPSENSOR_AUTO_ON_BOOT()
                              <= オンチップの温度センサーの取得準備
    GPIO_PortInit()           <= GPIO の初期化
    vAHI_OnWakeup_MW()        <= 起床時の処理
    checkIrqPending()         <= 割り込み状態のクリア
    AES_Init()                <= AES 暗号化の初期化
    __enable_irq();           <= 割り込み開始

  ToCoNet_vInit_Warm()        <= TWENET の初期化
                                 TWENET C:cbAppWarmStart(TRUE), MWX:wakeup()の呼び出し

  ToCoNet_vMain()             <= TWENET メインループ

RAM OFF スリープ起床時の呼び出しフロー

main()
  vAHI_OnWakeupRamOff_MW(FALSE) <= ペリフェラル処理(DIO状態の確認)

  ToCoNet_vInit_Cold_Pre()    <= メモリ初期化
                                 TWENET C:cbAppColdStart(FALSE), MWX:init_cold()の呼び出し

  ToCoNet_vBoard_Init(FALSE)
    vAHI_RegEvMgr_MW()        <= mwfライブラリの初期化
    BOARD_BootClockRUN()      <= クロックの初期化
    vAHI_FRWTStart_MW()       <= FRWT(WTIMER)の開始
    G_TWENET_CHIPSENSOR_AUTO_ON_BOOT()
                              <= オンチップの温度センサーの取得準備
    GPIO_PortInit()           <= GPIO の初期化
	vAHI_OnWakeupRamOff_MW(TRUE) <= ペリフェラル処理 (GPIO RETENTIONのリリース)
    checkIrqPending()         <= 割り込み状態のクリア
    AES_Init()                <= AES 暗号化の初期化
    __enable_irq()            <= 割り込み開始

  ToCoNet_vInit_Cold()        <= TWENET の初期化
                                 TWENET C:cbAppColdStart(TRUE), MWX:setup()の呼び出し

  ToCoNet_vMain()             <= TWENET メインループ

ToCoNet_vBoard_Init(bool_t)

__attribute__((weak)) void ToCoNet_vBoard_Init(bool_t bWarm);
// source/twenet_main.c

この関数では、始動時のハードウェアの初期化を行います。weak指定されているためユーザ独自の初期化手続きを記述できます。詳細はソースコードtwenet_main.cを参照してください。

これら一連の初期化については MCUXpresso でのプロジェクトウィザードが出力するプロジェクトに対して必要な修正を行っています。関数の構造などについては SDK 資料などを参考にコードを読み下して下さい。

独自のハードウェア初期化を行う場合もこの部分を書き換えることになりますが、動作に対してセンシティブな部分ですので、慎重な修正と十分な検証が求められます。

ToCoNet_vInitCold(uint32)

void ToCoNet_vInit_Cold(uint32 flag, uint32 u32SysHz)

TWENETの初期化手続きを行います。

パラメータ内容
flag起動時指定です。通常は0を指定してください。
u32SysHzSysTickタイマーの周波数を指定します。通常は0を指定します。
必要に応じて1000の倍数で指定します。

ToCoNet_vInit_Warm()

void ToCoNet_vInit_Warm(uint32 flag)

スリープ復帰時のTWENET初期化手続きを行います。

パラメータ内容
flag起動時指定です。通常は0を指定してください。

ToCoNet_vMain()

void ToCoNet_vMain(PR_TOCONET_MAIN_HOOK fp_hook)

TWENETのメインループです。

checkIrqPending()

static bool_t checkIrqPending();

uint64_t g_twenet_irq_bm_on_boot;
WEAK bool_t __twenet_irq_handler_pending_on_boot(int32_t);

スリープ中または起床後本関数が呼び出されるまでに発生した割り込み情報を保存及びクリアする関数です。

  • g_twenet_irq_bm_on_bootの各ビットは、割り込み源 (IRQ_Type) に対応します(1uul << IRQ_Type)
  • 割り込みの種別はJN5189.hに定義されるtypedef enum IRQnを参照します。
  • 割り込みのクリアは、NVIC_ClearPendingIRQ() を呼び出します。
  • __twenet_irq_handler_pending_on_boot(int32_t IRQ_Type)関数をユーザが定義した場合、IRQ_Typeの割り込みが有効な場合、本関数が呼び出されます。本関数の戻り値を FALSEとした場合、NVIC_ClearPendingIRQ(IRQ_Type)を実行します。TRUEの場合は何もしません。

システムのタイマー周期について

SysTickタイマー周期は以下の方法で設定できます。

  • ToCoNet_vInitCold()関数で設定する。この設定が優先される。

  • G_TWENET_SYSTICK_HZ()cbAppColdStart(FALSE)中で設定する。

  • 上記2方法の設定を行わない場合はsToCoNet_AppContext.u16TickHzの値が採用される。

以下に留意してください。

  • TWENETの処理周期(sToCoNet_AppContext.u16TickHz)は最大1000Hz。
    • SysTickの周期はsToCoNet_AppContext.u16TickHzの整数倍。
  • 標準的な設定はSysTick=1000Hz, sToCoNet_AppContext.u16TickHz=1000Hz。
    • 準標準として SysTick=2000Hz または 4000Hz、sToCoNet_AppContext.u16TickHz=1000Hz。一部(UART)のバックグラウンド処理をTWENETの周期外で実施し、負荷の分散を図ります。またより速いSysTickタイマー割り込みを用いた処理を行う (参照 AppQAPI_SysTick_Hnd_Reg())。
    • 準標準として SysTick=250hz、sToCoNet_AppContext.u16TickHz=250Hz。無線パケットの1パケットあたりの時間が2-5ms程度(変調したときの伝送時間やパケット間の隙間時間)であるため。省電力やタイマーごとの処理が重い場合の設定です。
    • 準標準での各APIや当社製アプリケーションの動作確認は実施しません。必要な場合は十分な検証を行ってください。

初期化

G_TWENET_B_MAC_ALWAYS_RESET_ON_WAKE()

bool_t G_TWENET_B_MAC_ALWAYS_RESET_ON_WAKE()
  // マクロ定義

本変数を 1 に設定することでスリープ起床時に MAC 層を再初期化します。再初期化には余分に処理時間がかかります(約400usec@32MHz)。

  • 本オプションを設定しても、スリープ前の処理(MAC層の状態保存、約100usec@32MHz)はオプション非設定時と同様に実行されます。