本文地址:https://www.cnblogs.com/jqdy/p/12565161.html
習慣了VS的強大編輯功能,對Keil 5越來越深惡痛絕。查閱網絡文章后按圖索驥初步實現了VS編輯Keil項目的功能,但是VS仍然不識別sfr、sbit、bit等特有關鍵字。雖然不是大問題,但是當鍵入STC8.h中定義的相關寄存器名稱時,不能使用自動提示功能,成了比較大的缺憾。嘗試再三,利用條件編譯終於讓VS識別了sfr等特有關鍵字,並實現了自動提示功能。
第一步:模擬Keil5中的項目結構,在VS中建立一個解決方案。
這不是讓VS編譯Keil項目,而是方便在VS中打開項目中的各個文件進行編輯。下面,每個操作步驟一張圖片。
1. 創建新項目
2. 選定空項目
3. 確定項目名稱和目錄
名稱和目錄隨意,不過為了避免產生混淆,名稱最好和Keil中的項目名稱一致或類似,目錄位置最好也和Keil的.uvproj放在一起,或在之下再建一個專門的vs項目目錄。總之,原則就是即要與Keil項目相呼應,又要分開放置,避免混淆。
4. 添加有關.c和.h文件
在“解決方案資源管理器”中,右擊“源文件”-“添加”-“新建項”或者“現有項”,找到Keil項目所在目錄或者其下的子目錄,添加或者新建Keil項目所使用的".c"文件。同樣,處理“解決方案管理器”中的“頭文件”,添加或者新建相關的“.h”文件。這樣就把所需的.c和.h文件添加完畢了,添加完畢后保存。
這時,從vs項目所在文件夾中可以看到VS特有的.sln、.vcxproj等文件和Debug目錄,這些都是VS使用,但Keil不用的,所以,為了避免混淆,最好將VS和Keil文件放在不同的目錄。注意這里所說的“VS使用,但Keil”不用,僅僅針對於.sln和.vcxproj等文件,對於剛才在“解決方案管理器”中添加的.c和.h文件,兩者是共用的,均保留在原Keil項目目錄下。在后續使用VS編輯相關文件並保存后,切換到Keil中,Keil會提示相關文件已經改變,是否重新加載,重新加載就會發現VS編輯的內容了。
第二步:讓VS可以自動找到芯片頭文件和項目頭文件。
5. 設置VS項目的默認頭文件目錄,
目的是在VS中建立頭文件搜索路徑,好在各個.c和.h文件之間自動建立關聯。
5.1 在“解決方案管理器”中鼠標右擊該項目-屬性。
5.2 在彈出的“屬性頁”窗口中,先后選擇:VC++目錄-包含目錄-右面的下拉箭頭-編輯,彈出“包含目錄”對話框
5.3 添加默認包含文件所在的目錄
在彈出的“包含目錄”對話框中,點擊看上去像文件夾一樣的第一個圖標,這時,下面就多出來一個空行,再點擊空行右邊的“...”圖標。這樣就出現了常規的“選擇目錄”對話框,因屬常規操作就不再貼圖了。
這里要強調的是,要添加頭文件的包含目錄有三個。
第一個是C51標准庫的頭文件所在目錄,我的機子中這個目錄是“C:\C:\Keil_v5\C51\INC”。
第二個是所使用芯片的.h文件所在目錄,例如我是用的STC8.h,這個頭文件在安裝Keil的目錄內,例如下圖第一個白框中顯示半行的哪個目錄,在我的電腦中具體是“C:\Keil_v5\C51\INC\STC”,這樣就可讓VS找到項目c文件中#include <stc8.h>所指的stc8.h了,編輯時VS就可自動提示stc8.h中的內容了。
第三個要添加的目錄是你這個項目中自己添加的.h文件所在的目錄,如果這些.h文件放置到多個目錄中,還要逐個添加進來,這樣VS就可找到項目c文件中自定義的那些頭文件了,這些頭文件形如#include "stc8_abc.h"。
至此,網絡上提供的辦法就結束了。但是,VS仍然不認sfr、sbit、bit等C51特有的數據類型,在這些類型下面有紅色波浪線的提示到在其次,主要問題是VS不認這些數據類型,編輯時的自動提示中就不會出現這些內容。
第三步:讓VS識別sfr、sbit、bit。
6. 讓VS識別sfr、sbit、bit等數據類型,進而在編輯時可進行自動提示。
這里用到的主要是預處理中條件編譯的相關內容,有2個方面的工作需要做。
6.1 在VS的“預處理器”中加入特有的預處理器定義符號
我這里加入的是“_keil_vs_”,這個符號怎么寫不重要,重要的是keil中永遠用不到即可。這個符號僅僅加在VS項目中,而不加入到Keil編輯器中,要達到這樣的目的:使用這個標記定義的內容只有VS認識,keil不認識。
在5.2中“屬性頁”中不進入“VC++目錄”,而是進入“C/C++”-預處理器-預處理器定義-右邊下箭頭-編輯,在“預處理器定義”對話框中輸入這個符號,然后保存退出。
6.2 在Keil安裝目錄找到所使用芯片的.h文件,並進行修改。
如5.3所述,我使用芯片的.h文件,在“C:\Keil_v5\C51\INC\STC”內,文件名是“STC8.h”。開打這個文件,在文件開頭鍵入以下內容。
#ifdef _keil_vs_ typedef unsigned char sfr;//僅用於vs編輯Keil文件 typedef unsigned char sbit;//僅用於vs編輯Keil文件 typedef unsigned char bit;//僅用於vs編輯Keil文件 #endif // _keil_vs_
下面貼個圖:
其中,最關鍵的就是使用 #ifdef 判斷預處理器中是否定義了_keil_vs_這個符號了。
對於VS,剛才已經在預處理器中進行了定義,所以對於VS來說sfr、sbit、bit就被typedef為unsigned char類型了,VS遇到這幾個類型就會認為是unsigned char類型,這樣就實現了VS識別的目的,也能進行自動提示了。
對於keil來說,因為並沒有將_keil_vs_這個符號添加進預處理器,所以這幾個在#ifdef/#endif中包含的幾個typedef不起任何作用。這樣,就實現了VS和Keil的兼顧,VS既能識別並自動提示,又不對keil產生任何影響。
實際上,可以typedef為任何vs識別的類型,不一定必須是unsigned char。如果有其他類似需要也可按此處理。
至此,大功告成!
下面貼一個效果圖,當鍵入sbu過程中,VS會出現SBUF的自動提示: