Skip to content

Commit d43db52

Browse files
Add function. Add comment.
1 parent 9243478 commit d43db52

File tree

4 files changed

+235
-9
lines changed

4 files changed

+235
-9
lines changed

ArduinOS/hardware/avr/cores/arduino.ArduinOS/ArduinOS/ArduinOS.h

Lines changed: 223 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
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
// 設定:
@@ -61,6 +61,9 @@
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

ArduinOS/hardware/avr/cores/arduino.ArduinOS/ArduinOS/Malloc.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
/*
2-
2+
// ArduinOSと競合しないMalloc関数
3+
// 標準のmalloc関数は, 現在のスタックポインタ以下のメモリをヒープ領域として扱うが,
4+
// ArduinOSによってスタックポインタが大域変数領域へ移動するゆえ, 失敗する.
5+
//
6+
// この, Malloc関数は現在のスタックポインタ以下をヒープ領域として扱わず, メモリの最後
7+
// までをヒープ領域として扱うことで, エラーを防ぐ.
38
*/
49

510
/* Copyright (c) 2002, 2004, 2010 Joerg Wunsch
@@ -39,7 +44,7 @@
3944

4045

4146
#include <stdlib.h>
42-
#include "MallocOverride.h"
47+
#include "Malloc.h"
4348

4449
#include <inttypes.h>
4550
#include <string.h>
@@ -66,9 +71,11 @@ struct __freelist {
6671
*/
6772

6873

69-
74+
// マクロ定義されているSTACK_POINTER()を本来のスタックポインタ値から,
75+
// RAMの最終アドレスに変更する.
7076
//#define STACK_POINTER() ((char *)AVR_STACK_POINTER_REG)
7177
#define STACK_POINTER() ((char *)RAMEND)
78+
7279
extern char __heap_start;
7380
char *__brkval = &__heap_start; // first location not yet allocated
7481
struct __freelist *__flp; // freelist pointer (head of freelist)

ArduinOS/hardware/avr/cores/arduino.ArduinOS/ArduinOS/PortMacro.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ extern "C" {
144144
//
145145
#define PORT_STACK_GROWTH (-1)
146146

147-
// タイマー割り込み周期. 1tickあたりの時間(ms)
147+
// タイマー割り込み周期(ms / tick). 1tickあたりの時間(ms)
148148
// Memo:
149149
// この時点でCONFIG_TICK_RATE_HZが定義されていなくても,
150150
// アプリケーション側でPORT_TICK_RATE_MSを使用しない限り, エラーは出ない.

ArduinOS/hardware/avr/cores/arduino.ArduinOS/ArduinOS/Task.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ void OtherFunction(void)
418418
}
419419
}
420420
*/
421-
void TaskDelayUntil(PortTickType * const previouswakeTime, PortTickType timeIncrement);
421+
void TaskDelayUntil(PortTickType * const previousWakeTime, PortTickType timeIncrement);
422422

423423
/*
424424
//

0 commit comments

Comments
 (0)