実行環境
項目 | 説明 |
---|---|
OS | Windows11 |
WinMerge | version 2.16.30.0 |
やり方
ファイル->形式を指定して再比較->バイナリ を選択するとhex形式で表示してくれる
項目 | 説明 |
---|---|
OS | Windows11 |
WinMerge | version 2.16.30.0 |
ファイル->形式を指定して再比較->バイナリ を選択するとhex形式で表示してくれる
メッセージループを自分で書かずにWindowsのコンソールアプリケーションでタイマーを使う方法が無いか調べたところ、 CreateTimerQueueTimer関数 というものを見つけました.
以下プログラムは、約100msごとにHelloという文字列がコンソールに表示されます.
#include <iostream> #include <Windows.h> using namespace std; /* メインスレッド */ void Loop(); /* コールバック */ void CALLBACK OnTimer(PVOID lpParameter, BOOLEAN TimerOrWaitFired); HANDLE hEvent; HANDLE hTimer; int main() { hEvent = CreateEventW( NULL, /* セキュリティ属性 */ FALSE, /* 手動リセットオフ */ TRUE, /* 初期状態 */ (LPCWSTR)"PROC1" /* イベント名 */ ); CreateTimerQueueTimer( &hTimer, /* タイマーハンドル */ NULL, /* タイマーキューへのハンドル */ OnTimer, /* コールバック関数 */ NULL, /* コールバックに渡すパラメタ */ 0, /* 初めて発火するまでの時間 */ 100, /* 発火のインターバル */ WT_EXECUTEDEFAULT /* タイマーの種々の設定 */ ); Loop(); } void Loop() { while (1) { /* 手動リセットオフなので自動的に非シグナル状態になる */ WaitForSingleObject(hEvent, INFINITE); cout << "Hello" << endl; } } void CALLBACK OnTimer(PVOID lpParameter, BOOLEAN TimerOrWaitFired) { SetEvent(hEvent); }
Visual Studioで作成したソリューションやプロジェクトはフォルダごと場所を移動してもIDE上で正しくビルドすることが出来ます.
ということはパスが自動的に解決されていることになりますが、その仕組みを簡単にまとめました.
プロジェクトのマクロが関わってくるので、必要であれば以下の記事も参考にしてください.
項目 | バージョン |
---|---|
Visual Studio | 2017 |
ソリューションやプロジェクトのディレクトリを表すマクロは以下になります.
マクロ | 説明 |
---|---|
$(ProjectDir) | プロジェクトのディレクトリ |
$(SolutionDir) | ソリューションのディレクトリ |
また、デフォルト時に上記のマクロを参照しているマクロには次のようなものがあります.
マクロ | 説明 | デフォルト値 |
---|---|---|
$(OutDir) | 生成物の出力先 | $(SolutionDir)$(Configuration)\ |
$(IntDir) | 中間ファイルの出力ディレクトリ | $(Configuration)\ *1 |
$(TargetPath) | プライマリ出力ファイルへの絶対パス. | $(OutDir)$(TargetName)$(TargetExt) |
$(TLogLocation) | tlogファイルの出力先ディレクトリ | $(IntDir)$(MSBuildProjectName).log |
実は$(ProjectDir)と$(SolutionDir)は .slnファイルをIDEで開いた時に自動的に解決されます(.slnファイルへのパスを自動的に認識してマクロに反映してくれるっぽい). したがってその他のプロパティもデフォルトの時、 ソリューションフォルダを移動しようがビルドの生成物の出力先は相対的に不変です.
Visual Studioで作成したプロジェクトは、そのプロジェクト単体でビルドすることが出来ます. つまり、 親ディレクトリに.slnファイルが存在する必要はありません. プロジェクト単体で立ち上げようと.vcxprojファイルをIDEで開いた時、 .vcxprojファイルと同じパスに仮想的な.slnファイルがあるような振る舞いをします. .vcxprojファイルをIDEで開いた時のソリューションエクスプローラーをみるとそんな感じの振る舞いをしていることが分かります.
言い換えると、 $(ProjectDir)と$(SolutionDir)が同じ値になります.
ただし、 .vcxprojファイルの直上ディレクトリにそのプロジェクトをインポートしている.slnファイルがある場合は、.slnファイルをIDEで開いた時と同じ振る舞いになります .
プロパティに設定する値はマクロと固定値を組み合わせることが出来ます. IDEからプロパティを変更すると.vcxprojファイルに対応するプロパティが追記されます. 例えばプロジェクトプロパティの出力ディレクトリを変更すると、.vcxprojファイル上にOutDirプロパティが追加されます.
このような場合はマクロの部分は自動的に解決されつつ、ユーザーが定義した値も反映されます. ソリューションフォルダを移動してもビルドできるようにするために、相対パスで指定しておくのが無難です.
*1:暗に$(ProjectDir)を参照している
Visual Studioはマクロ(≒環境変数)を使用してビルドを行います. このマクロのうち重要そうなものをピックアップしました. バージョンはVS2017を対象にしていますが、最近のVSであれば大きく変わることはないはず.
相対パスで書かれたものは $(ProjectDir) を基準にする様子.
マクロ | 具体例 | 説明 |
---|---|---|
$(CharacterSet) | Unicode | 使用する文字セット |
$(CLRSupport) | true/false | マネージドコードかどうか |
$(ComSpec) | C:\WINDOWS\system32\cmd.exe | 使用するシェル |
$(Configuration) | Debug | 現在のプロジェクト構成の名前 |
$(ConfigurationType) | Application | プロジェクトの生成物の種別を表す |
$(DevEnvDir) | C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\ | Visual Studioのインストールディレクトリ |
$(ExtensionsToDeleteOnClean) | .obj;.pdb;(略) | プロジェクトのクリーン時に削除するファイル |
$(IncludePath) | C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include;(略) | コンパイル時にヘッダファイルを検索するフォルダ |
$(IntDir) | Debug\ | 中間ファイルの出力ディレクトリ. $(IntermediateOutputPath)のエイリアス? |
$(LibraryPath) | C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib;(略) | リンク時にオブジェクトを検索するフォルダ |
$(OutDir) | C:\Users\User_name\source\repos\Solution_name\Debug | 生成物の出力先 |
$(OutputPath) | C:\Users\User_name\source\repos\Solution_name\Debug | $(OutDir)との違いが不明 |
$(Platform) | Win32 | 現在のプロジェクトプラットフォームの名前 |
$(PlatformShortName) | x86 | 現在のアーキテクチャの短い名前 |
$(ProjectDir) | C:\Users\User_name\source\repos\Solution_name\Debug\Project_name\ | プロジェクトのディレクトリ |
$(ProjectGuid) | AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE | プロジェクトのGUID |
$(ProjectName) | Project_name | プロジェクトの名前 |
$(SolutionDir) | C:\Users\User_name\source\repos\Solution_name\ | ソリューションのディレクトリ |
$(SolutionName) | Solution_name | ソリューションの名前 |
$(TargetDir) | C:\Users\User_name\source\repos\Solution_name\Debug\ | ビルドのプライマリ出力ファイルのディレクトリ |
$(TargetExt) | .exe | ビルドのプライマリ出力ファイルの拡張子 |
$(TargetFileName) | Project_name.exe | ビルドのプライマリ出力ファイルの名前(拡張子付き) |
$(TargetName) | Project_name | ビルドのプライマリ出力ファイルの名前(拡張子なし) |
$(TargetPath) | C:\Users\User_name\source\repos\Solution_name\Debug\Project_name.exe | ビルドのプライマリ出力ファイルの絶対パス |
$(TLogLocation) | Debug\MapTest.tlog\ | tlogファイルの出力ディレクトリ. |
$(windir) | C:\WINDOWS | システムのフォルダ |
2024年今年の目標をば.
基本情報と応用情報は2023年に合格したので、この勢いで高度試験も1つくらい取るつもりです.
本当に取りたいのはエンベデッドシステムスペシャリストなのですが、秋試験しかないので春試験で情報処理安全確保支援士試験でも受けようかと思っています.
そのまんま. とりあえずDIPよりもピッチが小さい表面実装ができるようになりたい.
運動しなさ過ぎて体を動かすとすぐ筋肉痛になってしまうので、多少は体を動かしたいです.
知り合いの定義にもよりますが、会社以外の知り合いを増やしたい.
Jiangsu Qin Heng (WCH) 社のCHから始まる代表的なICをまとめてみた.
末尾にアルファベットが付き、パッケージや追加機能が区別される. 次の機能がある.
回路実装済みボードも多く販売されているが、チップ単体も比較的入手しやすい.
名称 | パッケージ | コメント |
---|---|---|
CH340G | SOP-16 | 一番よく目にする |
CH340B | SOP-16 | 内蔵EEPROMを書き換えて設定を変更できる. |
CH340R | SSOP-16 | IrDA対応 |
CH340シリーズのパワーアップ版. 末尾にアルファベットが付き、パッケージや追加機能が区別される. 種類にもよるが次の機能がある.
EPP/MEMパラレルポートというのが謎だが、EPPはおそらくEnhanced Parallel Portの略かと思われる. MEMパラレルポートは何かわからない.
なぜかチップ単体での販売はあまりなく、回路実装済みボードとして販売されていることがほとんど.
名称 | パッケージ | コメント |
---|---|---|
CH341A | SOP-28 | 一番よく目にする. すべての機能を有する |
CH341T | SSOP-20 | USB-UART/USB-I2C変換ができる |
CH341H | SSOP-20 | USB/SPI変換ができる |
Intel8051の互換MCUで、オリジナルの機能に加え拡張機能が搭載されている.
(オリジナルのIntel8051が発売した時には存在しない)USBを含むペリフェラルを一通り持っている.
名称 | パッケージ | コメント |
---|---|---|
CH551G | SOP-16 | エントリモデル的な感じ? |
CH552E | MSOP-20 | |
CH552T | TSSOP-20 | CH552Eより機能が豊富 |
www.slideshare.net
32ビットのRISC-Vマイコン. なんやかんやJiangsu Qin Heng (WCH) 社のICとして最初に知ったICかもしれない. 安いものは1個50円もしない.
名称 | パッケージ | コメント |
---|---|---|
CH32V003J4M6 | SOP-8 | 秋月で一個40円. USBは無し. |
CH32V305FBP6 | TSSOP-20 | 秋月で一個350円. クロック144MHz. USB有り. |
USBの信号を4ポートのUARTへ変換するIC.
CH340シリーズの強化版. USB-UART変換、USB-SPI/I2C変換、USB-JTAG変換が可能なIC.
USBの信号を8ポートのUARTへ変換するIC.
USBメモリやSDカード内のファイルを読み書きできるようになるIC. CMD_RD_USB_DATA0 や CMD_SET_FILE_NAME などを発行することでMCUからファイルシステムを使えるようになるらしい. すごい(小並感).
BLE(Bluetooth Low Energy)-UART変換IC.
調べてみるといろいろなICを出していた.
DLLを利用するEXEを実行したところ、プログラムと同じフォルダにDLLがあるにも関わらずDLL周りのエラーが生じることがありました.
原因はEXEが利用するDLLがさらにほかのDLLを参照していたことでした.
つまり、EXE --(use)--> DLL1 --(use)--> DLL2 という関係の時、EXEとDLL1は同じフォルダにあるものの、DLL2が不足していたということになります.
また、このような状況の時にもエラーの原因がわかるように、DLLを利用するときは必ずエラーハンドリングを忘れずに書きましょう.