Changes between Version 13 and Version 14 of spec/Os


Ignore:
Timestamp:
Nov 10, 2014, 2:52:28 PM (10 years ago)
Author:
fujisft-shigihara
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • spec/Os

    v13 v14  
    2626    * 基本セット + タイミング保護 + メモリ保護
    2727* すべてのSCをマルチコアに拡張可能である
     28* 用語一覧
     29  * C1ISR:カテゴリ1ISR
     30  * C2ISR:カテゴリ2ISR
     31  * OSAP:OSアプリケーション
     32
    2833* API一覧
    2934  * "--"はOSEKのため未規定
     
    241246StatusType ActivateTask(TaskType TaskID)
    242247}}}
     248* TaskIDで指定したタスクを起動する
    243249* 多重に起動要求を行った場合、要求した順序で起動される
    244250  * 拡張タスクが、多重起動要求できないのは、待ち状態に入ってしまうと次の起動要求を要求した順序で処理できないからと考えられる
     251  * TOPPERS/ATK2では、必要性が低いことから、要求した順序を保持しない実装としている
     252    * タスクの実行順序の優先順位は、本来タスク優先度で指定するものであり、同一優先度タスクが実行される順序が処理に依存するべきではない、という考え方である
    245253* 到着時間監視において、!ActivateTaskを発行した側と、発行された側のどちらのタイミング保護違反となるかは規定されていない
    246254  * マルチコアでは、どちらのコアでプロテクションフックを起動するか等の問題がある
     
    250258StatusType TerminateTask(void)
    251259}}}
     260* 呼び出したタスクを終了する
     261* 多重起動要求されているタスクが、!TerminateTaskを実行した場合、再度実行可能状態となるが、!TerminateTaskを呼ばずに終了(returnを呼ぶ等)した場合に、再度実行可能状態となるかは規定されていない
     262  * TOPPERS/ATK2では、以下のような実装としている
     263    * タスクが不正終了(returnを呼ぶ)した場合:多重起動は有効
     264    * タスクが強制終了(保護違反発生)した場合:多重起動は有効
     265    * 所属するOSAPが強制終了した場合:多重起動はリセット
    252266
    253267== !ChainTask ==
     
    255269StatusType ChainTask(TaskType TaskID)
    256270}}}
     271* 呼び出したタスクの終了と、TaskIDで指定したタスクの起動を行う(!TerminateTask+!ActivateTask)
    257272
    258273== Schedule ==
     
    260275StatusType Schedule(void)
    261276}}}
     277* 呼び出した時点での、すべての実行可能状態のタスクの優先度に従って、再スケジューリングを行う
     278  * つまり、呼び出し元タスクが、ノンプリエンプティブタスクでなければ、呼び出す意味がない
    262279
    263280== GetTaskID ==
     
    265282StatusType GetTaskID(TaskRefType TaskID)
    266283}}}
     284* 実行状態のタスクIDを取得する
     285  * 複数タスクから呼び出される共用関数や、C2ISR、各フックルーチンから使用される
    267286* 本APIは、エラーフックでのデバッグにおける使用が考えられるが、割込み禁止時のAPI呼出し違反[OS093]により起動したエラーフックでは、割込み禁止状態のため、GetTaskIDが使用できないという不整合がある
     287  * TOPPERS/ATK2では、実害がないため、割込み禁止状態であっても、GetTaskIDを呼び出せるように実装している
    268288
    269289== !GetTaskState ==
     
    271291StatusType GetTaskState(TaskType TaskID, TaskStateRefType State)
    272292}}}
     293* TaskIDで指定したタスクの状態を取得する
    273294* 本APIは、エラーフックでのデバッグにおける使用が考えられるが、割込み禁止時のAPI呼出し違反[OS093]により起動したエラーフックでは、割込み禁止状態のため、!GetTaskStateが使用できないという不整合がある
     295  * TOPPERS/ATK2では、実害がないため、割込み禁止状態であっても、!GetTaskStateを呼び出せるように実装している
    274296
    275297== !EnableAllInterrupts ==
     
    277299void EnableAllInterrupts(void)
    278300}}}
     301* C1ISR、C2ISRに対する割込みを許可状態にする
     302* EI命令のような高速な処理を想定している
    279303
    280304== !DisableAllInterrupts ==
     
    282306void DisableAllInterrupts(void)
    283307}}}
     308* C1ISR、C2ISRに対する割込みを禁止状態にする
     309* ネスト発行は不可で、DI命令のような高速な処理を想定している
    284310
    285311== !ResumeAllInterrupts ==
     
    287313void ResumeAllInterrupts(void)
    288314}}}
     315* C1ISR、C2ISRに対する割込みを許可状態にする
     316* !SuspendAllInterruptsが呼ばれた回数だけ、発行しないと許可状態にならない
    289317
    290318== !SuspendAllInterrupts ==
     
    292320void SuspendAllInterrupts(void)
    293321}}}
     322* C1ISR、C2ISRに対する割込みを禁止状態にする
    294323* ネストして発行できるが、ネスト上限回数に関する規定がない
     324  * TOPPERS/ATK2では、ネスト回数の上限値を255としている
    295325
    296326== ResumeOSInterrupts ==
     
    298328void ResumeOSInterrupts(void)
    299329}}}
     330* C2ISRに対する割込みを許可状態にする
     331* !SuspendOSInterruptsが呼ばれた回数だけ、発行しないと許可状態にならない
    300332
    301333== SuspendOSInterrupts ==
     
    303335void SuspendOSInterrupts(void)
    304336}}}
     337* C2ISRに対する割込みを禁止状態にする
    305338* ネストして発行できるが、ネスト上限回数に関する規定がない
     339  * TOPPERS/ATK2では、ネスト回数の上限値を255としている
    306340
    307341== !GetResource ==
     
    309343StatusType GetResource(ResourceType ResID)
    310344}}}
     345* ResIDで指定したリソースを獲得する
    311346
    312347== !ReleaseResource ==
     
    314349StatusType ReleaseResource(ResourceType ResID)
    315350}}}
     351* ResIDで指定したリソースを開放する
    316352* 上限優先度が初期優先度より低いリソースを開放しようとするとE_OS_ACCESSが返ると規定されているが、そもそもそのようなリソースを獲得できないので、E_OS_ACCESSが返ることはありえない
    317353
     
    320356StatusType SetEvent(TaskType TaskID, EventMaskType Mask)
    321357}}}
     358* TaskIDで指定したタスクに対するイベントMaskをセットする
    322359
    323360== !ClearEvent ==
     
    325362StatusType ClearEvent(EventMaskType Mask)
    326363}}}
     364* 呼び出したタスクのすべてのイベントをクリアする
    327365
    328366== !GetEvent ==
     
    330368StatusType GetEvent(TaskType TaskID, EventMaskRefType Event)
    331369}}}
     370* TaskIDで指定したタスクにセットされたイベントを取得する
     371* マルチコア拡張仕様において、!SetEventはコアを跨げるように拡張されているが、!GetEventが拡張されていない
     372  * 拡張できない理由が無いため、誤記と思われる
     373  * TOPPERS/ATK2では、!GetEventもコアを跨いで呼び出すことができるように実装している
    332374
    333375== !WaitEvent ==
     
    335377StatusType WaitEvent(EventMaskType Mask)
    336378}}}
     379* Maskで指定したイベントがセットされるのを待つ
     380* 既にイベントがセットされていた場合は、タスクは実行状態を継続する
    337381
    338382== !GetAlarmBase ==
     
    340384StatusType GetAlarmBase(AlarmType AlarmID, AlarmBaseRefType Info)
    341385}}}
     386* AlarmIDで指定したアラームの情報を取得する
     387* 取得する情報はコンフィギュレーション時に静的に設定したパラメータのみである
    342388
    343389== !GetAlarm ==
     
    345391StatusType GetAlarm(AlarmType AlarmID, TickRefType Tick)
    346392}}}
     393* AlarmIDで指定したアラームが、満了するまでのティックを取得する
    347394
    348395== !SetRelAlarm ==
     
    350397StatusType SetRelAlarm(AlarmType AlarmID, TickType increment, TickType cycle)
    351398}}}
     399* AlarmIDで指定したアラームを、相対時間指定でセットする
    352400* AUTOSAR仕様で、incrementで指定された値が0であった場合にE_OS_VALUEを返す標準エラーで返すと規定されている[OS304]が、OSEK仕様では、E_OS_VALUEは拡張エラーと規定されているという矛盾がある
     401  * TOPPERS/ATK2では、どちらのE_OS_VALUEも、拡張エラーとしている
    353402
    354403== !SetAbsAlarm ==
     
    356405StatusType SetAbsAlarm(AlarmType AlarmID, TickType start, TickType cycle)
    357406}}}
     407* AlarmIDで指定したアラームを、絶対時間指定でセットする
    358408
    359409== !CancelAlarm ==
     
    361411StatusType CancelAlarm(AlarmType AlarmID)
    362412}}}
     413* AlarmIDで指定したセット済みのアラームを、キャンセルする
    363414
    364415== !GetActiveApplicationMode ==
     
    366417AppModeType GetActiveApplicationMode(void)
    367418}}}
     419* OS起動時、StartOSで引数に指定されたアプリケーションモードを取得する
    368420
    369421== StartOS ==
     
    371423void StartOS(AppModeType Mode)
    372424}}}
     425* OSを起動する
     426* [wiki:spec_ECUStateManager ECU State Manager]から呼び出される
    373427
    374428== ShutdownOS ==
     
    376430void ShutdownOS(StatusType Error)
    377431}}}
     432* OSをシャットダウンする
    378433
    379434----
     
    385440ApplicationType GetApplicationID(void)
    386441}}}
     442* 実行状態のOSAP IDを取得する
    387443
    388444== GetISRID ==
     
    390446ISRType GetISRID(void)
    391447}}}
     448* 実行状態のISR IDを取得する
    392449* OSEK仕様のGetTaskIDは、返り値がStatusTypeであるのに対し、対称的なAPIであるGetISRIDの戻り値はISRTypeとなっている
    393450  * 結果として、エラーの発生有無は分からず、返り値がStatusTypeでないのでエラーフックも起動しない[OS093]
     451  * TOPPERS/ATK2では、返り値のデータ型に関わらず、異常発生時はエラーフックを起動するように実装している
    394452
    395453== !CallTrustedFunction ==
     
    397455StatusType CallTrustedFunction(TrustedFunctionIndexType FunctionIndex, TrustedFunctionParameterRefType FunctionParams)
    398456}}}
     457* !FunctionIndexで指定した信頼関数を実行する
    399458
    400459== CheckISRMemoryAccess ==
     
    402461AccessType CheckISRMemoryAccess(ISRType ISRID, MemoryStartAddressType Address, MemorySizeType Size)
    403462}}}
     463* ISRIDで指定したC2ISRの、AddressとSizeで指定したメモリ領域に対するアクセス可否を取得する
    404464* 引数で指定したメモリ領域が複数のメモリ保護属性の領域を跨いでいた場合の振る舞いが規定されていない
     465  * TOPPERS/ATK2では、アクセス不可能を返すように実装している
    405466
    406467== !CheckTaskMemoryAccess ==
     
    408469AccessType CheckTaskMemoryAccess(TaskType TaskID, MemoryStartAddressType Address, MemorySizeType Size)
    409470}}}
     471* TaskIDで指定したタスクの、AddressとSizeで指定したメモリ領域に対するアクセス可否を取得する
    410472* 引数で指定したメモリ領域が複数のメモリ保護属性の領域を跨いでいた場合の振る舞いが規定されていない
     473  * TOPPERS/ATK2では、アクセス不可能を返すように実装している
    411474
    412475== !CheckObjectAccess ==
     
    414477ObjectAccessType CheckObjectAccess(ApplicationType ApplID, ObjectTypeType ObjectType, void ...)
    415478}}}
     479* 可変長引数"..."で指定したオブジェクトの、ApplIDで指定されたOSAPに対するアクセス可否を取得する
    416480
    417481== !CheckObjectOwnership ==
     
    419483ApplicationType CheckObjectOwnership(ObjectTypeType ObjectType, void ...)
    420484}}}
     485* 可変長引数"..."で指定したオブジェクトが所属するOSAP IDを取得する
    421486
    422487== !StartScheduleTableRel ==
     
    424489StatusType StartScheduleTableRel(ScheduleTableType ScheduleTableID, TickType Offset)
    425490}}}
     491* ScheduleTableIDで指定したスケジュールテーブルを、相対時間指定でセットする
    426492
    427493== !StartScheduleTableAbs ==
     
    429495StatusType StartScheduleTableAbs(ScheduleTableType ScheduleTableID, TickType Start)
    430496}}}
     497* ScheduleTableIDで指定したスケジュールテーブルを、絶対時間指定でセットする
    431498
    432499== !StopScheduleTable ==
     
    434501StatusType StopScheduleTable(ScheduleTableType ScheduleTableID)
    435502}}}
     503* ScheduleTableIDで指定したセット済みのスケジュールテーブルを、停止する
    436504
    437505== !NextScheduleTable ==
     
    439507StatusType NextScheduleTable(ScheduleTableType ScheduleTableID_From, ScheduleTableType ScheduleTableID_To)
    440508}}}
     509* ScheduleTableID_Fromで指定したスケジュールテーブルの1周期が終了後、ScheduleTableID_Toで指定したスケジュールテーブルを開始する
    441510* ScheduleTableID_Fromに指定されたスケジュールテーブルが周期動作だった場合に、ScheduleTableID_Toのスケジュールテーブルに切り替わった後も周期動作を続けるかどうかが規定されていない
     511  * TOPPERS/ATK2では、ScheduleTableID_Fromに指定されたスケジュールテーブルが周期動作の場合も、切り替え時に停止するように実装している
     512* マルチコア拡張仕様において、!StartScheduleTableRelや!StartScheduleTableAbsはコアを跨げるように拡張されているが、!NextScheduleTableが拡張されていない
     513  * 拡張できない理由が無いため、誤記と思われる
     514  * TOPPERS/ATK2では、!NextScheduleTableもコアを跨いで呼び出すことができるように実装している
    442515
    443516== !StartScheduleTableSynchron ==
     
    445518StatusType StartScheduleTableSynchron(ScheduleTableType ScheduleTableID)
    446519}}}
     520* ScheduleTableIDで指定した明示同期スケジュールテーブルの同期を開始する
    447521
    448522== !SyncScheduleTable ==
     
    450524StatusType SyncScheduleTable(ScheduleTableType ScheduleTableID, TickType Value)
    451525}}}
     526* ScheduleTableIDで指定した明示同期スケジュールテーブルを、Valueで指定したティックで同期する
    452527
    453528== !SetScheduletableAsync ==
     
    455530StatusType SetScheduletableAsync(ScheduleTableType ScheduleTableID)
    456531}}}
     532* ScheduleTableIDで指定した明示同期スケジュールテーブルの同期を終了する
    457533
    458534== !GetScheduleTableStatus ==
     
    460536StatusType GetScheduleTableStatus(ScheduleTableType ScheduleTableID, ScheduleTableStatusRefType ScheduleStatus)
    461537}}}
     538* ScheduleTableIDで指定したスケジュールテーブルの状態を取得する
    462539
    463540== !IncrementCounter ==
     
    465542StatusType IncrementCounter(CounterType CounterID)
    466543}}}
     544* CounterIDで指定したソフトウェアカウンタをインクリメントする
    467545* 同時に複数のアラーム・スケジュールテーブルが満了する場合、各満了処理が終了するごとに、再スケジューリングを行うかどうかが規定されていない
     546  * TOPPERS/ATK2では、再スケジューリングを行う実装としている
    468547
    469548== !GetCounterValue ==
     
    471550StatusType GetCounterValue(CounterType CounterID, TickRefType Value)
    472551}}}
     552* CounterIDで指定したカウンタの現在ティックを取得する
    473553
    474554== !GetElapsedValue ==
     
    476556StatusType GetElapsedValue(CounterType CounterID, TickRefType Value, TickRefType ElapsedValue)
    477557}}}
     558* CounterIDで指定したカウンタが、Valueで指定したティックから、現在何ティック経過しているかを取得する
     559* 第2引数で、経過時間の基準とするティックを指定するが、同時に現在のティックによって上書きされるので注意が必要
    478560
    479561== !TerminateApplication ==
     
    481563StatusType TerminateApplication(ApplicationType Application, RestartType RestartOption)
    482564}}}
     565* Applicationで指定したOSAPを強制終了する
    483566
    484567== !AllowAccess ==
     
    486569StatusType AllowAccess(void)
    487570}}}
     571* 呼び出したタスクが所属するOSAPを利用可能状態にする
     572  * C2ISRからも呼び出し可能と規定されているが、ユースケースは不明
     573* 再起動状態のOSAPに所属するリスタートタスクから呼び出される
    488574
    489575== !GetApplicationState ==
     
    491577StatusType GetApplicationState(ApplicationType Application, ApplicationStateRefType Value)
    492578}}}
     579* Applicationで指定したOSAPの状態を取得する
    493580
    494581== !GetNumberOfActivatedCores ==
     
    496583uint32 GetNumberOfActivatedCores(void)
    497584}}}
     585* AUTOSAR OSが起動しているコアの数を取得する
    498586
    499587== GetCoreID ==
     
    501589CoreIdType GetCoreID(void)
    502590}}}
     591* 呼び出した処理が実行されているコアIDを取得する
    503592
    504593== !StartCore ==
     
    506595void StartCore(CoreIdType CoreID, StatusType* Status)
    507596}}}
     597* CoreIDで指定したコアを、AUTOSAR OS管理のコアとして起動する
     598  * OSは起動しない
    508599
    509600== !StartNonAutosarCore ==
     
    511602void StartNonAutosarCore(CoreIdType CoreID, StatusType* Status)
    512603}}}
     604* CoreIDで指定したコアを、AUTOSAR OS管理外のコアとして起動する
    513605
    514606== !GetSpinlock ==
     
    516608StatusType GetSpinlock(SpinlockIdType SpinlockId)
    517609}}}
     610* SpinlockIdで指定したスピンロックを獲得する
     611  * 取得できない場合、獲得できるまでスピンする
    518612
    519613== !ReleaseSpinlock ==
     
    521615StatusType ReleaseSpinlock(SpinlockIdType SpinlockId)
    522616}}}
     617* SpinlockIdで指定したスピンロックを開放する
     618* スピンロックとリソースの獲得、解放はLIFOで実行しなければならないと規定されている[OS702]が、スピンロックとリソースは独立したオブジェクトであり、独立してLIFOであれば問題ないため、本要求の意味は不明である
    523619
    524620== !TryToGetSpinlock ==
     
    526622StatusType TryToGetSpinlock(SpinlockIdType SpinlockId, TryToGetSpinlockType* Success)
    527623}}}
     624* SpinlockIdで指定したスピンロックを獲得する
     625  * 取得できない場合、エラー終了する
    528626
    529627== !ShutdownAllCores ==
     
    531629void ShutdownAllCores(StatusType Error)
    532630}}}
     631* OS実行中のすべてのコアでOSシャットダウンを行う
    533632* !ShutdownAllCoresを呼び出していないコアのシャットダウンフックに、何のエラーコードが渡されるかは規定されていない
     633  * TOPPERS/ATK2では、!ShutdownAllCoresを呼び出していないコアでは,シャットダウンフックにE_OS_SHUTDOWN_OTHER_COREが渡される実装としている
    534634
    535635== !IocSend ==
     
    537637Std_ReturnType IocSend_<IocId>[_<SenderId>](<Data> IN)
    538638}}}
     639* !IocIdに対して単一のデータを送信する(キューあり)
    539640
    540641== !IocWrite ==
     
    542643Std_ReturnType IocWrite_<IocId>[_<SenderId>](<Data> IN)
    543644}}}
     645* !IocIdに対して単一のデータを送信する(キューなし)
    544646
    545647== !IocSendGroup ==
     
    547649Std_ReturnType IocSendGroup_<IocId>(<Data1> IN1, <Data2> IN2, ...)
    548650}}}
     651* !IocIdに対して複数のデータを送信する(キューあり)
    549652
    550653== !IocWriteGroup ==
     
    552655Std_ReturnType IocWriteGroup_<IocId>(<Data1> IN1, <Data2> IN2, ...)
    553656}}}
     657* !IocIdに対して複数のデータを送信する(キューなし)
    554658
    555659== !IocReceive ==
     
    557661Std_ReturnType IocReceive_<IocId>(<Data> OUT)
    558662}}}
     663* !IocIdから単一のデータを受信する(キューあり)
    559664
    560665== !IocRead ==
     
    562667Std_ReturnType IocRead_<IocId>(<Data> OUT)
    563668}}}
     669* !IocIdから単一のデータを受信する(キューなし)
    564670
    565671== !IocReceiveGroup ==
     
    567673Std_ReturnType IocReceiveGroup_<IocId>(<Data1> OUT1, <Data2> OUT2, ...)
    568674}}}
     675* !IocIdから複数のデータを受信する(キューあり)
    569676
    570677== !IocReadGroup ==
     
    572679Std_ReturnType IocReadGroup_<IocId>(<Data1> OUT1, <Data2> OUT2, ...)
    573680}}}
     681* !IocIdから複数のデータを受信する(キューなし)
    574682
    575683== !IocEmptyQueue ==
     
    577685Std_ReturnType IocEmptyQueue_<IocId>(void)
    578686}}}
     687* !IocIdのキューを空にする
    579688
    580689----
     
    884993* 多重度:0..1
    885994* !OsDriverコンテナの節がないため、削除漏れと思われる
     995  * TOPPERS/ATK2では削除している
    886996
    887997== !OsGptChannelRef ==
     
    8921002* 多重度:0..1
    8931003* !OsDriverコンテナの節がないため、削除漏れと思われる
     1004  * TOPPERS/ATK2では削除している
    8941005
    8951006== !OsTimeConstant ==
     
    9011012* OSがこの値をどのように使用するか不明
    9021013  * !OsSecondsPerTickで同様の値を設定しているように思われる
     1014  * TOPPERS/ATK2では削除している
    9031015
    9041016== !OsTimeValue ==
     
    9101022* OSがこの値をどのように使用するか不明
    9111023  * !OsSecondsPerTickで同様の値を設定しているように思われる
     1024  * TOPPERS/ATK2では削除している
    9121025
    9131026== !OsEvent ==
     
    10171130* 複数のコアの中で、どのコアがマスタコアかを指定するコンテナが存在しない
    10181131  * ComなどのBSWはマスタコアでしか使用できないため、RTEジェネレータがマスタコア/スレーブコアの判別ができない問題がある
     1132  * TOPPERS/ATK2では、{{{/AUTOSAR/EcucDefs/Os/OsOS/OsMasterCoreId}}}を新設している
    10191133
    10201134== !OsScalabilityClass ==