**************************** タスク 【生成部】 xTaskCreate(vTaskG,"TaskG",100,NULL,1,&xHandleG); xTaskCreate(vTaskA,"TaskA",100,NULL,1,&xHandleA); // タスクA 優先度=1 (MAX=6) xTaskCreate(vTaskX,"TaskX",100,NULL,2,&xHandleX); // タスクX 優先度=2 (MAX=6) **************************** void vTaskG(void *pvParameters) // TaskG(優先度=1) { while(1) { gg_con_Check(); // console processing (returns immediately if nothing is done) GG_TP_OFF(100); // オシロのCH1をOFF vTaskDelay(1/portTICK_PERIOD_MS); } } void vTaskA(void *pvParameters) // TaskA(優先度=1) { while(1) { // イベント待ち(自動クリア) xEventGroupWaitBits(xCreatedEventGroup, 1, 1, 1, 1000/portTICK_PERIOD_MS); GG_TP_ON(903); // オシロのCH2をON dummy(500); // ダミー負荷(20usec弱) GG_TP_OFF(903); // オシロのCH2をOFF } } void vTaskX(void *pvParameters) // TaskX(優先度=2) { while(1) { GG_TP_ON(904); // dummy(500); GG_TP_OFF(904); vTaskSuspend(NULL); // 自タスク(TaskX)をサスペンド } } **************************** コンソールコマンド 【登録部】 GG_CON_CMDADD(C_t, "t", "", "ラウンドロビン実験 t イベントセットのみ" ); GG_CON_CMDADD(C_x, "x", "", "ラウンドロビン実験 x イベントセット+割禁で上位タスク瞬間レジューム" ); GG_CON_CMDADD(C_y, "y", "", "ラウンドロビン実験 y イベントセット+Yield発行" ); GG_CON_CMDADD(C_z, "z", "", "ラウンドロビン実験 z イベントセット+上位タスクレジューム" ); **************************** int C_t(int argc, char **argv) // tコマンド実行部 イベントセット { gg_printf("ラウンドロビン実験 t イベントセットのみ\n"); // イベントセット GG_TP_ON(100); // xEventGroupSetBits(xCreatedEventGroup, 1); // イベントフラグ(b0)をON GG_TP_OFF(100); // オシロCH1区切り GG_TP_ON(100); // return 0; } int C_x(int argc, char **argv) // xコマンド実行部 イベントセット+割禁で上位タスク瞬間レジューム { gg_printf("ラウンドロビン実験 x イベントセット+割禁で上位タスク瞬間レジューム\n"); // イベントセット GG_TP_ON(100); // xEventGroupSetBits(xCreatedEventGroup, 1); // イベントフラグ(b0)をON GG_TP_OFF(100); // オシロCH1区切り // 割込み禁止でTaskXをレジューム&サスペンド(状態を変えずにYield発行してみる) 2023.05.10 M.Kogan GG_DI_BEGIN(); // 割込み禁止 GG_TP_ON(100); // vTaskResume(xHandleX); // TaskXをレジューム vTaskSuspend(xHandleX); // TaskXを再サスペンド GG_TP_OFF(100); // オシロCH1区切り GG_DI_END(); // 割込み禁止解除 GG_TP_ON(100); // return 0; } int C_y(int argc, char **argv) // yコマンド実行部 イベントセット+Yield発行 { gg_printf("ラウンドロビン実験 y イベントセット+Yield発行\n"); // イベントセット GG_TP_ON(100); // xEventGroupSetBits(xCreatedEventGroup, 1); // イベントフラグ(b0)をON GG_TP_OFF(100); // オシロCH1区切り // Yield発行 GG_TP_ON(100); // vPortYield(); // Yield発行 GG_TP_OFF(100); // オシロCH1区切り GG_TP_ON(100); // return 0; } int C_z(int argc, char **argv) // xコマンド実行部 イベントセット+上位タスクレジューム { gg_printf("ラウンドロビン実験 z イベントセット+上位タスクレジューム\n"); // イベントセット GG_TP_ON(100); // xEventGroupSetBits(xCreatedEventGroup, 1); // イベントフラグ(b0)をON GG_TP_OFF(100); // オシロCH1区切り // TaskXをレジューム GG_TP_ON(100); // vTaskResume(xHandleX); // TaskXをレジューム GG_TP_OFF(100); // オシロCH1区切り GG_TP_ON(100); // return 0; }