排他制御と優先度逆転、ISR設計の基本まとめ
※当記事はChatGPTを使用し、私の備忘録としての残しているものです。

■ はじめに
組込みやRTOS環境でよく出てくる「排他制御」と「優先度逆転」、さらに「割り込み(ISR)の扱い」について、実務目線で整理してみました。
■ 一言でいうと
- 排他制御:順番待ちの仕組み
- 優先度制御:誰を先に動かすか
- ISR設計:投げて終わる
実務ではこの3つをセットで考えると、かなり安定した設計になります。
■ 前提条件
- タスクA(高優先度)
- タスクB(中優先度)
- モジュールC(共有リソース)
処理内容
- B → C に書き込み中
- その途中で A → C に書き込み要求
■ 排他制御の基本
共有リソースCに対しては、以下のように排他制御を行います。
- Cにロック(セマフォ / ミューテックス)を持たせる
- 書き込み時にロック取得
- 終了時に解放
ポイント:
「誰が使うか」ではなく「どこを守るか」
■ タスクの動き
- BがCをロックして処理中
- Aが割り込みで実行される
- AがCのロック取得に失敗 → 待ち状態へ
このとき:
- 実行可能なタスクの中で最も優先度が高いものが実行される
→ この場合はBが再開される
■ 優先度逆転とは
優先度逆転は以下のような状況で発生します。
- 低優先度タスクがロックを保持
- 高優先度タスクがロック待ち
- 中優先度タスクがCPUを占有
結果:
高優先度タスクが間接的に低優先度にブロックされる
■ 対策:優先度継承
ミューテックスなどで使われる仕組みです。
- ロック保持中のタスクの優先度を一時的に引き上げる
- 高優先度タスクと同じ優先度で実行させる
効果:
- ロック解放が早くなる
- 待ち時間が最小化される
■ 割り込み(ISR)の設計方針
基本方針はこれです:
ISRでは処理しない、タスクに投げる
■ 推奨パターン
ISR側
- データ取得
- キュー or フラグ通知
- 即終了
タスク側
- 通知を受けて処理実行
- 必要なら排他制御を行う
■ イメージ
- 割り込み発生
↓ - ISR:通知だけ(最小処理)
↓ - タスク:本処理(Cにアクセス)
■ なぜISRで処理しないのか
- 最優先で動くため処理が長いと全体に影響
- ロック待ちができない(デッドロックの原因)
- デバッグが難しくなる
■ 注意点
- ISRとタスクで同じデータを扱う場合は排他が必要
- 割り込み禁止区間は最小限にする
- 可能ならタスク側に処理を寄せる
■ まとめ
- 排他制御は「共有リソース」に対して行う
- スケジューラは「優先度+実行可能状態」で判断する
- 優先度逆転には優先度継承で対応する
- ISRは最小限、処理はタスクで行う
コピー中にWindowsキー+矢印キー操作でバグ?

何がおきたの?
「コピーが長いなー」でコピーのウインドウをショートカット使って移動させたら、
通常操作では「削除不可のウインドウ」が生成されました。

発生した環境
OS:Windows 11 Pro
バージョン:24H2
OSビルド:26100.4351
発生手順
- ファイルをコピーする。(コピー時間が比較的長い容量の多いファイルのコピーがやりやすい)
- コピー中に「Windowsキー+左キー」や「Windowsキー+右キー」を押す。(Windowsキーは押したまま)
- 転送が終わった後、「左キー」や「右キー」を押す。(Windowsキーは押したまま)
- 100%完了のウインドウが生成される。

※「×」や「タスクマネージャーからのプロセス削除」でも消えない。
削除方法
1.タスクマネージャーから「エクスプローラー」→「右クリック」→「再起動」

※上記で消せますが素直にWindowの再起動がいいかも知れません。。。
一言
コピー中にWindowsキー押したままにする人いないと思いますが、、、、
もし、同じようなことが起きて困ってる人がいれば、
少しでも力になればと思いました。
あと、ウインドウが時間が立つと消えるようなものや、
このショートカットが使えるOSなら起きる可能性ありですね。
(調べてないのでわかりませんが...。)
前回もそうでしたけど、Windowキー関連のバグ多くないですか?w
生成AI(Grok)を使ってPythonで顔認証ソフトを作成(途中)

