EX本文編譯器下載
① 我最近才開始java 今天下載安裝了java jdk 後綴名改成了.java 為什麼還是顯示的本文文檔 隱藏後綴名沒問題
1.首先,後綴名為.java並且你只安裝了jdk,沒有其他編輯軟體,的確是只能按文本顯示的。你可以右鍵選擇打開方式,選擇你想要的程序,然後勾選始終用這程序打開來更改默認編輯軟體。
jdk是一個工具包,沒有友好的用戶界面和一些輔助功能,你可以安裝eclipse,netbeans來幫助你開發。這些編譯器可以幫助你檢查語法錯誤等功能,做開發必須的。O(∩_∩)O~
2.①直接在運行里敲cmd,然後使用cd C:\java\bin (舉例,具體看你Jdk安裝路徑)轉到你jdk的bin目錄下.註:如果配置了JAVA_HOME這步可以省略,直接敲cmd就可以下一步了。
②然後輸入 java ***.java 就可以編譯了。
希望有所幫助。
② 如何修改exlimps默認的版本編譯器
漸變編譯器平時是隱藏的,只要點圖中的漸變條(漸變疊加窗口),即可顯現。出現漸變編輯器後,就可以自定義漸變樣式了。
③ 如何用C#編寫文本編輯器
首先,打開你的開發工具Microsoft visual studio 2005。文件——》新建項目——》項目類型選擇visualc#,模板選擇windows 應用程序,到此我們已經創建好一個window窗體了!
接著修改窗體的屬性,窗體名字修改為EditorForm,窗體的text屬性修改為你要的命名。在工具箱了選擇MenuStrip控制項如圖,把菜單拖到窗體去!
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceSimpleEditor
{
publicpartialclassEditorForm:Form
{
stringpath=null;
stringisSaved="n";
intinitLenglt=0;
publicEditorForm(stringpath)
{
this.path=path;
InitializeComponent();
}
privatevoid新建NToolStripMenuItem_Click(objectsender,EventArgse)
{
if(this.richTextBox1.TextLength>0&&(isSaved.Equals("n")))
{
if(MessageBox.Show("文件沒有保存是否新建文件?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Warning)==DialogResult.Yes)
{
this.richTextBox1.Clear();
this.Text="簡單的編輯器";
this.initLenglt=richTextBox1.TextLength;
}
}
else
{
this.richTextBox1.Clear();
this.Text="簡單的編輯器";
this.initLenglt=richTextBox1.TextLength;
}
}
privatevoid打開OToolStripMenuItem_Click(objectsender,EventArgse)
{
//確定用戶選擇了文件
if(this.openFileDialog.ShowDialog()==DialogResult.OK)
{
//得到用戶選擇的文件路徑和文件名
path=this.openFileDialog.FileName;
//讀取文件內容
this.OpenFile();
}
}
privatevoidOpenFile()
{
try
{
stringextName=this.path.Substring(this.path.LastIndexOf("."));
if(extName.ToLower().Equals(".txt"))
{
//純文本文件
this.richTextBox1.LoadFile(path,RichTextBoxStreamType.PlainText);
}
if(extName.ToLower().Equals(".rtf"))
{
this.richTextBox1.LoadFile(path,RichTextBoxStreamType.RichText);
}
this.Text="文本編輯器"+path;
this.isSaved="y";
}
catch(Exceptionex)
{
MessageBox.Show("請選擇合適文件,打開失敗");
}
}
privatevoid保存SToolStripMenuItem_Click(objectsender,EventArgse)
{
if(string.IsNullOrEmpty(this.path))
{
this.saveFileDialog1.Title="保存為";
if(this.saveFileDialog1.ShowDialog()==DialogResult.OK)
{
this.path=this.saveFileDialog1.FileName;
SaveFile();}
}
else
{
stringextNanme=path.Substring(this.path.LastIndexOf("."));
if(extNanme.ToLower().Equals(".txt"))
{
this.richTextBox1.SaveFile(this.path,RichTextBoxStreamType.PlainText);
}
if(extNanme.ToLower().Equals(".rtf"))
{
this.richTextBox1.SaveFile(this.path,RichTextBoxStreamType.RichText);
}
}
this.initLenglt=richTextBox1.TextLength;
}
privatevoidSaveFile()
{
try
{
if(this.saveFileDialog1.FilterIndex==1)
{
//純文本文件
this.richTextBox1.SaveFile(path,RichTextBoxStreamType.PlainText);
}
if(this.saveFileDialog1.FilterIndex==2)
{
this.richTextBox1.SaveFile(path,RichTextBoxStreamType.RichText);
}
this.Text="文本編輯器"+path;
this.initLenglt=richTextBox1.TextLength;
this.isSaved="y";
}
catch(Exceptionex)
{}}
privatevoid另存為AToolStripMenuItem_Click(objectsender,EventArgse)
{
if(this.saveFileDialog1.ShowDialog()==DialogResult.OK)
{
this.path=this.saveFileDialog1.FileName;
SaveFile();
}
}
privatevoidEditorForm_Load(objectsender,EventArgse)
{
this.剪切TToolStripMenuItem.Enabled=false;
this.復制CToolStripMenuItem.Enabled=false;
if(!string.IsNullOrEmpty(this.path))
{
this.OpenFile();
}
}
privatevoid字體ToolStripMenuItem_Click(objectsender,EventArgse)
{
try
{
stringextName=this.path.Substring(this.path.LastIndexOf("."));
if(extName.ToLower().Equals(".txt"))
{
this.SettxtFont();
}
if(extName.ToLower().Equals(".rtf"))
{
this.SetRichtextFont();
}
}
catch(Exceptionex)
{
}
}
privatevoidSettxtFont()
{
if(this.fontDialog1.ShowDialog()==DialogResult.OK)
{
Fontfont=this.fontDialog1.Font;
this.richTextBox1.Font=font;
}
}
privatevoidSetRichtextFont()
{
if(this.fontDialog1.ShowDialog()==DialogResult.OK)
{
Fontfont=this.fontDialog1.Font;
this.richTextBox1.SelectionFont=font;
}
}
privatevoid字體顏色ToolStripMenuItem_Click(objectsender,EventArgse)
{
stringextName=this.path.Substring(this.path.LastIndexOf("."));
if(extName.ToLower().Equals(".rtf"))
{
if(this.colorDialog1.ShowDialog()==DialogResult.OK)
{
Colorcolor=this.colorDialog1.Color;
this.richTextBox1.SelectionColor=color;
}
}
}
privatevoid剪切TToolStripMenuItem_Click(objectsender,EventArgse)
{
if(richTextBox1.SelectionLength>0)
{
this.richTextBox1.Cut();
}
}
privatevoid粘貼PToolStripMenuItem_Click(objectsender,EventArgse)
{
this.richTextBox1.Paste();
}
privatevoid復制CToolStripMenuItem_Click(objectsender,EventArgse)
{
if(richTextBox1.SelectionLength>0)
{
this.richTextBox1.Copy();
}
}
privatevoidrichTextBox1_SelectionChanged(objectsender,EventArgse)
{
if(richTextBox1.SelectionLength>0)
{
this.剪切TToolStripMenuItem.Enabled=true;
this.復制CToolStripMenuItem.Enabled=true;
}
else
{
this.剪切TToolStripMenuItem.Enabled=false;
this.復制CToolStripMenuItem.Enabled=false;
}
}
privatevoid編輯EToolStripMenuItem_Click(objectsender,EventArgse)
{
}
privatevoid全選AToolStripMenuItem_Click(objectsender,EventArgse)
{
this.richTextBox1.SelectedText.ToString();
}
privatevoid退出XToolStripMenuItem_Click(objectsender,EventArgse)
{
this.Close();
}
privatevoidEditorForm_FormClosing(objectsender,FormClosingEventArgse)
{
if(this.richTextBox1.TextLength>this.initLenglt)
{
if(MessageBox.Show("文件沒有保存是否退出?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Warning)==DialogResult.No)
{
e.Cancel=true;
}
}
}
privatevoid關於AToolStripMenuItem_Click(objectsender,EventArgse)
{
AboutBoxaboutbox=newAboutBox();
aboutbox.ShowDialog();
}
privatevoid撤消UToolStripMenuItem_Click(objectsender,EventArgse)
{
this.richTextBox1.Undo();
}
}
}
④ Microsoft VBScript 編譯器錯誤 錯誤 '800a03ee' 缺少 ')' 怎麼辦
肯定是 加了單引號 或者加多了 雙引號,把左括弧 注釋掉了,檢查下代碼
⑤ 求Desmume5210ex模擬器的下載地址...
新版【NDS模擬器】DeSmuME Ver 5.300 Ex:
http://bbs.tgbus.com/forum.php?mod=viewthread&tid=133968
◎9月15日更新◎
動態編譯進階加速;
◎8月24日更新◎
WiFi聯機臨時取消;
加速編譯代碼回歸;
◎8月21日更新◎
WiFi網路聯機改進;
內核代碼獨家優化;
◎7月12日更新◎
圖像和兼容性改進;
◎7月9日更新◎
畫質改善功能強化;
◎7月8日更新◎
後備存檔功能完善;
◎7月4日更新◎
存檔檢測識別改進;
◎7月3日更新◎
固件模擬代碼優化;
◎7月1日更新◎
話筒模擬功能改進;
◎6月28日更新◎
後備存檔功能回歸;
◎6月27日更新◎
絕贊跨平台的封裝;
◎6月26日更新◎
EX+SP雙內核增強;
◎6月23日更新◎
動態編譯極限加速;
修正過快出錯問題;
音頻同步預設調整;
程序兼容優化改進;
◎6月22日更新◎
口袋BW系列優化;
◎5月30日更新◎
內核代碼清理優化;
◎5月25日更新◎
圖像軟體渲染調整;
◎5月24日更新◎
全局運行速率提升;
程序編譯優化改進;
控制外設檢測改進;
圖像渲染全面優化;
解決各類兼容問題;
……………………………
⑥ 如何在各個版本的VC及64位下使用CPUID指令
一、推薦使用__cpuid、__cpuidex等Intrinsics函數
在32位模式下,我們可以使用內嵌匯編來調用cpuid指令。但在64位模式下,VC編譯器不支持內嵌匯編。
於是微軟提供了Intrinsics函數——編譯器會將Intrinsics函數編譯為對應的機器指令,而且同時支持32位和64位。
例如CPUID指令的對應Intrinsics函數是——
[cpp] view plain
// http://msdn.microsoft.com/en-us/library/hskdteyh.aspx
void __cpuid(
int CPUInfo[4],
int InfoType
);
void __cpuidex(
int CPUInfo[4],
int InfoType,
int ECXValue
);
__cpuidex函數的InfoType參數是CPUID指令的eax參數,即功能ID。ECXValue參數是CPUID指令的ecx參數,即子功能ID。CPUInfo參數用於接收輸出的eax, ebx, ecx, edx這四個寄存器。
早期的CPUID功能只需要一個功能ID參數(eax),這時可以使用__cpuid函數。
後來CPUID的功能越來越強大,一個功能ID參數(eax)參數不夠用,於是加了一個子功能ID(ecx)參數,這時應該採用__cpuidex。
二、用條件編譯判斷VC編譯器對Intrinsics函數的支持性(_MSC_VER)
在__cpuid、__cpuidex等Intrinsics函數時,會遇到以下問題——
1.低版本的VC編譯器沒有intrin.h頭文件。【注】:只有VC2005(或更高)才擁有intrin.h,支持__cpuid。
2.低版本的VC編譯器不支持__cpuidex。【注】:只有VC2008的部分版本及VS2010(或更高)的intrin.h中才有__cpuidex。
這時可以使用條件編譯來判斷VC編譯器的版本。
_MSC_VER是微軟C/C++編譯器——cl.exe編譯代碼時預定義的一個宏,它的值表示cl的版本,它的類型是「int」。例如——
#if _MSC_VER >=1200 // VC++6.0以上
#if _MSC_VER >=1300 // VC2003以上
#if _MSC_VER >=1400 // VC2005以上
#if _MSC_VER >=1500 // VC2008以上
#if _MSC_VER >=1600 // VC2010以上
例如發現_MSC_VER大於等於1400時,我們可以#include <intrin.h>。然後再利用_MSC_VER進一步判斷__cpuid、__cpuidex的支持性。
三、用條件編譯判斷64位模式(_WIN64)
使用_WIN64這個預處理宏可用來判斷目標平台是不是64位。
雖然在編譯x64平台的程序時,編譯器會自動推導出_WIN64。但是Visual Studio的語法高亮不清楚這些,它有可能仍是按32位代碼來做語法高亮。所以,建議還是手動在項目的預處理宏中增加_WIN64。
四、32位下用內嵌匯編實現__cpuidex函數
在32位模式下,我們可以使用內嵌匯編來實現__cpuidex函數。代碼如下——
[cpp] view plain
void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
{
if (NULL==CPUInfo) return;
_asm{
// load. 讀取參數到寄存器
mov edi, CPUInfo; // 准備用edi定址CPUInfo
mov eax, InfoType;
mov ecx, ECXValue;
// CPUID
cpuid;
// save. 將寄存器保存到CPUInfo
mov [edi], eax;
mov [edi+4], ebx;
mov [edi+8], ecx;
mov [edi+12], edx;
}
}
五、全部代碼
全部代碼——
[cpp] view plain
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#if _MSC_VER >=1400 // VC2005才支持intrin.h
#include <intrin.h> // 所有Intrinsics函數
#endif
char szBuf[64];
INT32 dwBuf[4];
#if defined(_WIN64)
// 64位下不支持內聯匯編. 應使用__cpuid、__cpuidex等Intrinsics函數。
#else
#if _MSC_VER < 1600 // VS2010. 據說VC2008 SP1之後才支持__cpuidex
void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
{
if (NULL==CPUInfo) return;
_asm{
// load. 讀取參數到寄存器
mov edi, CPUInfo; // 准備用edi定址CPUInfo
mov eax, InfoType;
mov ecx, ECXValue;
// CPUID
cpuid;
// save. 將寄存器保存到CPUInfo
mov [edi], eax;
mov [edi+4], ebx;
mov [edi+8], ecx;
mov [edi+12], edx;
}
}
#endif // #if _MSC_VER < 1600 // VS2010. 據說VC2008 SP1之後才支持__cpuidex
#if _MSC_VER < 1400 // VC2005才支持__cpuid
void __cpuid(INT32 CPUInfo[4], INT32 InfoType)
{
__cpuidex(CPUInfo, InfoType, 0);
}
#endif // #if _MSC_VER < 1400 // VC2005才支持__cpuid
#endif // #if defined(_WIN64)
// 取得CPU廠商(Vendor)
//
// result: 成功時返回字元串的長度(一般為12)。失敗時返回0。
// pvendor: 接收廠商信息的字元串緩沖區。至少為13位元組。
int cpu_getvendor(char* pvendor)
{
INT32 dwBuf[4];
if (NULL==pvendor) return 0;
// Function 0: Vendor-ID and Largest Standard Function
__cpuid(dwBuf, 0);
// save. 保存到pvendor
*(INT32*)&pvendor[0] = dwBuf[1]; // ebx: 前四個字元
*(INT32*)&pvendor[4] = dwBuf[3]; // edx: 中間四個字元
*(INT32*)&pvendor[8] = dwBuf[2]; // ecx: 最後四個字元
pvendor[12] = '\0';
return 12;
}
// 取得CPU商標(Brand)
//
// result: 成功時返回字元串的長度(一般為48)。失敗時返回0。
// pbrand: 接收商標信息的字元串緩沖區。至少為49位元組。
int cpu_getbrand(char* pbrand)
{
INT32 dwBuf[4];
if (NULL==pbrand) return 0;
// Function 0x80000000: Largest Extended Function Number
__cpuid(dwBuf, 0x80000000);
if (dwBuf[0] < 0x80000004) return 0;
// Function 80000002h,80000003h,80000004h: Processor Brand String
__cpuid((INT32*)&pbrand[0], 0x80000002); // 前16個字元
__cpuid((INT32*)&pbrand[16], 0x80000003); // 中間16個字元
__cpuid((INT32*)&pbrand[32], 0x80000004); // 最後16個字元
pbrand[48] = '\0';
return 48;
}
int _tmain(int argc, _TCHAR* argv[])
{
//__cpuidex(dwBuf, 0,0);
//__cpuid(dwBuf, 0);
//printf("%.8X\t%.8X\t%.8X\t%.8X\n", dwBuf[0],dwBuf[1],dwBuf[2],dwBuf[3]);
cpu_getvendor(szBuf);
printf("CPU Vendor:\t%s\n", szBuf);
cpu_getbrand(szBuf);
printf("CPU Name:\t%s\n", szBuf);
return 0;
}
六、兼容性說明
VC編譯器對32/64位的支持性——
32位:VC6是最早支持編譯32位Intrinsics函數的。
64位:VC2005是最早支持編譯64位Intrinsics函數的。
本文方法在32位編譯器下的兼容性——
__cpuid:兼容VC6(或更高)。
__cpuidex:兼容VC6(或更高)。
本文方法在64位編譯器下的兼容性——
__cpuid:兼容VC2005(或更高)。
__cpuidex:兼容VC2010(或更高)。
⑦ 有以下程序,經編譯鏈接後生成可執行文件ex.exe,若運行時輸入以下帶參數的命令行:ex ab
輸出是
6
實際上就是將第一個參數和第三個參數的長度相加後輸出。
⑧ 先在大公司用的[軟體調試工具]有哪些
LZ好,思創嵌入式開發網(EMBED.8800.ORG) 思創S3C44B0黃金開發板SDT集成開發環境程序開發功略
ARM開發日益流行,大有逐步取代51系列單片機的趨勢,為了更好幫助大家掌握ARM開發的相關集成開發環境,思創嵌入式開發團隊將利用思創S3C44B0黃金開發板為一個具體的開發平台,詳細介紹ARM SDT2.51集成開發環境、IAR集成開發環境、ADS集成開發環境下應用程序開發的具體過程,給眾多嵌入式學習的愛好者提供由淺入深的指導。 同時,我們也希望更多的嵌入式學習愛好者加入我們的行列,寫出更多更好的文檔,為嵌入式系統開發設計在國內的蓬勃發展作出自己的努力! 本文將講述SDT2.51的詳細安裝過程、通過思創S3C44B0黃金開發板提供的LEDTEST示例詳細講述SDT下程序編譯、調試、運行的具體過程,通過這樣一個示例的詳細介紹,力圖達到拋磚引玉的作用,讓剛接觸ARM嵌入式開發的愛好者能夠在短短的1-2個小時內迅速掌握SDT集成開發黃金的基本應用技巧,而後馬上進行相關的項目開發,並在項目開發的過程中不斷解決碰到的問題,當然,思創也很歡迎大家通過思創嵌入式開發論壇(embed.8800.org)不斷將自己的困惑、疑難、學習心得進行交流,這樣,必將極大提高大家的學習效率。 一、 安裝SDT2.51 SDT2.51是ARM公司提供的調試ARM內核CPU的一個功能比較強大的集成開發環境,雖 然現在ARM公司不再升級SDT,而轉向主推ADS集成開發環境,但是,由於ADS集成開發環境需要昂貴的MULTI-ICE硬體模擬調試器與之配合,因此,對於嵌入式設計的個人用戶而言,還是不太現實的一種開發手段。而SDT集成開發環境只需要製作成本低廉的簡易JTAG電纜與之配合,無疑對於個人用戶來說,這是一種理想的開發模式。其實,思創在發展初期,全套的軟體都是利用建議JTAG電纜+SDT實現的。 下面,我們將講述SDT2.51的安裝過程。 點擊SDT安裝目錄下的setup.ext程序,出現如下安裝界面: 思創嵌入式開發網(EMBED.8800.ORG) 1思創嵌入式開發網(EMBED.8800.ORG) 一直點擊NEXT,採用默認的設置,不用任何其他的修改,最後完成安裝。這樣,SDT2.51就安裝在C:\ARM251下了。 二、 啟動SDT2.51 安裝完畢後,點擊開始?程序?ARM SDT 2.51?ARM PROJECT MANAGER啟動SDT項 目管理器: 思創嵌入式開發網(EMBED.8800.ORG) 2思創嵌入式開發網(EMBED.8800.ORG) 將出現如下的窗口: 這樣,就可以開始具體的程序開發過程了。 三、創建工程、添加源文件 SDT採用了流行的項目管理源文件的機制,這種風格對於大多數程序開發者都是比較熟悉的。其基本的流程就是「創建一個PROJECT」?「依次將源文件添加到相應的PROJECT中」。 z 創建一個」LedTest」的PROJECT 在SDT2.51集成開發環境中,選取菜單「FILE?NEW?PROJECT」,將出現下圖: 幾個參數填寫如下: TYPE: ARM EXECUTABLE IMAGE PROJECT NAME: LedTest PROJECT DIRECTORY: D:\TEST\LED_Test 然後一直選擇OK,就可以出現一個沒有任何源文件的項目了,該項目有3種源代碼的發布 思創嵌入式開發網(EMBED.8800.ORG) 3思創嵌入式開發網(EMBED.8800.ORG) 方式:Debug、DebugRel、Release。我們一般都使用Debug。 z 編寫和添加源文件到項目中 由於SDT2.51的程序編輯器不是很好用,一般建議大家用UltraEdit編寫源代碼,然後將源 文件添加到項目中。這也是SDT2.51一直一來被人詬病的一個方面。為了我們那些可憐的銀子,也只有暫時遷就SDT了^_^ 下面我們將以思創光碟上提供的LED_EXAMPLE目錄下LED跑馬燈的程序為例,講述添加文件和編譯的過程。 首先將LED_EXMAPLE目錄下的*.C / *.h文件以及INC目錄(存放一些頭文件)拷貝到D:\TEST\LED_TEST目錄下,然後在SDT項目管理器中打開D:\TEST\LED_TEST.APJ項目,點擊Arm Executable Image目錄樹中的Debug欄目,將出現下圖: 然後,點擊選中SOURCE,選擇菜單「PROJECT? ADD FILES TO SOURCES」,依次選擇當前目錄中的C文件和S文件,這樣,就將源文件全部加入到了項目中。 四、編譯和鏈接程序 在進行下一步的編譯之前,需要著重提到鏈接過程的幾個參數的設置。選擇菜單「project?Tool Configuration for "Debug"?armlink?Set」,將出現下圖: 思創嵌入式開發網(EMBED.8800.ORG) 4思創嵌入式開發網(EMBED.8800.ORG) z 確保General標簽頁中的Search Path for Libraries的路徑是C:\ARM251\LIB,保證程序鏈接過程中能夠在正確的路徑下找到需要的庫文件。 z 確保在「ENTRY AND BASE」標前頁中的BASE OF IMAGE的設置為: Read-only :0XC1000000 Read-Write:0XC5000000 這樣設置的原因是:思創黃金開發板上SYSTEM SDRAM佔用的地址空間是0x0C000000-0x0C7FFFFF,具體可以參看《思創S3C44B0黃金開發板資源列表》一文。這樣,在調試過程中,SDT的調試數據和命令將通過JTAG電纜下載到開發板上的SYSTEM SDRAM中,進行程序的運行和DEBUG過程。當然,也可以將READ-ONLY的地址設置到FLASH中,即0X00000000。一般我們建議直接在SDRAM中直接運行程序。 思創嵌入式開發網(EMBED.8800.ORG) 5思創嵌入式開發網(EMBED.8800.ORG) 做好這些准備工作後,就可以正式開始程序的編譯和鏈接過程了。首先在ROM窗口中,選中DEBUG,然後選擇菜單「PROJECT?FORCE BUILD LEDTEST.APJ DEBUG」,SDT開始編譯和鏈接過程,將出現下圖: 可以看到編譯和鏈接沒有錯誤,一個WARNING可以忽略。 五、調試程序 通過前面的介紹,相信大家對SDT下如何創建和編譯、鏈接自己的項目有了很好的了解,接下來,重點將放在如何利用思創提供的WIGGLER JTAG電纜進行SDT下程序的調試過程。 首先,選擇菜單「Project?Debug LEDTEST.APJ DEBUG」,將出現下圖ARM DEBUGGER窗口: 思創嵌入式開發網(EMBED.8800.ORG) 6思創嵌入式開發網(EMBED.8800.ORG) SDT提供兩種放置模式:ARMULATER和ARM REMOTE,後者是真實地利用實際硬體進行ARM 調試過程,前者提供了一種軟體模擬ARM調試過程。為了進行真正地ARM硬體模擬,還需要進行一些設置。 在ARM DEBUGGER窗口中,選擇菜單「OPTIONS?CONFIGURE DEBUGGER」,出現下圖: 在TARGET ENVIRONMENT選項中選擇REMOTE A,然後點擊下邊的CONFIGURE按鈕,出現下圖: 思創嵌入式開發網(EMBED.8800.ORG) 7思創嵌入式開發網(EMBED.8800.ORG) 在HEARBEAT前面打勾,並且在ETHERNET後面輸入127.0.0.1表示本機的IP。之所以要 在此設置網路的地址,我們在《嵌入式系統軟體開發指南——移植uClinux到思創S3C44B0黃金開發板》一文的第一節有一詳細的闡述。 在做好這些設置後,就可以開始進行目標碼的轉載了,下圖比較清晰地描述了目標碼地下載機制,其實這也是各種調試器進行調試的一般機制。 在上位機後台運行的JTAG.EXE程序將SDT2.51各種調試數據和命令的網路數據包轉換成符合JTAG標準的計算機並口信號,並通過WIGGLER JTAG電纜下載到思創黃金開發板上。 思創嵌入式開發網(EMBED.8800.ORG) 8思創嵌入式開發網(EMBED.8800.ORG) 具體操作步驟如下: 1. 在上位機的JTAG(即將思創光碟的JTAG目錄拷貝到用戶具體的目錄)目錄下,在DOS SHELL直接敲入JTAG命令,將出現如圖結果: 表明ARM JTAG已經在運行,等待SDT2.51發送各種調試數據。需要提醒的是:思創提供的JTAG.BAT文件是針對WIN2000的上位機開發環境,如果是WIN98的開發環境,需要修改JTAB.BAT文件,將ALLOWIO 0X378去掉。關於這一問題的具體原理請參見《嵌入式系統軟體開發指南——移植uClinux到思創S3C44B0黃金開發板》一文的第一節。 2. 選擇菜單「FILE?LOAD IMAGE」,出現下圖: 選擇LEDTEST.AXF,SDT2.51將開始下載過程,如圖: 思創嵌入式開發網(EMBED.8800.ORG) 9思創嵌入式開發網(EMBED.8800.ORG) 這個過程將進行幾分鍾,具體時間視AXF文件大小而定。最後程序將停在ASM代碼的入口處。如圖: 現在就可以開始進行模擬了! 選擇菜單「EXECUTE」,就可以看到各種DEBUG命令以及相關的快捷鍵,如按F8就可以開始單步模擬,F5就可以開始全速模擬。 呵呵,這時我們不妨按F5,觀察開發板上LED,就可以發現LED的跑馬燈程序運行起來了。 將游標停留在44BINIT.S匯編文件的369行,如下圖: 思創嵌入式開發網(EMBED.8800.ORG) 10思創嵌入式開發網(EMBED.8800.ORG) 這是MAIN.C程序的入口地址,選擇菜單「EXECUTION?RUN TO CURSOR」,然後按F8單步執行,程序將跳轉到MAIN.C程序,如圖: 思創嵌入式開發網(EMBED.8800.ORG) 11思創嵌入式開發網(EMBED.8800.ORG) 這時,可以開始採用SDT提供的各種調試技巧,如設置斷點、全速運行、觀察變數、觀察寄存器、觀察存儲器空間等等。具體可以參見SDT提供的一些文檔,不再贅述。如果有用戶感興趣,不妨作一些工作,將各種具體的調試技巧一一介紹給大家。 最後,值得提醒大家的一點就是不妨在單步操作的時候觀察上位機JTAG窗口的變化情況,如圖: 大家可以清楚看到SDT不斷向JTAG電纜發出各種操作數據和命令。 小結 ARM開發在如火如荼地進行著,對於思創而言,拿一句流行地話來說,就是「將ARM開發進行到底」,思創將一如既往地恪守在嵌入式開發領域,不斷研發和銷售優秀的嵌入式開發板和各種工具,同時不斷完善各種相關的技術文檔。 最後,再次申明,我們是站在前輩們的基礎上不斷前行,在此,向所有為嵌入式開發提供各種研發工具和資源的前輩們表示敬意。 本文的目錄結構參看了龔俊先生的《ARM開發軟體使用教程》,在此表示謝意! 思創嵌入式開發網(EMBED.8800.ORG)
1.1 ARM SDT 2.5開發環境簡介
一、實驗目的
熟悉ARM SDT 2.5開發環境,學會ARM並行口模擬器的使用。使用SDT編譯、下載、調試並跟蹤一段已有的程序,了解嵌入式開發的基本思想和過程。
二、實驗內容
本次實驗使用ARM SDT 2.5集成開發環境。新建一個簡單的工程文件,並編譯這個工程文件。學習ARM並行口模擬器的使用和開發環境的設置。下載已經編譯好的文件到嵌入式控制器中運行。學會在程序中設置斷點,觀察系統內存和變數,為調試應用程序打下基礎。
三、預備知識
C語言的基礎知識、程序調試的基礎知識和方法。
四、實驗設備及工具(包括軟體調試工具)
硬體:ARM嵌入式開發平台、用於ARM7TDMI的JTAG模擬器、Pentium100以上PC機。
軟體:PC機操作系統Windows 98、Windows 2000或Windows XP,ARM SDT 2.51或ADS 1.2集成開發環境,模擬器驅動程序、超級終端通信程序。
五、實驗步驟
1.建立工程文件
(1)運行ARM SDT 2.5集成開發環境(ARM Project Manager)。選擇File|New命令,在對話框中選擇Project選項卡,單擊「確定」按鈕後彈出New Project對話框,如圖1-1所示,Type為工程模板類型,這里選擇ARM Executable Image,然後輸入工程名和所在路徑。單擊OK按鈕後新建一個工程文件。
(2)在新建的工程中,如圖1-2所示,選中工程樹的「根部」。使用命令Project|Tool Configuration for work1.apj|<asm> = armasm|Set,對整個工程的匯編進行設置。
圖1-1 新建一個工程文件 圖1-2 對整個工程的匯編進行設置
(3)因為開發板上的嵌入式處理器ARM7TDMI沒有浮點處理器,所以,如圖1-3所示,在彈出的對話框中設置Floating Point Processor為none,並保持其他的設置不變。
(4)選中工程樹的「根部」,通過Project|Tool Configuration for work1.apj|asmlink|Set命令,對整個工程的連接方式進行設置。
(5)在彈出的對話框中,打開Entry and Base選項卡,如圖1-4所示,設置連接的Read-Only(只讀)和Read-Write(讀寫)地址。地址0x0c080000是開發板上SDRAM的真實地址,是由系統的硬體決定的;0x0c200000指的是系統可讀寫的內存地址。也就是說,在0x0c080000~0x0c1fffff之間是只讀區域,存放程序的代碼段,從0x0c200000開始是程序的數據段。
圖1-3 設置Floating Point Processor為none 圖1-4 設置連接的地址
提示:用戶可以修改這兩個數值來決定程序存儲區的大小和數據存儲區的大小。但應注意SDRAM為8MB,地址范圍為0x0c000000~0x0c7fffff。其中0x0c080000之前的空間是留給LCD顯示緩存區的。
(6)打開Linker Configuration對話框中的ImageLayout選項卡,如圖1-5所示,設置程序的入口模塊。指定在生成的代碼中,程序是從44binit.s開始運行的,這里填寫44binit.s對應的目標文件44binit.o,Init是該匯編文件中的代碼段名字。
(7)選擇Project|Edit Project Template命令,系統彈出Project Template Editor對話框。在該對話框中可以看到一系列步驟名稱。SDT在處理工程文件時是按這些步驟完成的,每個步驟設定了對應的操作,以及該操作的輸入、輸出和命令行等。讀者可以選擇已有的步驟,單擊Edit按鈕打開該步驟設置對話框,觀察每個步驟所實現的功能。例如:步驟Compile是把.c和.h文件編譯成.o文件的,而步驟Link則就是把.o文件和 .alf文件連接生成.axf文件的。在這些步驟中的設置建議保留默認值。但這里缺少一個從.axf文件生成所需的.bin文件的步驟,所以使用New按鈕,為編譯器新建一個步驟,如圖1-6所示,取名為RomImage。
圖1-5 設置程序的入口模塊 圖1-6 為編譯器新建一個步驟
(8)按照如圖1-7的內容設置步驟RomImage的內容。使編譯器編譯的時候可以生成system.bin文件,這就是系統的可執行文件。可以看出該操作的輸入是當前工程的.axf文件,所在位置是Image,輸出是system.bin,位置在Eprom,操作由fromelf組件完成,命令行是fromelf -nozeropad <$projectname>.axf -bin system.bin。這里的Image和Eprom可以在設置好後的工程窗口中看到。步驟名稱和輸出位置名稱並不要求一致。
提示:在文本框中輸入文字後必須單擊Add按鈕添加到上方列表框中,否則單擊OK按鈕後該設置信息丟失。
(9)選擇Project|Edit Variables for work1.apj命令,系統彈出Edit Variables for work1.apj對話框。列表框中是該工程的一些變數,讀者也可以選擇某個變數名,在Value文本框中可以看到其值。$ProjectName變數設置的是工程名,可以和工程文件的文件名不一致,Image下的.axf文件將以此命名。這里注意一下變數config$armlink的值,應該是-info.total#total -ro-base#0xc080000 -rw-base#0xc200000 -first#44binit.o(init),和前面對armlink的設置一致。而變數config$asm的值是-fpu#none。這里需要將build_target變數的值設為system.bin,編譯器在生成此文件後步驟執行完畢,如圖1-8所示。
提示:選擇某個變數並更改其值後,必須單擊Apply按鈕使其生效,如果更改完畢後又選擇其他變數,則該設置將無效。
圖1-7 設置RomImage的內容 圖1-8 設置build_target變數
(10)選中工程樹中的DebugRel子樹,按Delete鍵刪除。
提示:在系統工程樹中Debug子樹是應用程序的調試版本,在生成的目標代碼中,包含了系統的調試信息。Release子樹是應用程序的發行版本,生成的代碼中不包括調試信息,而且編譯器還針對速度和代碼的大小進行優化。DebugRel子樹是一個折衷版本,通常用不到,所以,在這里刪除。
(11)回到Project Template Editor對話框中,單擊Edit Detail按鈕,在彈出的對話框中可以重新命名模板,如圖1-9所示。重新命名模板後可以保存該工程,並把該空工程(還沒有添加工程文件)復制到SDT安裝路徑下的Template目錄下,下次新建工程時可以在New Project對話框中的Type列表框中看到該模板,使用該模板無需重新設置工程參數。
(12)至此,工程文件設置完畢。包括對armlink和armasm的參數設置,新建生成system.bin文件的編譯步驟和對應變數。建議將該設置後的工程文件作為模板保存,以方便日後使用。同時注意上文關於操作的提示,以前多數用戶建立模板失敗的原因可能就在於操作上的失誤。
(13)把光碟中SDT實驗所在目錄中的「1-開發環境實驗」下的STARTUP目錄復制到工程路徑下。如圖1-10所示,選中工程樹中Debug子樹的Sources選項。通過Project|Add Files to Sources命令,把STARTUP目錄下的*.S和*.c文件加入到工程中。
圖1-9 重新命名模板 圖1-10 加入工程的源文件
(14)選中工程樹中Debug子樹的IncludedFiles選項。通過Project|Add Files to IncludedFiles命令,把STARTUP目錄下的所有*.h文件都加入工程中。
(15)在需要用到庫文件的工程中,選中工程樹中Debug子樹的Libraries選項。通過Project|Add Files to Libraries命令,把*.ALF庫文件加入工程中。
(16)雙擊工程樹中Debug子樹的Sources選項中的main.c,打開main.c文件。下面是Main()函數中的內容,程序向LCD和串口輸出字元串「Hello world!」。
int Main(int argc, char **argv)
{
ARMTargetInit();
LCD_Init();
LCD_ChangeMode(DspTxtMode); //轉換LCD顯示模式為文本顯示模式
LCD_Cls(); //文本模式下清屏命令
LCD_printf("Hello world!\n"); //向液晶屏輸出
Uart_Printf("\nHello world!\n"); //向串口輸出
while(1);
}
讀者可以分別打開其他的源文件,了解該系統運行的基本知識。這個程序沒有用到操作系統,只是簡單地說明工程的開發過程,帶有操作系統的實驗將在「μC/OS-II在ARM處理器上的移植及編譯」實驗之後出現。
2.進行程序的在線模擬、調試
(1)回到ARM Project Manager對話框,選中工程樹中的Debug子樹,通過Project |
Build work1.apj「Debug」命令(或者工具欄中的相應按鈕)編譯整個工程。
(2)把ARM的JTAG模擬器連接到PC機的並行口和開發板上,打開開發板的電源,運行模擬器的驅動程序UarmJTAG.exe。
(3)使用Project|Debug work1.apj「Debug」命令(或者工具欄中的相應按鈕)啟動ARM Debugger軟體調試程序。
(4)在ARM Debugger中,通過Options|Configure Debugger命令設置模擬器。如 圖1-11所示,在彈出的對話框中,設置Target Environment為Remote_A。
(5)單擊Configure按鈕,按照如圖1-12所示,設置模擬器。
圖1-11 設置模擬器 圖1-12 設置模擬器
(6)出現下面的提示信息以後,單擊「是」按鈕,ARM Debugger開始通過模擬器裝載程序,如圖1-13所示。
圖1-13 裝載程序
注意:第(4)、(5)步設置好後,以後再調試的時候直接進行到第(6)步,不需要再設置。當不能進行第(6)步時,重復第(4)和第(5)步。
(7)裝載完畢以後,通過Execute|Go命令(或者工具欄中的相應按鈕)運行程序。
(8)當程序運行時,可以使用Execute|Stop命令(或者工具欄中的相應按鈕)暫停程序的運行。如圖1-14所示,在Execute窗口中將顯示出程序暫停的位置。
圖1-14 顯示程序暫停的位置
(9)通過Execute|Step命令(或者工具欄中的相應按鈕)可以單步運行程序。也可以使用Step In、Step Out命令進入或者跳出函數的調用。
(10)在程序停止運行的時候,選擇View|Source Files命令,可以打開如圖1-15所示的源程序列表窗口,雙擊列表中的文件名可以查看相應的源文件。
注意:查看源文件時,有時可能會出現看不到自己的源文件的情況,這時要將工程重新強制編譯一下。
(11)在源文件列表中打開main.c文件。選擇源文件中的某一行,單擊滑鼠右鍵,如圖1-16所示,用Toggle Breakpoint命令可以設置斷點,使程序運行到這里停下來。
(12)使用在View菜單下的Registers、Variables和Memory命令可以查看工作寄存器或者內存變數。讀者可以逐一地嘗試,為以後調試程序打下基礎。
圖1-15 查看源文件 圖1-16 設置斷點 7025希望對你有幫助!
⑨ Linux嵌入式交叉編譯工具鏈問題 淺談
簡介
交叉編譯工具鏈是一個由編譯器、連接器和解釋器組成的綜合開發環境,交叉編譯工具鏈主要由binutils、gcc和glibc 3個部分組成。有時出於減小libc庫大小的考慮,也可以用別的c庫來代替glibc,例如uClibc、dietlibc和newlib。交叉編譯工具鏈主要包括針對目標系統的編譯器gcc、目標系統的二進制工具binutils、目標系統的標准c庫glibc和目標系統的Linux內核頭文件。第一個步驟就是確定目標平台。每個目標平台都有一個明確的格式,這些信息用於在構建過程中識別要使用的不同工具的正確版本。因此,當在一個特定目標機下運行GCC時,GCC便在目錄路徑中查找包含該目標規范的應用程序路徑。GNU的目標規范格式為CPU-PLATFORM-OS。例如,建立基於ARM平台的交叉工具鏈,目標平台名為arm-linux-gnu。
交叉編譯工具鏈的製作方法
分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。
通過Crosstool腳本工具來實現一次編譯生成交叉編譯工具鏈。
直接通過網上(ftp.arm.kernel.org.uk)下載已經製作好的交叉編譯工具鏈。
方法1相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法2或方法3構建交叉工具鏈。方法3的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名的錯誤,建議你慎用此方法。
方法1:分步構建交叉編譯工具鏈
下載所需的源代碼包
建立工作目錄
建立環境變數
編譯、安裝Binutils
獲取內核頭文件
編譯gcc的輔助編譯器
編譯生成glibc庫
編譯生成完整的gcc
由於在問答中的篇幅,我不能細述具體的步驟,興趣的同學請自行閱讀開源共創協議的《Linux from scratch》,網址是:linuxfromscratch dot org
。
方法2:用Crosstool工具構建交叉工具鏈(推薦)
Crosstool是一組腳本工具集,可構建和測試不同版本的gcc和glibc,用於那些支持glibc的體系結構。它也是一個開源項目,下載地址是kegel dot com/crosstool。用Crosstool構建交叉工具鏈要比上述的分步編譯容易得多,並且也方便許多,對於僅僅為了工作需要構建交叉編譯工具鏈的你,建議使用此方法。
運行which makeinfo,如果不能找見該命令,在解壓texinfo-4.11.tar.bz2,進入texinfo-4.11目錄,執行./configure&&make&&make install完成makeinfo工具的安裝
准備文件:
下載所需資源文件linux-2.4.20.tar.gz、binutils-2.19.tar.bz2、gcc-3.3.6.tar.gz、glibc- 2.3.2.tar.gz、glibc-linuxthreads-2.3.2.tar.gz和gdb-6.5.tar.bz2。然後將這些工具包文件放在新建的$HOME/downloads目錄下,最後在$HOME/目錄下解壓crosstool-0.43.tar.gz,命
令如下:
#cd$HOME/
#tar–xvzfcrosstool-0.43.tar.gz
建立腳本文件
接著需要建立自己的編譯腳本,起名為arm.sh,為了簡化編寫arm.sh,尋找一個最接近的腳本文件demo-arm.sh作為模板,然後將該腳本的內容復制到arm.sh,修改arm.sh腳本,具體操作如下:
# cd crosstool-0.43
# cp demo-arm.sh arm.sh
# vi arm.sh
修改後的arm.sh腳本內容如下:
#!/bin/sh
set-ex
TARBALLS_DIR=$HOME/downloads#定義工具鏈源碼所存放位置。
RESULT_TOP=$HOME/arm-bin#定義工具鏈的安裝目錄
exportTARBALLS_DIRRESULT_TOP
GCC_LANGUAGES="c,c++"#定義支持C,C++語言
exportGCC_LANGUAGES
#創建/opt/crosstool目錄
mkdir-p$RESULT_TOP
#編譯工具鏈,該過程需要數小時完成。
eval'catarm.datgcc-3.3.6-glibc-2.3.2.dat'shall.sh--notest
echoDone.
建立配置文件
在arm.sh腳本文件中需要注意arm-xscale.dat和gcc-3.3.6-glibc-2.3.2.dat兩個文件,這兩個文件是作為Crosstool的編譯的配置文件。其中arm.dat文件內容如下,主要用於定義配置文件、定義生成編譯工具鏈的名稱以及定義編譯選項等。
KERNELCONFIG='pwd'/arm.config#內核的配置
TARGET=arm-linux#編譯生成的工具鏈名稱
TARGET_CFLAGS="-O"#編譯選項
gcc-3.3.6-glibc-2.3.2.dat文件內容如下,該文件主要定義編譯過程中所需要的庫以及它定義的版本,如果在編譯過程中發現有些庫不存在時,Crosstool會自動在相關網站上下載,該工具在這點上相對比較智能,也非常有用。
BINUTILS_DIR=binutils-2.19
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.10-8(根據實際情況填寫)
GDB_DIR=gdb-6.5
執行腳本
將Crosstool的腳本文件和配置文件准備好之後,開始執行arm.sh腳本來編譯交叉編譯工具。具體執行命令如下:
#cdcrosstool-0.43
#./arm.sh
經過數小時的漫長編譯之後,會在/opt/crosstool目錄下生成新的交叉編譯工具,其中包括以下內容:
arm-linux-addr2linearm-linux-g++arm-linux-ldarm-linux-size
arm-linux-ararm-linux-gccarm-linux-nmarm-linux-strings
arm-linux-asarm-linux-gcc-3.3.6arm-linux-objarm-linux-strip
arm-linux-c++arm-linux-gccbugarm-linux-objmpfix-embedded-paths
arm-linux-c++filtarm-linux-gcovarm-linux-ranlib
arm-linux-cpparm-linux-gprofarm-linux-readelf
添加環境變數
然後將生成的編譯工具鏈路徑添加到環境變數PATH上去,添加的方法是在系統/etc/ bashrc文件的最後添加下面一行,在bashrc文件中添加環境變數
export PATH=/home/jiabing/gcc-3.3.6-glibc-2.3.2/arm-linux-bin/bin:$PATH
至此,arm-linux下的交叉編譯工具鏈已經完成,現在就可以使用arm-linux-gcc來生成試驗箱上的程序了!
⑩ excplise 中的 jar包 是靜態庫還是動態庫
都可能有,你看是這個程序需不需要引用了,靜態庫和動態庫都是閉源庫,只能拿來滿足某個功能的使用,不會暴露內部具體的代碼信息,而從github上下載的第三方庫大多是開源庫。
1、靜態庫(.lib)
函數和數據被編譯進一個二進制文件(通常擴展名為.LIB)。在使用靜態庫的情況下,在編譯鏈接可執行文件時,鏈接器從庫中復制這些函數和數據並把它們和應用程序的其他模塊組合起來創建最終的可執行文件(.EXE文件)。當發布產品時,只需要發布這個可執行文件,並不需要發布被使用的靜態庫。
2、動態庫(.lib文件和.dll文件)
在使用動態庫的時候,往往提供兩個文件:一個引入庫(.lib)文件(也稱「導入庫文件」)和一個DLL(.dll)文件。雖然引入庫的後綴名也是「lib」,但是,動態庫的引入庫文件和靜態庫文件有著本質的區別,對一個DLL文件來說,其引入庫文件(.lib)包含該DLL導出的函數和變數的符號名,而.dll文件包含該DLL實際的函數和數據。在使用動態庫的情況下,在編譯鏈接可執行文件時,只需要鏈接該DLL的引入庫文件,該DLL中的函數代碼和數據並不可復制到可執行文件,直到可執行程序運行時,才去載入所需的DLL,將該DLL映射到進程的地址空間中,然後訪問DLL中導出的函數。這時,在發布產品時,除了發布可執行文件以外,同時還需要發布該程序將要調用的動態鏈接庫。