Visual Studio CodeとPi5でC言語のLチカをステップ実行する

# 1 .はじめに
　Visual Studio Code (VSC)はフリーで使える軽量で便利なコードエディタです。豊富な拡張機能や直感的なデバッグ機能により、初心者からプロフェッショナルまで幅広く利用されています。本稿では、Raspberry Pi5にインストールして、VSCのデバック機能を使ってLチカのステップ実行を紹介します。
 
 #### 表. 使用したもの
 |項　目|内　容|
 |---|---|
 |ラズパイ|Raspberry Pi 5 4GB|
 |OS|Bookworm(64bit) Desktop release 2024-11-19|
 |VSC| ver.1.97|
 |GPIO制御ライブラリ|lgpio |
 |電子部品|LED、抵抗390Ω、ブレッドボード、ジャンパーワイヤ、etc|
 
# ２．Raspberry Pi5へのインストール方法
　2025年3月現在、VSCの最新バージョンは1.98ですが、公式フォーラムによるとRaspberry Pi5では動作が不安定との報告があります[1]。そのため、安定版の1.97をインストールすることをお勧めします。
①　以下のURLから1.97をダウンロードします。
https://update.code.visualstudio.com/1.97.2/linux-deb-arm64/stable

②　ターミナルで次のコマンドを実行してインストールします。※ファイル名の後ろの数字は変更になる場合があります。

    sudo dpkg -i code_1.97.2-1739406006_arm64.deb

【注意】VSC 1.97 をインストール後、 sudo apt update や sudo apt upgrade を実行すると、自動的にVSCが1.98にアップデートされる場合があります。そのため、自動更新を防ぐためには特定のパッケージを固定する方法があります。
・ Visual Studio Codeを固定する場合

    sudo apt-mark hold code
・固定を解除する場合

    sudo apt-mark unhold code

# ３．lgpio制御ライブラリのインストール
　Joan氏がフリーで公開しているラズパイ用GPIOライブラリをインストールします。 ダウンロードとインストール方法はGitHubリポジトリ内のREADMEセクションに下記のように記載されています[2]。
 
    wget https://github.com/joan2937/lg/archive/master.zip
    unzip master.zip
    cd lg-master
    make
    sudo make install


# ４．tasks.jsonとlaunch.json設定方法
　下図のようにソースコードを保存する作業フォルダ(任意名)とVSC用の設定フォルダ.vscode(固定名)を作業フォルダ内に作成します。ファイルマネージャのメニューバー「表示」の「隠しファイルを表示する」を有効にします。
　.vscodeフォルダ内に、プログラムのビルドやデバッグに必要な設定ファイル「tasks.json」と「launch.json」をテキストエディタで作成します。これにより、Visual Studio Codeの使用が効率的に管理されます。ここでは学習目的なので、一つの作業フォルダに複数のソースコードを作成するシンプルな構成しています。共通のtasks.jsonを利用するので、簡単にコンパイルが可能になります。

    /MyApp2（作業フォルダ）
      ├── 4-Led01.c
      ├── 4-Led02.c
      ├── その他の学習用Cソースコード
      ├── .vscode(設定フォルダ)
             ├── tasks.json    （ビルド設定ファイル）
             ├── launch.json　（デバック設定ファイル）

tasks.jsonはビルド設定ファイルです。
```tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build Excutable with lgpio",
            "type": "shell",
            "command": "gcc",
            "args": [
                "-Wall",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "${file}",
                "-llgpio",
                "-lpthread",
                "-g",
                "-O0"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "Compile Only with lgpio",
            "type": "shell",
            "command": "gcc",
            "args": [
                "-Wall",
                "-c",
                "${file}",
                "-llgpio",
                "-lpthread",
                "-g",
                "-O0"
            ],
            "group": {
                "kind": "build",
                "isDefault": false
            }
        }
    ]
}
```
【補足】
tasks.jsonの前半は実行ファイルを生成し、後半はコンパイルのみです。ビルドするときに、labelの表示でどちらかを選択できます。
・-Wall : すべての警告を有効にします。
・${file} : 現在編集中のソースコードファイル。
・-llgpio : Joan氏が開発したGPIO制御ライブラリをリンク。
・-lpthread : マルチスレッド処理をリンク。
・-g : デバッグ情報を生成。
・-O0: 最適化を無効化。大文字O＋数字０

launch.jsonはデバック設定ファイルです。

```launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Run C Program with lgpio",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
```
【補足】
・MIMode:gdb : GNUデバッガを使用してCプログラムをデバッグします。
・setupCommands :  gdbの出力をより見やすくするためのプリティプリントを有効化します。

# ５．Lチカのソースコードの作成と実行
　「ラズパイのメニュー」→「プログラミング」をクリックして、VSCを起動します。
VSCの「ファイル」→「フォルダを開く」をクリックして、作業フォルダを開きます。
次に、「ファイル」→「新しいテキストファイル」をクリックします。ファイル名は「Untitled」なので、先に「名前をつけて保存」をクリックして「4-Led01.c」と名付けます。次に、ソースコードを入力します。
　配線については、GPIO23にLEDのアノードを接続し、カソードを抵抗（390Ω）を介してGNDに接続してください。ソースコードとLEDの点灯回路の詳細については、参考文献[3]を参照してください。

