2022年04月23日

USBカメラ変換基板

 今回は昨年から試行錯誤しながら取り組んでいるプロジェクト(USBカメラ変換基板プロジェクト)について紹介します。組込系でカメラ機能を利用する場合、昨今ではOpenMVやM5Camera、ESP32-Cam等を利用することが多いと思います。マイコンとカメラを接続する場合、一般的に下記の接続方法があります。


接続方法メリットデメリット製品例
SPI
伝送が高速
ローエンドマイコン対応
機種によってコマンド互換なし
低解像度
Arducam等
UART
省配線
コマンド互換少し有
ローエンドマイコン対応
伝送が低速
低解像度
シリアルカメラ等
NTSC+SPI
伝送が高速
汎用NTSCカメラ対応
NTSCカメラ自体の入手性
バッファメモリ必須
解像度固定
TVP5150等でSPI変換
パラレル
伝送が高速
高解像度
配線が多い
ハイエンドマイコンのみ対応
カメラモジュール等
MIPI
伝送が超高速
高解像度
専用IF必須
ハイエンドマイコンのみ対応
HDMI
伝送が超高速
高解像度
変換IC必須
ハイエンドマイコンのみ対応
TFP401等で変換
カメラユニット
低コスト
筐体ケース付きがある
別途ファーム書き込み必要
OpenMV
M5Camera
ESP32-Cam
HuskyLens
USBカメラ
USB汎用接続
ケーブル延長容易
入手性が良い
UVCホストの実装が複雑
USB1.1では動作しないカメラ有
解像度の制約が多い
Logicool C270、C920等


 SPI接続やUART接続の場合、予めバッファがカメラ側に内蔵されていることが多いため、マイコン側に大容量メモリがなくても最低限の処理が可能です。一方、パラレル接続やMIPI接続の場合はイメージセンサからほぼそのまま出力されるため、それに対応した高速なインタフェースと読み出しデータを保持するための大容量メモリが必須となります。ユニットとして販売されているものは公開されているファームを書き込むだけで簡単に動作確認や実装できるために便利ですが、生産終了やロットによる機能差等が生じる場合が多々あります。多くのカメラモジュールで使用されるイメージセンサは主にスマートフォン向けのため、カメラモジュールの生産終了や型式変更等が頻繁で継続した安定入手に難があります。

 上記の方法の中でUSBカメラやNTSCカメラを使用する場合、汎用的なIFで継続して安定入手が可能です。ただ、そのままでは容易に使うことが難しいのが課題です。そのため、単体や小規模のマイコンでも簡単に処理できるUSBカメラ変換基板を開発することにしました。
コンセプトは下記の通りです。

・汎用的なUSBカメラから画像取得(jpeg、bmp対応)
・単体でSDカード等に画像ファイルを保存
・簡易的なタイムラプス撮影ができる
・UARTやSPIを介した低解像度の画像取得


実際に開発したUSBカメラ変換基板です。

img1.JPG


もともとはSTM32マイコンで実装予定でしたが、HALライブラリではIsochronous転送に失敗してうまく転送できない、昨今の半導体不足で入手困難であるため、断念。FTDIのVinculumではRTOSのオーバーヘッドが無視できず、SPIの転送速度が遅すぎて断念しました。最終的にPIC32MZマイコンを用いて実装しました。PIC32MZはUSB2.0 High Speedに対応しているため、多くのUSBカメラに対応できます。

SPIを介してLCDを接続してBMPデータを描画させてみました。

img6.gif

カメラや設定によって異なりますが、1秒間に10フレーム弱程度で比較的スムーズにLCDに表示させることができました。


img7.gif

また、10秒間隔でのタイムラプス撮影をして後からコマ送りで動画に編集してみました。今後はサンプルコードや利便性の向上、対応カメラの追加、機能追加等を検討したいと思います。随時こちらに更新情報を追加したいと思います。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2022年04月09日

MachXO3LF/L Starter Kit UART設定

MachXO3LF/L Starter KitはLattite社のFPGA、MachXO3シリーズの評価ボードです。FTDIのUSBシリアル変換ICが搭載されているため、Diamond Programmer等から書き込み治具なしでそのまま書き込んで動作確認できます。

特にMachXOシリーズは外部FlashなしでFPGA単体で動作可能なため、小規模な開発に便利です。MachXO3LFとMachXO3Lで2種類ありますが、何度も書き換えて使用する可能性がある場合はFlashベースのMachXO3LFとなります。MachXO3LF/L Starter KitはFTDIの2232Hを搭載しています。2232Hは1つのICにシリアル機能をデバイスAとデバイスBで2つ搭載しています。デバイスAはJTAG書き込み用(245FIFOモード)、デバイスBはUARTやI2C等のユーザ用途に設定可能になっています。一方でデフォルトではデバイスBが初期設定(245FIFOモード)となっており、UART等の用途で使用できません。今回はMachXO3LF/L Starter KitでFTDIのUARTを使用する設定について紹介します。


@ハードウェア設定
MachXO3LF/L Starter KitのデフォルトではFTDIのデバイスBとMachXO3が接続されていません。FTDIチップ横のR14(FTDI:TX-FPGA:RX)、R15(FTDI:RX-FPGA:TX)に抵抗(0~100Ω程度)を取り付ける必要があります。写真ではハンダでジャンパさせました。


uart1.jpg



AFTDI EEPROM設定
デバイスBが初期設定(245FIFOモード)となっており、UARTモードに切り替える必要があります。FTDIチップの横にEEPROMが接続されており、そこにFTDIチップの挙動を決定するパラメータが書き込まれています。パラメータを書き換えることでデバイスBをUARTとして動作させます。ここで注意点としてEEPROMのパラメータの書き換えに失敗した場合、Diamond Programmer等からJTAG治具として検出できなくなる可能性があるため、注意してください。

こちらのリンクからEEPROMのパラメータ書き換えのソフトウェアFT_Progをダウンロードします。ソフトウェアを起動し、F5キーを押して、ワーニングメッセージが表示されてOKを押すと、現在の情報が表示されます。

uart5.jpg

uart2.jpg

他にもFTDIデバイスが接続されている場合、誤って他のデバイスに書き込んでしまう可能性があるため、MachXO3LF/L Starter Kit以外のデバイスを外して、ツリー表示のデバイスが1つであることを確認してください。

Hardware Specificをクリックし、PortBのHardware設定をRS232 UARTに設定します。PortAはJTAG用の設定となっているため、間違えてPortAの設定を変更しないように注意します。

uart3.jpg

同様にDriverの項目をVirtual COM Portを選択します。

uart4.jpg

上記の設定で書き込みボタンを押します。USBを抜き差しするとCOMポートとして認識できるようになります。

なお、デバイスマネージャーから「表示をコンテナ別」に設定して、そこからVCP(Virtual COM Port)に設定変更できるチェックボックスがありましたが、こちらの設定だけではCOMポートが追加されるものの、UARTとして動作しませんでした。やはり、FT_Progを用いてパラメータの書き換えが必要なようです。

ftdi1.jpg

ftdi2.jpg


上記の手順後、C11にTX、A11にRXとしてユーザプログラムを書き込むことでMachXO3LF/L Starter Kit単体でPCとUART通信できるようになりました。R14、R15がデフォルトで未実装に気づかず、デバッグに時間を要してしまいました。Starter KitのPDF等にもUART通信を使用する手順について説明の記載がなく、ちょっと不親切だと思いましたが、なんとかPCとUART通信できるようになりました。

posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2022年03月26日

音方位センサ

 ー昨年から断続的に開発してきた音方位センサがやっと形になってきたため、紹介したいと思います。音方位センサは直径4cmの円形基板に4つのMEMSマイクを搭載したセンサで音源の方位を音の時間差から計算してLED及びI2C、UARTで結果を出力する基板です。主な用途として小型の首振りロボットの頭に搭載することで声で頭の向きを変えたり、声でカメラの向きを変更して撮影するといった用途を想定しています。

 基板自体の開発は20年12月に完了していたものの、ファームウェアのアルゴリズムが安定せず、リリースできずにいました。断続的にアルゴリズムの検討、処理の見直しを実施し、最終的にGCC-PHAT(Generalized Cross-Correlation. PHAse Transform)方式である程度、安定して方向検知できるようになりました。GCC-PHATの原理の詳細については多くの論文や資料があるため、こちらでは述べませんが、音の方位を検出する原理として、少し離れたマイクから同時に音をサンプリングすることで、マイク同士の距離の差によって音が到達する時間差から方位を検出します。180度片側の場合、2つのマイクで角度を検出できますが、前方か後方か分かりません。平面の場合、3つ以上あれば360度の方位を検出できます。本センサは1つ冗長ですが、マイクを4つ搭載しています。

ssl_algo.jpg


 まず、ハードウェアの構成として、どのような種類のマイクを使用するかという問題があります。基板の実装密度を高め、より高感度、音の感度が周波数によらずフラットなMEMSマイクを採用しました。MEMSマイクの中でもアナログマイクとデジタルマイク(PDM)のどちらにするかについては、アナログの場合、外付けでアンプが必須で環境によって増幅率が変更な必要な場合があります。デジタルの場合は外付けのアンプが不要な代わりにソフトウェアで処理が必須となります。部品数を減らし、環境にロバストなデジタルMEMSマイクを選定しました。

 微小な音の遅延を測定するため、4つのデジタルMEMSマイクを同時にサンプリングする必要があります。STM32L4シリーズ等ではPDMデジタルMEMSマイクを容易に処理可能なDFSDMを搭載していますが、多くのマイコンはそのような機能を搭載していません。汎用性等を考慮し、今回はSPIを用いて実装しました。4つのMEMSマイクをSPIで同時サンプリングする場合、SPIのクロックを4つで共通にして、SPIの1つをマスタ、残りの3つをSPIスレーブとして実装し、DMA転送することで4つのMEMSマイクの同時サンプリングを実現しています。RAMが十分あり、SPIを5つ搭載しているSTM32F411を選定しました。

sds1.jpg

sds2.jpg


 実際にスマートフォンから水の音を出して方向検知するデモ動画を紹介します。




 GCC-PHATアルゴリズム単体に加えて、誤検知をより防止するため、周波数帯を数kHz前後にフィルタし、音の変化が大きい場合(音のアナログ値の標準偏差)にのみ角度出力することで比較的安定して方向検知できるようになりました。一方で手を叩く音やモノを叩く音のような瞬間的な音の場合、音の反射等の影響が大きくなり、誤検知が多くなります。UARTやI2C通信周りの実装を今後行い、コード、回路図含めて公開後、提供開始したいと思います。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2022年03月12日

PIC32 ウォッチドッグタイマ

 今回はPIC32マイコンのWDTの設定方法を紹介します。WDT(ウォッチドッグタイマ)は名の通り、MPUの動作を見張る番犬です。WDTを有効化するとMPUに異常な処理が発生した場合や意図しない処理の無限ループに入ってしまった場合に異常としてMPUをリセットさせることができます。PIC32マイコンにはWDTの他にDMT(デッドマンタイマ)も搭載されています。目的と用途が異なるため、ここでは詳細は省略しますが、WDTはスリープ等からの復帰にも使用でき、汎用的でざっくりとした時間間隔での監視が可能です。一方、DMTはスリープ復帰には使用できませんが、設定した命令数(処理)に対して細かく監視間隔を設定できます。DMTは少し特殊な用途となるため、今回はWDTのみ紹介します。

 WDTの動作原理として、監視の時間間隔を予め設定し、監視を開始します(WDT_Enable)。そのあと、コード上で定期的にWDTカウントリフレッシュ関数WDT_Clearを呼び出します。正常な場合は予め設定した監視時間よりも前にWDT_Clear関数で正常に動いていることをWDTに知らせます。何かしらの異常が発生した場合は予め設定した監視時間になってもWDT_Clear関数による知らせがWDTにないため、監視時間を超えた時点でWDTが強制的にMPUのリセットを実行する仕組みです。正常動作にも関わらず、監視時間に達してリセットされてしまうということがないように、ある程度余裕のある監視時間を設定すべきです。ただ、余裕にしすぎると万一、異常な状態になった場合にリセットがかかるまでに時間を要することになるため、バランスを見て設定する必要があります。例えば、長い処理ではリフレッシュ関数を所々に予め入れておくといった対応が想定されます。

Harmoney3のProject GraphのSystem項目から設定することができます。


wdt0.jpg

WDTの設定については特に分かりずらく、WDTのパラメータ設定はDEVCFG1から設定します。WDTPSのパラメータを変更することでリセットまでの監視時間を変更することが可能です。

wdt1.jpg

 一方、WDTの有効、無効はDEVCFG1とは別のWDTの項目にチェックを入れることで自動的にWDT関連の関数ライブラリコードが生成されるようになります。WDTPSのパラメータの設定を秒数としてWDT項目から確認することができます。

wdt2.jpg

 パラメータ設定DEVCFG1と有効可否設定WDTが分かれているため、初めてだと戸惑いました。WDTの有効、無効は他のペリフェラル機能と同様にAvailable Componentsに項目を入れた方が直感的で分かりやすいと思いました。
posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする

2022年02月26日

PIC32MZEFシリーズのブートローダ機能

 PIC32MZ2048EFGマイコンのブートローダ機能を検討したため、今回はその際に戸惑った点等を備忘録として紹介します。ブートローダ機能を利用するとPICkit4やSNAP等の専用の書き込み治具がなくても、SDカードやUART等からファームウェアを容易に書き換えできるようになります。何かしらの製品に組み込んだ際にユーザ側でファームアップデートすることが想定される場合に便利です。今回は事前にブートローダを書き込んだPIC32MZマイコンにファームウェアの入ったSDカードを挿入すると自動的にファームウェアが書き込まれるブートローダを作成しました。Microchipから様々なブートローダのドキュメントが提供されていますが、いまいち全容を把握するのに苦労したため、ポイントを絞って紹介したいと思います。詳細は各ドキュメントを参照してください。


まずはブートローダ機能を開発する際のポイントを先に紹介します。

■ポイント
@ブートローダ用のプロジェクトとアプリケーションのプロジェクトは分けて作成する
 →リンカファイルが異なるため、ミスを減らすためにプロジェクトを分ける。また、アプリケーション用のプロジェクトでは通常のバイナリ(hex)ファイルの他にbinファイルを生成するスクリプトを追加することでブートローダ読み込み用のbinファイルを追加で生成させる。

Aリンカファイル作成方法
 →Harmony3+bootloaderで生成したプロジェクトでブートローダ用のリンカファイルbtl.ldはそのまま使用可能。一方、アプリケーション側のリンカファイルはp32MZ2048EFG100.ldを編集必須。また、Harmony3+bootloaderで生成したプロジェクトのリンカ設定はbtl.ldファイルでなく、p32MZ2048EFG100.ldファイルとなっているため、p32MZ2048EFG100.ldをプロジェクトから除外してブートローダ用のリンカファイルbtl.ldに置き換えること。

Bクロック設定やデバイスコンフィグは同じ設定にする
 →ブートローダとアプリケーションの切り替え動作が不安定になる。

Cブートローダ用のプロジェクトは最低限の機能に絞る
 →機能を盛り込むとブートローダファームがブートローダ領域に入らない。SDを読み込み専用に設定し、コンソールデバッグ機能は使用しない。

Dブートローダのファームは直接書き込み可能
 →MPLAB IDEからデバッガを介して書き込み可能。既定ではフラッシュ全削除後に書き込みされるため、通常は書き込み直後にブートローダが起動し、アプリケーションの書き込みモードに入る。

Eアプリケーションのファームは直接書き込まずにブートローダから書き込み
 →直接書き込むとフラッシュ全削除してアプリケーションだけが書き込まれる。ブートローダが消されてしまうため、アプリケーション領域に処理をジャンプさせることができず、アプリケーションが起動しない。

■ブートローダ機能のシーケンス
ブートローダ起動→トリガチェック→(書き換えモードの時)ファーム書き換え処理→ソフトリセット
                →(通常起動の時)アプリケーション起動処理→アプリケーション起動

■トリガ種類
ブートローダが起動後にファーム書き換えモードに入るか、通常のアプリケーション起動モードに入るかはIO状態やメモリ上の変数状態で切り替えることができます。

・a)IO状態トリガ
 PIC32マイコンをリセットさせて、起動時のIO状態を見て切り替えます
・b)メモリ上の変数状態トリガ
 アプリケーションが起動している状態でユーザ操作によってファーム書き換えモードにします。ファーム書き換えモードでは特定のメモリ領域に変数を書き込んで部分的なシステムリセット(特定のメモリ領域はリセットされない)をかけることでブートローダを再度起動させて、特定のメモリ領域の変数を見て書き換えモードに入るか、通常のアプリケーション起動モードに入るか切り替えます。




■ブートローダ側の開発流れ
1. MPLAB ] IDEのHarmony3にBootloaderパッケージを追加する。
 Tools→Embedded→MPLAB Harmoney3 Content Managerをクリック。bootloaderとbootloader_apps_sd〜にチェックを入れてパッケージを追加します。

bootloader1.jpg

bootloader2.jpg


2. Harmoney3プロジェクトを作成し、Filesytemタイプのbootloaderを追加する。
 メディアタイプにSDカードを選択し、b)メモリ上の変数状態トリガを有効にするために16バイトの領域を確保する。また、ファイルシステムの設定は自動マウントを有効化して、読み込み専用に設定する。また、32GB以上のSDカードにも対応させる場合はexFatにチェックを入れる。また、クロック設定やデバイスコンフィグはアプリケーション側と共通の設定をします。

bootloader3.jpg

bootloader4.jpg

bootloader5.jpg


3. コード生成後にリンカファイルを設定する。
 Harmoney3プロジェクトでbootloaderを追加すると自動的にbtl.ldとp32MZ2048EFG100.ldの2つのリンカファイルがプロジェクトに追加される。ただ、ビルド設定ではp32MZ2048EFG100.ldが有効となるため、p32MZ2048EFG100.ldをプロジェクトから除外して、btl.ldだけにする。

bootloader7.jpg


4. ファイルシステムコード追記する。
 デフォルトではff.hのビルドに失敗するため、ff.hの38行目くらいに#define __STDC_VERSION__ 199902を定義する。

5. ブートローダコードを実装する。
 詳細はコードをアップロードしてありますのでそちらを参照してください。起動直後にブートローダ機能を実行するか、アプリケーションを起動させるかの切り替えがinitialization.cにあります。

■アプリケーション側の開発流れ
1. 通常通りにMPLAB ] IDEのHarmony3のプロジェクトを作成します。また、クロック設定やデバイスコンフィグはブートローダ側と共通の設定をします。また、リンカファイルを変更して独自のリンカファイルを使用するため、Harmony3のプロジェクトグラフ内のsystem→Device&Project Confguration→Toolchain selectionのAdd linker file to projectのチェックを外します。

bootloader9.jpg

2. リンカファイルp32MZ2048EFG100.ldを書き換えます。

・PROVIDE(_ebase_address = 0x9D000000);の下にPROVIDE(_ebase_vector_offsets = 0x1000);を追加。
・_RESET_ADDR = 0xBFC00000;を_RESET_ADDR = 0xBD000000;に変更。
・_BEV_EXCPT_ADDR = 0xBFC00380;と_DBG_EXCPT_ADDR = 0xBFC00480;を削除。
・_SIMPLE_TLB_REFILL_EXCPT_ADDR、_CACHE_ERR_EXCPT_ADDR 、_GEN_EXCPT_ADDR に_ebase_address を追加して下記のように書き換える。
_SIMPLE_TLB_REFILL_EXCPT_ADDR = _ebase_address + _ebase_vector_offsets + 0;
_CACHE_ERR_EXCPT_ADDR = _ebase_address + _ebase_vector_offsets + 0x100;
_GEN_EXCPT_ADDR = _ebase_address + _ebase_vector_offsets + 0x180;

・メモリ領域(MEMORY)の書き換えとconfig領域の削除
(変更)
kseg0_program_mem (rx) : ORIGIN = 0x9D001000, LENGTH = 0x200000 - 0x1000
kseg1_boot_mem : ORIGIN = 0xBD000000, LENGTH = 0x480
kseg1_boot_mem_4B0 : ORIGIN = 0xBD0004B0, LENGTH = 0x1000 - 0x04B0
(追記)
/* Reserve 16 Bytes to Store Bootloader Trigger Pattern */
kseg0_data_mem (w!x) : ORIGIN = 0x80000000 + 16, LENGTH = 0x80000 - 16
(削除)
アプリケーション側ではコンフィグを行わないため、config領域を削除します。
config_BFC0FF40からboot2lastpageまでを削除します。

