LoginSignup
3
2

More than 1 year has passed since last update.

FreeRTOSとiTRONの比較(システムコール)

Last updated at Posted at 2021-08-28

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のキューのためのものです。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2