iTRONの関数や引数がだいたいどれに対応するか。
タスク
iTRON | FreeRTOS |
---|---|
cre_tsk(tskid, &ctsk) | × |
tskid = acre_tsk(&ctsk) ctsk = { tskatr, exinf, task, itskpri, stksz, stk, name } |
xTaskCreate(task, name, stksz, exinf, itskpri, &tskid) |
dly_tsk(dlytim) | vTaskDelay(dlytim) |
slp_tsk() | vTaskSuspend(NULL) |
sus_tsk(tskid) | vTaskSuspend(tskid) |
rsm_tsk(tskid) | × |
frsm_tsk(tskid) | vTaskResume(tskid) |
rel_wai(tskid) | xTaskAbortDelay(tskid) |
FreeRTOSでは、タスクの識別子はIDでなくポインタ(正確にはTCBのポインタ)です。したがって、対応するのはID自動割り当てのacre_tskになります。FreeRTOSのタスクには休止状態(Dormant)はないので、tskatr = TA_ACTと同じ動作になります。
iTRONのslp_tskは自タスクを待ち状態(Waiting)にします。FreeRTOSではvTaskSuspend(NULL)がだいたい対応しますが、こちらは待ち状態(Blocked)ではなく強制待ち状態(Suspended)になります。
rsm_tskはネスト回数コールしないと待ち解除しないもので、frsm_tskは一回で待ち解除します。FreeRTOSにはrsm_tskに対応するものはありません。
イベントフラグ(Task Notification)
iTRON | FreeRTOS |
---|---|
set_flg(flgid, setptn) | xTaskNotifyIndexed(xTaskToNotify, flgid, setptn, eSetBits) |
iset_flg(flgid, setptn) | xTaskNotifyIndexedFromISR(xTaskToNotify, flgid, setptn, eSetBits) |
wai_flg(flgid, waiptn, wfmode, p_flgptn) | xTaskNotifyWaitIndexed(flgid, 0, ULONG_MAX, p_flgptn, portMAX_DELAY) |
pol_flg(flgid, waiptn, wfmode, p_flgptn) | xTaskNotifyWaitIndexed(flgid, 0, ULONG_MAX, p_flgptn, 0) |
twai_flg(flgid, waiptn, wfmode, p_flgptn, tmout) | xTaskNotifyWaitIndexed(flgid, 0, ULONG_MAX, p_flgptn, tmout) |
clr_flg(flgid, clrptn) | ulTaskNotifyValueClearIndexed(xTask, flgid, ~clrptn) |
FreeRTOSのxTaskNotifyWaitIndexedは特定のビットだけ待ったり、ORやANDを指定することはできません。
待ち解除時にビットをクリアしないようにするには、ULONG_MAXを0にします。clr_flgはclrptnの中の0のビットがクリアされますが、FreeRTOSでは1のビットがクリアされます。
イベントフラグ(Event Group)
iTRON | FreeRTOS |
---|---|
cre_flg(&cflg) cflg = { flgatr, iflgptn } |
xEventGroupCreate() |
set_flg(flgid, setptn) | xEventGroupSetBits(flgid, setptn) |
iset_flg(flgid, setptn) | xEventGroupSetBitsFromISR(flgid, setptn, pxHigherPriorityTaskWoken) |
wai_flg(flgid, waiptn, wfmode, p_flgptn) | xEventGroupWaitBits(flgid, waiptn, pdTRUE, portMAX_DELAY) |
pol_flg(flgid, waiptn, wfmode, p_flgptn) | xEventGroupWaitBits(flgid, waiptn, pdTRUE, 0) |
twai_flg(flgid, waiptn, wfmode, p_flgptn, tmout) | xEventGroupWaitBits(flgid, waiptn, pdTRUE, tmout) |
clr_flg(flgid, clrptn) | xEventGroupClearBits(flgid, ~clrptn) |
iTRONでは、待ち解除するときにビットをクリアするかを、生成時に指定します(flgatr = TA_CLR)。FreeRTOSでは、ウエイト時に指定します(xClearOnExit = pdTRUE)。TA_CLRを除けば、FreeRTOSのEvent Groupは、flgatr = TA_TPRI | TA_WMUL, iflgptn = 0と同じ動作になります。
待ち解除時にビットをクリアしないようにするには、pdTRUEをpdFALSEにします。Task Notificationと同様、クリアのビットパターンはiTRONとFreeRTOSで逆になります。
セマフォ(Task Notification)
iTRON | FreeRTOS |
---|---|
sig_sem(semid) | xTaskNotifyGiveIndexed(xTaskToNotify, semid) |
isig_sem(semid) | xTaskNotifyGiveIndexedFromISR(xTaskToNotify, semid) |
wai_sem(semid) | ulTaskNotifyTakeIndexed(semid, pdTRUE, portMAX_DELAY) |
pol_sem(semid) | ulTaskNotifyTakeIndexed(semid, pdTRUE, 0) |
twai_sem(semid, tmout) | ulTaskNotifyTakeIndexed(semid, pdTRUE, tmout) |
上記はバイナリセマフォです。カウンティングセマフォにするには、TaskNotifyTakeのpdTRUEをpdFALSEにします。
セマフォ(Semaphore)
iTRON | FreeRTOS |
---|---|
acre_sem(&csem) csem = { sematr, isemcnt, maxsem } |
xSemaphoreCreateBinary() xSemaphoreCreateCounting(maxsem , isemcnt) |
sig_sem(semid) | xSemaphoreGive(semid) |
isig_sem(semid) | xSemaphoreGiveFromISR(semid) |
FreeRTOSのSemaphoreは、sematr = TA_TPRIと同じ動作になります。
ミューテックス
iTRON | FreeRTOS |
---|---|
acre_mtx(&cmtx) cmtx = { mtxatr, ceilpri } |
xSemaphoreCreateMutex() |
unl_mtx(mtxid) | xSemaphoreGive(mtxid) |
loc_mtx(mtxid) | xSemaphoreTake(mtxid, portMAX_DELAY) |
ploc_mtx(mtxid) | xSemaphoreGive(mtxid, 0) |
tloc_mtx(mtxid) | xSemaphoreGive(mtxid, tmout) |
FreeRTOSのミューテックスは、mtxatr = TA_TPRI | TA_INHERITと同じ動作になります。
キュー
iTRON | FreeRTOS |
---|---|
acre_dtq(&cdtq) cdtq = { dtqatr, dtqcnt, dtq } |
xQueueCreate(dtqcnt, sizeof(VP_INT)) |
snd_dtq(dtqid, data) | xQueueSend(dtqid, data, portMAX_DELAY) |
psnd_dtq(dtqid, data) | xQueueSend(dtqid, data, 0) |
tsnd_dtq(dtqid, data, tmout) | xQueueSend(dtqid, data, tmout) |
ipsnd_dtq(dtqid, data) | xQueueSendFromISR(dtqid, data, NULL) |
fsnd_dtq(dtqid, data) | xQueueOverwrite(dtqid, data) |
iTRONのデータキューは1ワード(VP_INT)のデータを格納します。FreeRTOSのキューは、dtqatr = TA_TPRIと同じ動作になります。
snd_dtqはキューに空きがなければ待ちになりますが、fsnd_dtqはキューに空きがなくても追加します(古いものは押し出される)。iTRONでは特に制限はありませんが、FreeRTOSのxQueueOverwriteは要素数(uxQueueLength)が1のキューのためのものです。