```c:4-Led01.c
#include <stdio.h>
#include <stdlib.h>     //EXIT_SUCCESS
#include <lgpio.h>      //lgGpiochipOpen,lgGpioWrite,etc
#define PI5     4       // /dev/gpiochip4
#define PI4B    0       // /dev/gpiochip0
#define LED0    23      //GPIO23にLEDを定義

int main(void) {
    int hnd;
    int lFlgOut=0;
    hnd = lgGpiochipOpen(PI5);      //PI5の場合
    //hnd = lgGpiochipOpen(PI4B);   //PI4Bの場合
    lgGpioClaimOutput(hnd,lFlgOut,LED0,LG_LOW);　//LED0を出力に設定
    for(;;){
        lgGpioWrite(hnd,LED0,LG_HIGH);
        lguSleep(0.5);      //0.5秒時間待ち
        lgGpioWrite(hnd,LED0,LG_LOW);
        lguSleep(0.5);      //0.5秒時間待ち
    }
    lgGpiochipClose(hnd); 
    return EXIT_SUCCESS;
}
```
　コード記述後は、Visual Studio Codeのトップメニューから「ターミナル」を選択し、「ビルドタスクの実行」をクリックします。
 
![ビルドタスクの実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631966/89ec09ea-9081-41ef-8df7-efcb5b9609cf.png)

　次に、実行するビルドタスクを選択から「Build Excutable with lgpio」を選択します。「Build Excutable with lgpio」はtasks.jsonのlabelで定義しました。なお、tasks.jsonには、コンパルだけの指示もあります。コンパイルだけをしたい場合、メニュー「ターミナル」→「タスクの実行」をクリックし、「Compile Only with lgpio」を選択します。
 
![Build Excutable with lgpio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631966/cbcfe306-1125-4c00-9dcd-f4d23fe75830.png)

　VSCのメニュー「ターミナル」→「新しいターミナル」からターミナルを開いて、プログラムを実行します。Lチカが実行されます。

    ./4-Led01

　Lチカを止めるには、「ctrl」+「C」を押します。これはプログラムの強制終了で、無限ループを中断します。

# ６．デバックの方法
　launch.jsonを作成したので、VSCのメニュー「実行」→「デバックの開始」をクリックしても、プログラムを実行させることが出来ます。
 
![デバックの開始.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631966/e5450c21-6dfb-4d02-95b4-263f2f05599d.png)


　デバックアイコンが表示されます。左のボタンから、「一時停止」、「ステップオーバー」、「ステップイン」、「ステップアウト」、「再起動、「停止」の機能があります。
・「ステップオーバー」: 現在の行を実行し、次の行に進む。関数呼び出しは内部まで踏み込まず、外側だけを実行します。
・「ステップイン」: 関数呼び出しの内部に入って詳細な動作を確認する。
・「再起動」: デバッグセッションを最初からやり直す。

![デバックアイコン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631966/b075eb5b-f9a1-4553-b5ad-929584f1dcb0.png)

　「一時停止」ボタンをクリックすることで実行を一時停止し、現在の状態を確認できます。図の例では、18行目が「現在の実行位置」です。LEDは消灯しています。
 
![一時停止ボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631966/2d624512-48cf-46a3-af28-eced46ea63c0.png)

　次に、「ステップオーバー」をクリックします。lguSleep関数が関係する「clock_nanosleep.cを読み込めませんでした」と表示されますが、このエラーはシステム内部のコードが対象で、通常の操作には影響しません。そのため、無視してデバッグを続行してください。「ステップオーバー」を続けクリックして、15行目に移動します。
 
![ステップオーバー15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631966/d3b43b32-ce78-4760-a698-31c68f355dd8.png)

　ここで、「ステップオーバー」をクリックすると、「lgGpioWrite(hnd,LED0,LG_HIGH);」が実行されて、LEDが点灯します。「現在の実行位置」は16行目に進みます。

# ７．おわり
　今回の記事では、Raspberry Pi5にVSCをインストール場合の注意点、ビルドとコンパイルを作業を簡単に自動化できるtasks.jsonの例、Lチカのプログラムのステップ実行を紹介しました。特に、ハードウェアとソフトウェアが密接に連携する組込みシステムやIoTのモノづくりおいて、問題の特定に「デバック」は有効な手段です。最後に、この記事が少しでも皆さんの学習や開発の助けになれば幸いです。

# 参考文献
[1] VS Code or VS Codium, reason:crashes, code:'5', Rasperry Pi OS, Rasperry Pi 5, https://forums.raspberrypi.com/viewtopic.php?t=385208
[2] joan2937/lg, https://github.com/joan2937/lg
[3] 菊池達也,"【改訂新版】C言語ではじめるRaspberry Pi徹底入門,"技術評論社,pp.97-101(2025 Jan.)　https://gihyo.jp/book/2025/978-4-297-14647-4