Grokを使ってPythonで顔認証ソフトを作成
生成AIを使ってプログラム作成に慣れるために探してたら、
Xのプレミア機能と一緒に使えるGrokを選びました。
数年前に顔認証ソフトを作ってた時よりずっと早く実装できるようになったけど、
テキストで指示を出すと意図しない回答が返ってくることがあるので精度を上げる方法を模索中です。。。
Pythonの勉強にもなるから、今後も定期的に使っていこうと思います。
※以降は、実際に生成AIで記事作ってもらった内容です。
Grokによるプログラミング補助
私は最近、GrokというAIを利用してプログラミングをしています。
GrokはxAIによって開発されたAIで、自然言語での質問に対してとても役立つ回答を提供してくれます。
これにより、複雑なプログラムの設計やデバッグが飛躍的に効率化されています。
- Grokの特徴:
- 直感的な回答
- 技術的な質問に対応
- 創造的な問題解決
Pythonで顔認証ソフトの作成
Pythonを使用して顔認証ソフトウェアを開発することに挑戦しています。
Pythonはそのシンプルさと、豊富なライブラリの存在からこのようなプロジェクトに最適です。
使用するライブラリとツール
基本的な手順
1.環境設定:
# 必要なライブラリのインストール
pip install opencv-python dlib face_recognition
2.画像の読み込み:
import cv2 import face_recognition # 画像を読み込む image = face_recognition.load_image_file("your_image.jpg")
3.顔の検出:
# 顔の位置を取得
face_locations = face_recognition.face_locations(image)
4.顔の認識:
# 顔のエンコーディングを取得
face_encodings = face_recognition.face_encodings(image, face_locations)
5.比較と認証:
# 別の画像と比較 known_image = face_recognition.load_image_file("known_image.jpg") known_face_encoding = face_recognition.face_encodings(known_image)[0] # 比較結果を確認 results = face_recognition.compare_faces([known_face_encoding], face_encodings[0])
このように、Grokの助けを借りながらPythonで顔認証システムを構築しています。
Grokが提供する情報は、このプロジェクトの技術的な側面を理解するのに大変役立っています。
Slackでワンクリック絵文字が表示されない件
何が起きたの?!
Slackを開いたらこんな感じで絵文字が表示されない状態となっておりました。

Slackの更新、Slackの再起動、PCの再起動、Slackを再インストールなど
試してましたが変化なし。
直せるの?
はい、設定で直せます。
最後に
Slackの更新があったのでそれによる影響かもしれませんが、
何やっても元通りにならなかったので少しでも役立てて頂ければと思います。
仮想メモリの重要性
今回は、仮想メモリの重要性について記事を残しておこうと思います。

結論
物理メモリを使い切って動作が不安定になり
ブルースクリーンやエクスプローラーが固まるなどの症状が頻発してました。
原因としては、SSDの空き容量が2%ぐらいしかなく、
仮想メモリが十分に取れない状態になっておりました。
そのため、仮想メモリが不足し全て物理メモリだよりになったことにより
上記のようなことが発生したようです。
発生環境
Window10 メモリ:16GB SSD:512GB
- VSCODE
- IDE(統合開発環境)
- サポート系ツール(外部通信用など)
- Slack
- Typora
- メーラー
- ブラウザ
- エクスプローラー
- Excel
- PowerPoint
- ウイルスセキュリティ
IDEでソースのビルドを行いつつ、
図形の多いPowerPointを開いていると
よくエクスプローラーが固まりますね・・・。
一応、SSDの容量を開けて仮想メモリを再設定することで
最近は現象が起きてないので仮想メモリってすげーって思ってます(笑)
XP時代に仮想メモリは遅くなるから0にするべきだ!って
考えが頭の片隅に合ったので16GBあってスペック上がってるなら
Win10でも問題ないだろと判断したのがそもそもの間違いでした。。。
むしろスペックが上がってるから多少遅くても、
体感的にはあんまり変わらないんですよね。
Google Chart のグラフが表示されない件

今回は、GoogleChartを使用したグラフが突如表示されなくなった為、
その原因調査と対策について記載していこうと思います。
結論
GoogleChartsのロードと、ロード後のコールバック関数の呼び方が違っていた。
原因箇所
他のサイトなどを参考に2018年頃に作成したものです。
■ロード部分
<script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> google.load('visualization', '1', { packages : ['corechart']}); </script>
■ロード後のコールバック部分
<script type="text/javascript"> google.setOnLoadCallback(XXXXXX(1)); </script>
対策内容
公式のページ見ると以下の内容が記載されており、今回問題となったソースとの差異が見受けられました。
なので、この内容に合わせて修正を行う。

修正内容
■ロード部分
[修正前]
<script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> google.load('visualization', '1', { packages : ['corechart']}); </script>
↓
[修正後]
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <script type="text/javascript"> google.charts.load('current', {packages: ['corechart']}); </script>
※「current」は、リリース版。「upcoming」は、次期リリース版らしいです。
■ロード後のコールバック部分
[修正前]
<script type="text/javascript"> google.setOnLoadCallback(XXXXXX(1)); </script>
↓
[修正後]
<script type="text/javascript"> google.charts.setOnLoadCallback(XXXXXX); </script>
※コールバック関数の引数を記載するのも駄目みたいなので取っ払いました。
実施
グラフが表示されるようなりました!
※都合上ここには貼ることはできませんが。。。
最後に
海外勢の、「リリースノートに書いてたZE!!!」があったからこそたどり着けました。
マジ感謝っす!
さて、日本語のサイトが少なかったので少しでもお役に立てればと思います。
プログラミング言語を学ぶ!

今回は、新しい言語を学ぶためのサイトをご紹介します。
Progate
少し前に実際にやっていたのが「Progate」というサービスです。
多種な言語を勉強することができます。
更に、プログラムを作りながら勉強することができます!
どうしたらいいかわからない箇所に関しては、ヒント機能もついており
詰まることなく進めることが可能です。
1点気をつけたほうがいいのが、何度もやらないと身につかないなって思いました。
というのも、与えられたものをただこなすだけなので。。。
途中で自分で問題を作るか、考えてやらないとなかなか覚えれません。
prog-8.com



