Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

優先度継承付きセマフォ獲得中タスクに対する優先度変更 #2

Open
1 of 12 tasks
takeharukato opened this issue Nov 29, 2021 · 0 comments
Open
1 of 12 tasks

Comments

@takeharukato
Copy link
Owner

takeharukato commented Nov 29, 2021

障害内容を記載
簡略化した優先度制御規則においてもタスクの現在優先度を高くする方向の変更はす
べて行うべきところを、現在優先度を高くする場合もタスクがロックしているミューテックスがない時(または,なくなった時)にのみに実施している。

再現手順
 ソースコード上で確認。

開発実行環境:

  • ターゲット種別
    • 8080/Z80
    • Arm
    • H8
    • IA32
    • MicroBlaze
    • mips
    • MN1030
    • RISC-V
    • SH-2
    • V850
    • windows
    • アーキ共通部
  • ターゲットCPU名: 依存せず
  • ターゲットボード名: 依存せず
  • 開発環境: gcc, binutilsなどのバージョンを記載 [例: gcc-8.4.0, binutils-2.24]
    • コンパイラ: gcc-11.2.0
    • アセンブラ・リンカ: binutils-2.37
    • その他: newlib-4.1.0
  • HOSのVersion : 88f4a9b

補足事項
μITRON4.0仕様では以下のように定義されている。

μITRON4.0仕様では,上述の厳密な優先度制御規則に加えて,現在優先度を変
更する状況を限定した優先度制御規則(これを簡略化した優先度制御規則と呼
ぶ)を規定し,どちらを採用するかは実装定義とする.具体的には,簡略化し
た優先度制御規則においては,タスクの現在優先度を高くする方向の変更はす
べて行うのに対して,現在優先度を低くする方向の変更は,タスクがロックし
ているミューテックスがない時(または,なくなった時)にのみ行う(この場
合には,タスクの現在優先度をベース優先度に一致させる).より具体的には,
次の状況でのみ現在優先度を変更する処理を行えばよい.

• タスクがロックしているTA_INHERIT属性のミューテックスを,そのタスクよりも高い現在優先度を持つタスクが待ち始めた時
• タスクがロックしているTA_INHERIT 属性のミューテックスを待っているタスクが,前者のタスクよりも高い現在優先度に変更された時
• タスクが,そのタスクの現在優先度よりも高い上限優先度を持つTA_CEILING属性のミューテックスをロックした時
• タスクがロックしているミューテックスがなくなった時
• chg_priによりタスクのベース優先度を変更した場合で,そのタスクがロックしているミューテックスがないか,変更後のベース優先度が現在優先度よりも高い時

ミューテックスの操作に伴ってタスクの現在優先度を変更した場合には,次の処理を行う.優先度を変更されたタスクが実行できる状態である場合,タスクの優先順位を,変更後の優先度にしたがって変化させる.変更後の優先度と同じ優先度を持つタスクの間での優先順位は,実装依存である..優先度が変更されたタスクが何らかのタスク優先度順の待ち行列につながれている場合にも,その待ち行列の中での順序を,変更後の優先度にしたがって変化させる.

chg_priでも「 タスクがロックしているTA_INHERIT 属性のミューテックスを待っているタスクが,前者のタスクよりも高い現在優先度に変更された時」の対処は必要だがやっていないのが問題。

chg_priにより現在優先度を変更する場合に以下の処理が必要

  1. chg_priの対象となるタスクがTA_INHERIT 属性のミューテックスを待ち合わせていない場合は何もしない
  2. 「 調査対象タスク」(変数)をchg_priの対象となるタスクに設定
  3. 「調査対象タスク」(変数)が待ち合わせているミューテックスを「調査対象ミューテックス」(変数)に設定
  4. 「調査対象ミューテックス」の所有者タスクを「推移的継承タスク」(変数)に設定
  5. 「推移的継承タスク」(変数)の現在優先度が「調査対象タスク」の優先度以上ならば, 推移的継承が完了しているので抜ける
  6. 「推移的継承タスク」(変数)の現在優先度を「調査対象タスク」(変数)の優先度に設定する
  7. 3.に戻る
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant