1313// 名前 関数 設定項目 イベント箇所
1414// IdleHook ApplicationIdleHook() CONFIG_USE_IDLE_HOOK IdleTask実行時
1515// TickHook ApplicationTickHook() CONFIG_USE_TICK_HOOK システム時間インクリメント時
16- // MallocFailedHook ApplicationMallocFailedHook() CONFIG_USE_MALLOC_FAILED_HOOK メモリ確保失敗時
16+ // MallocFailedHook ApplicationMallocFailedHook() CONFIG_USE_MALLOC_FAILED_HOOK PortMalloc()関数によるメモリ確保失敗時. malloc()関数ではない.
1717// StackOverflowHook ApplicationStackOverflowHook() CONFIG_CHECK_FOR_STACK_OVERFLOW スタックオバーフロー検知時
1818/
1919// 設定:
6161// Arduino.h
6262// main.cpp
6363// wiring.c
64+ // WString.h
65+ // new.cpp
66+ //
6467//
6568// ハードウェア依存ファイル一覧:
6669// Port.c
@@ -746,7 +749,7 @@ TaskLoop(taskA)
746749 TaskDelete(name); \
747750 }
748751
749- //
752+ /*
750753// クリティカルセクションに入ることを宣言します.
751754// あるタスクがクリティカルセクションに入っている間は,
752755// ほかのタスクは実行されなくなります.
@@ -757,9 +760,30 @@ TaskLoop(taskA)
757760// クリティカルセクション中では, Kernelの割り込みも停止されており,
758761// システム時間も更新されません. また, ほかタスクの処理も行われなくなります.
759762//
763+ // Example usage:
764+
765+ // タスク宣言
766+ DeclareTaskLoop(taskA);
767+
768+ // TaskCode宣言
769+ TaskLoop(taskA)
770+ {
771+ // ...
772+
773+ // クリティカルセクションに入る
774+ EnterCritical();
775+ {
776+ // ここのブロック内では, OSによる割り込みは行われない.
777+ // ...
778+
779+ // クリティカルセクションから出る.
780+ ExitCritical();
781+ }
782+ }
783+ */
760784#define EnterCritical () PortEnterCritical()
761785
762- //
786+ /*
763787// クリティカルセクションに出ることを宣言します.
764788// あるタスクがクリティカルセクションに入っている間は,
765789// ほかのタスクは実行されなくなります.
@@ -770,6 +794,27 @@ TaskLoop(taskA)
770794// クリティカルセクション中では, Kernelの割り込みも停止されており,
771795// システム時間も更新されません. また, ほかタスクの処理も行われなくなります.
772796//
797+ // Example usage:
798+
799+ // タスク宣言
800+ DeclareTaskLoop(taskA);
801+
802+ // TaskCode宣言
803+ TaskLoop(taskA)
804+ {
805+ // ...
806+
807+ // クリティカルセクションに入る
808+ EnterCritical();
809+ {
810+ // ここのブロック内では, OSによる割り込みは行われない.
811+ // ...
812+
813+ // クリティカルセクションから出る.
814+ ExitCritical();
815+ }
816+ }
817+ */
773818#define ExitCritical () PortExitCritical()
774819
775820//
@@ -778,21 +823,195 @@ TaskLoop(taskA)
778823// @param ms:
779824// 待機時間(ms)
780825//
781- #define DelayWithBlocked (ms ) TaskDelay((ms) / PORT_TICK_RATE_MS)
826+ #define DelayWithBlocked (ms ) TaskDelay((ms) / PORT_TICK_RATE_MS)
827+
828+ #define GetTickCount () TaskGetTickCount()
829+
830+ /*
831+ //
832+ // @param previousWakeTime:
833+ // タスクが待機状態から解放されたときの時間変数のポインタ.
834+ // 使用前に必ず現在時刻(tick)で初期化する必要があります. GetTickCount()を使用してください.
835+ // のちのこの値は, 自動でDelayUntilWithBlocked()で更新されます.
836+ //
837+ // @param frequency:
838+ // サイクル周期(ms).
839+ // タスクが次に待機状態を抜ける時間は, previousWakeTime(tick) + frequency(ms) / PORT_TICK_RATE_MS(ms / tick) です.
840+ //
841+ // Example usage :
842+
843+ TaskLoop(taskA)
844+ {
845+ unsigned long lastWakeTime;
846+
847+ // 1000msごとの周期
848+ const unsigned long frequency = 1000;
849+
850+ // lastWakeTime変数を現在時刻で初期化
851+ lastwakeTime = GetTickCount();
852+ for (;;)
853+ {
854+ // 次のサイクルまで待機
855+ DelayUntilWithBlocked(&lastWakeTime, frequency);
856+
857+ // 何かルーチン処理
858+ // ...
859+ }
860+ }
861+ */
862+ #define DelayUntilWithBlocked (previousWakeTime , frequency ) \
863+ TaskDelayUntil((previousWakeTime), (frequency) / PORT_TICK_RATE_MS)
782864// ------------------------------------------------------
783865
784866// --- Semaphore, Mutex 関係 -------------------------------------------
785867//
786868//
869+
870+
871+ /*
872+ // バイナリセマフォを作成します.
873+ // このタイプのセマフォは, 純粋なタスク間の同期に用いられます.
874+ // 動機が必要な例として, 複数のタスクが一つのリソースにアクセスするときなどが挙げられるでしょう.
875+ // あるタスクが, セマフォを獲得している際, 他のタスクはこのセマフォを獲得できません.
876+ // 獲得しているタスクがセマフォを開放したとき, 他のタスクはこのセマフォを獲得できます.
877+ //
878+ // @param semahore:
879+ // 作成されたセマフォへのハンドル
880+ //
881+ // Example usage :
882+
883+ SemaphoreHandle semaphore;
884+
885+ TaskLoop(taskA)
886+ {
887+ // セマフォはCreateBinarySemaphore()を呼ぶまで使用できません.
888+ CreateBinarySemaphore(semaphore);
889+
890+ if (semaphore != NULL)
891+ {
892+ // セマフォの作成に成功したとき.
893+ // ...
894+ }
895+ }
896+ */
787897#define CreateBinarySemaphore (semaphore ) \
788898 SemaphoreCreateBinary(semaphore)
789899
900+ /*
901+ // ミューテックスを作成します.
902+ // このタイプのセマフォは, バイナリセマフォとほとんど同じですが,
903+ // 優先度継承を行う点が異なります.
904+ // 優先度継承とは, セマフォ獲得による優先度の逆転の問題を解決します.
905+ //
906+ // @param semahore:
907+ // 作成されたセマフォへのハンドル
908+ //
909+ // Example usage :
910+
911+ SemaphoreHandle semaphore;
912+
913+ TaskLoop(taskA)
914+ {
915+ // セマフォはCreateMutex()を呼ぶまで使用できません.
916+ CreateMutex(semaphore);
917+
918+ if (semaphore != NULL)
919+ {
920+ // セマフォの作成に成功したとき.
921+ // ...
922+ }
923+ }
924+ */
790925#define CreateMutex (semaphore ) \
791926 (semaphore) = SemaphoreCreateMutex()
792927
928+ /*
929+ // セマフォを獲得します.
930+ // そのセマフォは必ずCreate関数であらかじめ作成する必要があります.
931+ //
932+ // @param semaphore:
933+ // 作成したセマフォ
934+ //
935+ // @param blockTime:
936+ // 獲得するまでの最大待機時間(ms)
937+ // この時間を超えても, セマフォを獲得できない場合,
938+ // 獲得処理を停止します.
939+ //
940+ // Example usage:
941+
942+
943+ SemaphoreHandle semaphore;
944+
945+ TaskLoop(taskA)
946+ {
947+ // セマフォはCreateBinarySemaphore()を呼ぶまで使用できません.
948+ CreateBinarySemaphore(semaphore);
949+
950+ if (semaphore != NULL)
951+ {
952+ // セマフォの作成に成功したとき.
953+ // ...
954+
955+ // セマフォを獲得するのに, 100ms待機する
956+ if(Acuire(semaphore, 100)){
957+ // 獲得できた時
958+
959+ // ...
960+
961+ // 共有しているリソースへの処理を終えたとき,
962+ // セマフォの開放
963+ Relese(semaphore);
964+ else{
965+ // 獲得できなかったとき
966+ // 共有しているリソースへのアクセス権が得られなかった.
967+ }
968+ }
969+ }
970+
971+ */
793972#define Acquire (semaphore , blockTime ) \
794973 (SemahoreTake((semaphore), ((PortTickType)(blockTime)) / PORT_TICK_RATE_MS) == PD_TRUE)
795974
975+
976+ /*
977+ // セマフォを解放します.
978+ // そのセマフォは必ずCreate関数であらかじめ作成する必要があります.
979+ //
980+ // @param semaphore:
981+ // 作成したセマフォ
982+ //
983+ // Example usage:
984+
985+
986+ SemaphoreHandle semaphore;
987+
988+ TaskLoop(taskA)
989+ {
990+ // セマフォはCreateBinarySemaphore()を呼ぶまで使用できません.
991+ CreateBinarySemaphore(semaphore);
992+
993+ if (semaphore != NULL)
994+ {
995+ // セマフォの作成に成功したとき.
996+ // ...
997+
998+ // セマフォを獲得するのに, 100ms待機する
999+ if(Acuire(semaphore, 100)){
1000+ // 獲得できた時
1001+
1002+ // ...
1003+
1004+ // 共有しているリソースへの処理を終えたとき,
1005+ // セマフォの開放
1006+ Relese(semaphore);
1007+ else{
1008+ // 獲得できなかったとき
1009+ // 共有しているリソースへのアクセス権が得られなかった.
1010+ }
1011+ }
1012+ }
1013+
1014+ */
7961015#define Release (semaphore ) \
7971016 (SemaphoreGive((semaphore)) == PD_TRUE)
7981017
0 commit comments