・SECTION領域(SECTIONS)のconfig削除
.config_BFC0FF40から始まるSECTIONSを削除する。

・SECTION領域(SECTIONS)の例外処理を削除
ブートローダ側に含まれるため、下記の例外処理を削除する。
.bev_excpt _BEV_EXCPT_ADDR :
{
KEEP(*(.bev_handler))
} > kseg1_boot_mem

・割込みオフセットに_ebase_vector_offsetsを追記

* Interrupt vector table with vector offsets */
.vectors _ebase_address + _ebase_vector_offsets + 0x200 :

・ブートローダ側に含まれるため、下記を削除する
/* The startup code is in the .reset.startup section.
* Keep this here for backwards compatibility with older
* C32 v1.xx releases.
*/
.startup ORIGIN(kseg0_boot_mem) :
{
KEEP(*(.startup))
} > kseg0_boot_mem

・ デバッグ例外処理とコンフィグはブートローダ側に含まれるため、除く処理を追加する。
/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.discard) }の下に下記を追加する。
/DISCARD/ : { *(._debug_exception) }
/DISCARD/ : { *(.config_*) }

最終的に書き換え前(書換前リンカファイル.ld)と書き換え後(書換後リンカファイル.ld)のファイルはこのようになります。

3. アプリケーション側で必要に応じて、ソフトウェア的にファーム書き換えモードにするコードを追加します。BTL_TRIGGER_PATTERN で定義された特殊な値をBTL_TRIGGER_RAM_START に書き込んでソフトリセットさせることでリセット後にブートローダが起動し、SDカードからファームを書き換える処理を走らせることができます。

#include "sys/kmem.h"

#define BTL_TRIGGER_RAM_START KVA0_TO_KVA1(0x80000000)
#define BTL_TRIGGER_PATTERN (0x5048434DUL)
#define DCACHE_CLEAN_BY_ADDR(start, sz)
static uint32_t *ramStart = (uint32_t *)BTL_TRIGGER_RAM_START;

SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "Bootloader Triggered!\r\n");
ramStart[0] = BTL_TRIGGER_PATTERN;
ramStart[1] = BTL_TRIGGER_PATTERN;
ramStart[2] = BTL_TRIGGER_PATTERN;
ramStart[3] = BTL_TRIGGER_PATTERN;
DCACHE_CLEAN_BY_ADDR(ramStart, 16);
APP_SystemReset();

4. プロジェクト設定でbinファイルを生成するコードを追加します。
アプリケーション側のビルド後にhexファイルからbinファイルを生成します。
${MP_CC_DIR}/xc32-objcopy -I ihex -O binary ${DISTDIR}/${PROJECTNAME}.${IMAGE_TYPE}.hex ${DISTDIR}/${PROJECTNAME}.${IMAGE_TYPE}.bin

bootloader8.jpg


これでブートローダ機能の設定および実装は完了です。先にブートローダ側のファームをPIC32マイコンに書き込んで、アプリケーション側のbinファイルをimage.binにファイル名を書き換えてSDカードに入れるとファームが書き換えられ、アプリケーションが実行されます。プロジェクトファイルおよび全体のコードはこちら(code.zip)です。

なお、パッケージを追加するとC:\Users\(ユーザ名)\Harmony3\bootloader_apps_sdcard\apps\sdcard_bootloader内にブートローダ側のbootloaderとアプリケーション側のtest_appがサンプルコードが追加されます。ただ、サンプルプログラム(PIC32MZDA)とREADMEだけでは情報少なく苦労したため、試行錯誤しながら何とか動かすことができました。SDカード以外にもUARTやフラッシュメモリ等からも書き換えできますが、専用ソフトが不要でユーザ側のOS環境に依らず負担が少ないSDカードからの書き換えが汎用性が高く良いと思いました。また、アプリケーション側のリンカファイルを書き換えるとそのままでは簡単にデバッグやブートローダ無の単体動作できないため、元のリンカファイルも残しておいて、読み込むリンカファイルを切り替えるとよいと思います(Lodableに追加する別のデバッグ方法もありますが...)。
posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする