編譯器實驗報告
Ⅰ c語言實驗報告心得
c語言實驗心得:
1、只有頻繁用到或對運算速度要求很高的變數才放到data區內,如for循環中的計數值。
2、其他不頻繁調用到和對運算速度要求不高的變數都放到xdata區。
3、常量放到code區,如字型檔、修正系數。
4、邏輯標志變數可以定義到bdata中。
在51系列晶元中有16個位元組位定址區bdata,其中可以定義8*16=128個邏輯變數。這樣可以大大降低內存佔用空間。定義方法是: bdata bit LedState;但位類型不能用在數組和結構體中。
5、data區內最好放局部變數。
因為局部變數的空間是可以覆蓋的(某個函數的局部變數空間在退出該函數是就釋放,由別的函數的局部變數覆蓋),可以提高內存利用率。當然靜態局部變數除外,其內存使用方式與全局變數相同;
6、確保程序中沒有未調用的函數。
在Keil C里遇到未調用函數,編譯器就將其認為可能是中斷函數。函數里用的局部變數的空間是不釋放,也就是同全局變數一樣處理。這一點Keil做得很愚蠢,但也沒辦法。
7、如果想節省data空間就必須用large模式。
將未定義內存位置的變數全放到xdata區。當然最好對所有變數都要指定內存類型。
8、使用指針時,要指定指針指向的內存類型。
在C51中未定義指向內存類型的通用指針佔用3個位元組;而指定指向data區的指針只佔1個位元組;指定指向xdata區的指針佔2個位元組。如指針p是指向data區,則應定義為: char data *p;。還可指定指針本身的存放內存類型,如:char data * xdata p;。其含義是指針p指向data區變數,而其本身存放在xdata區。
以前沒搞過C51,大學時代跟單片機老師的時候也是搗鼓下匯編,現在重新搞單片機,因為手頭資料不多,找到一些C51的程序,發現裡面有這些關鍵字,不甚明了,沒辦法只好找了下,發現如下描述:
從數據存儲類型來說,8051系列有片內、片外程序存儲器,片內、片外數據存儲器,片內程序存儲器還分直接定址區和間接定址類型,分別對應code、data、xdata、idata以及根據51系列特點而設定的pdata類型,使用不同的存儲器,將使程序執行效率不同,在編寫C51程序時,最好指定變數的存儲類型,這樣將有利於提高程序執行效率(此問題將在後面專門講述)。與ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各種不同的模式對應不同的實際硬體系統,也將有不同的編譯結果。
在51系列中data,idata,xdata,pdata的區別
data:固定指前面0x00-0x7f的128個RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。
idata:固定指前面0x00-0xff的256個RAM,其中前128和data的128完全相同,只是因為訪問的方式不同。idata是用類似C中的指針方式訪問的。匯編中的語句為:mox ACC,@Rx.(不重要的補充:c中idata做指針式的訪問效果很好)
xdata:外部擴展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。
pdata:外部擴展RAM的低256個位元組,地址出現在A0-A7的上時讀寫,用movx ACC,@Rx讀寫。這個比較特殊,而且C51好象有對此BUG,建議少用。但也有他的優點,具體用法屬於中級問題,這里不提。
三、有關單片機ALE引腳的問題
"單片機不訪問外部鎖存器時ALE端有正脈沖信號輸出,此頻率約為時鍾振盪頻率的1/6.每當訪問
外部數據存儲器是,在兩個機器周期中ALE只出現一次,即丟失一個ALE脈沖."這句話是不是有毛
病.我覺得按這種說法,應該丟失3個ALE脈沖才對,我一直想不通是怎麼回事,希望大蝦們幫幫我.
小弟感激涕零.
答:
其他所有指令每6個機器周期發出一個ALE,而MOVX指令佔用12個機器周期只發出一個ALE
四、如何將一個INT型數據轉換成2個CHAR型數據?
經keil優化後,char1=int1/256,char2=int1%256或char1=int1>>8,char2=int1&0x00ff效率是一樣的。
五、在KEIL C51上模擬完了,怎樣生成HEX文件去燒寫??
右鍵點項目中Target 1,選第二個,在OUTPUT中選中CREAT HEX
六、typedef 和 #define 有何不同??
typedef 和 #define 有何不同》》》 如
typedef unsigned char UCHAR ;
#define unsigned char UCHAR ;
typedef命名一個新的數據類型,但實際上這個新的數據類型是已經存在的,只不過是定義了
一個新的名字.
#define只是一個標號的定義.
你舉的例子兩者沒有區別,但是#define還可以這樣用
#define MAX 100
#define FUN(x) 100-(x)
#define LABEL
等等,這些情況下是不能用typedef定義的
七、請問如何設定KELC51的模擬工作頻(時鍾)
用右鍵點擊左邊的的target 1,然後在xtal一欄輸入
八、不同模塊怎樣共享sbit變數,extern不行?
把SBIT定義單獨放到一個.H中,每個模塊都包含這個.h文件
九、C51中對於Px.x的訪問必須自己定義嗎?
是的。
如sbit P17 = 0x97;即可定義對P1.7的訪問
十、SWITCH( )語句中表達式不可以是位變數對嗎?
可以用位變數:
#include
#include
void main()
{
bit flag;
flag=0;
switch(flag)
{
case '0':{printf("0\n");break;}
case '1':{printf("1\n");break;}
default:break;
}
}
bit 變數只有兩種狀態,if 語句足夠啦,!!!
十一、const常數聲明占不佔內存???
const 只是用來定義「常量」,所佔用空間與你的定義有關,如:
const code cstStr[] = {"abc"};
佔用代碼空間;而如:
const char data cstStr[] = {"abc"};
當然佔用內存空間。
另外,#define 之定義似乎不佔用空間。
十二、philips的單片機P89C51RD+的擴展RAM在C51中如何使用?
試一試將auxr.1清0,然後在c語言中直接聲明xdata類型的變數
十三、BUG of Keil C51
程序中用如下語句:
const unsigned char strArr[] = {"數學"};
結果發現strArr[] 內容為 {0xCA,0xD1,0xA7},真奇怪!
凡是有0xfd,則會通通不見了,所以只能手工輸入內碼了,例如 uchar strArr[]=
{0xCA,0xfd,0xd1,0xa7}(用Ultraedit會很方便)。
十四、Keil C51中如何實現代碼優化?
菜單Project下Option for target "Simulator"的C51.
看到Code optimization了嗎?
十五、請教c的!和 ~ 符號有甚區別??
!是邏輯取反,~是按位取反。
十六、c51編程,讀埠,還要不要先輸出1?
我怎麼看到有的要,有的不要,請高手給講講,到底咋回事?謝了
要輸出1的,除非你能保證之前已經是1,而中間沒有輸出過其他值。
十七、當定時器1(T1)用於產生波特率時,P3^5還是否可以用作正常的I/O口呢?
p3.5完全可以當普通的io使用
十八、C51中 INT 轉換為 2個CHAR?
各位高手:
C51中 INT 轉換為 CHAR 如何轉換諸如:
X = LOW(Z);
Y = HIGH(Z);
答:
x=(char)z;
y=(char)(z>>8);
十九、如果我想使2EH的第7位置1的話,用位操作可以嗎?
現在對位操作指令我一些不太明白請各位多多指教:
如 SETB 07H 表示的是20H.7置1,對嗎?(我在一本書上是這么看到的)
那麼如果我想使2EH的第7位置1的話,象我舉的這個例子怎麼表示呢?謝謝!
SETB 77H
setb (2eh-20h)*8+7
20h-2fh每位元組有8個可位操作(00h-7fh),其它RAM不可位直接操作
二十、char *addr=0xc000 和char xdata *addr=0xc000有何區別?
char *addr=0xc000;
char xdata *addr=0xc000;
除了在內存中佔用的位元組不同外,還有別的區別嗎?
char *addr=0xc000; 是通用定義,指針變數 addr 可指向任何內存空間的值;
char xdata *addr=0xc000; 指定該指針變數只能指向 xdata 中的值;
後一種定義中該指針變數(addr)將少佔用一個存儲位元組。
uchar xdata *addr=0xc000;指針指向外ram;
如果:data uchar xdata *addr=0xc000;指針指向外ram但指針本身存在於內ram(data)
中
以此類推可以idata uchar xdata *addr=0xc000;pdata uchar xdata *addr=0xc000;
data uchar idata *addr=0xa0;.........
二十一、while(p1_0)的執行時間?
假設,P1_0為單片機P1口的第一腳,請問,
while(P1_0)
{
P1_0=0;
}
while(!P1_0)
{
P1_0=1;
}
以上代碼,在KEIL C中,需要多長時間,執行完。能具體說明while(P1_0)的執行時間嗎?
模擬運行看看就知道了,
我模擬了試了一下,約14個周期
二十二、怎樣編寫C51的watchdog程序?
各位大蝦,我用KEIL C51 編寫了一個帶外部開門狗的程序,可程序無法運行起來,經過查
找,發現程序在經過C51編譯後,在MAIN()函數的前部增加了一端初始化程序,等到進入
主程序設置開門狗時,開門狗已經時間到,將我的程序復位了,請問我怎樣才能修改這一端
初始花程序,使他一運行,就設置開門狗?
可以在startup.a51中加入看門狗刷新指令,當然用匯編,然後重新編譯startup.a51
,將他和你的程序連接即可。新的startup.a51會自動代替系統默認的啟動模塊。
二十三、keil C51 怎樣把修改的startup.a51 加到工程文件中
直接加入即可
注意不要改動?STACK,?C_START,?C_STARTUP等符號。startup.a51直接加入項目,不用修改也可。可在內面自己修改匯編的一些限制或堆棧指針。
二十四、關於波特率的設置
我在設定串口波特率時發現一個問題:在晶體震盪器為11.0592MHz時,若設9600BPS的話,
TH1=0XFD,TL1=0XFD,而要設19200BPS的話,TH1、TL1有否變化,如果沒變,為什麼?
如果變了,又為什麼?(因為我看書上倆個是一樣的),希望大家點撥。
答:
當電源控制寄存器(PCON)第BIT7(SMOD)為1時波特率加倍。
TH1和TL1的值不變.
二十五、如何在C中聲明保留這部分RAM區不被C使用?
我不知道在C源程序中怎麼控制這個,但在匯編程序中加入下面一段就行:
DSEG AT 20H
AA: DS 10
這樣C51就不會佔用20H--29H了
或者在c51里這樣定義:
uchar data asm_buff[10] _at_ 0x20;
二十六、問浮點運算問題
我在用C51時發現它對傳遞浮點參數的個數有限制,請問:
1)參數是以全局變數的形式傳遞的,請問以全局變數的形式傳遞的參數也有限制嗎?
2)這種傳遞浮點參數的限制有多少呢?
3)float*float的結果是float類型還是double類型?能否直接賦值給float類型的變數?
答:
由於KEIL C51的參數傳遞是通過R0-R7來傳遞的,所以會有限制。
不過KEIL提供了一個編譯參數,可以支持更多參數的傳遞。具體
的內容見KEIL的PDF文檔。
我建議你把多個要傳遞的參數定義到指針或結構體中去,傳遞參
數通過指針或結構進行,這樣好一些。
第3個問題回答是YES,你自己試試不就知道了。
二十七、如何在某一個地址定義ram
用_at_ 命令,這樣可以定位靈活一點的地址
uchar xdata dis_buff[16] _at_ 0x6020 ;//定位RAM
將dis_buff[16]定位在0x6020開始的16個位元組
二十八、keil c中,用什麼函數可以得到奇偶校驗位?
例如32位數據,將四個位元組相互異或後檢查P即可,若耽心P被改變,可用內嵌匯編。
#include
unsigned char parity(unsigned char x){
x^=x;
if(P)return(1);
else return(0);
}
unsigned char parity2(unsigned int x){
#pragma asm
mov a,r7
xrl ar6,a
#pragma endasm
if(P)return(1);
else return(0);
}
Ⅱ c語言編輯器怎麼用手機版
如何在手機上編寫c程序?
ZZ8524次瀏覽2020.10.24
如何在手機上編寫c程序?今天小編為大家講解一下。
開啟分步閱讀模式
操作方法
01
打開手機,找到應用商店,點擊並進入,如圖所示。
02
進入之後,搜索「C語言編譯器」,將其下載安裝到手機上面,如圖所示。
03
下載好之後,打開「C語言編譯器」,如圖所示。
04
進入之後,即可對C語言進行編譯,如圖所示。
特別提示
以上純屬個人編寫,請勿轉載抄襲。
本頁搜狗指南內容僅供參考,請您根據自身實際情況謹慎操作。尤其涉及您或第三方利益等事項,請咨詢專業人士處理。
0無幫助
查看全文
大家還在搜
plc編程必背50個程序
初學編程100個代碼大全
手機編寫電子文檔
手機編寫合同軟體
編寫c程序的軟體
手機編寫c語言的軟體
c程序設計實驗報告
c語言流程圖生成器旁悔手機版
c語言編程器手機版
c程序設計知識點
c程序設計教材電子版
手機編寫文檔的軟體
安卓c語言編譯器
c程序設計電子書
手機編寫電子表格
如何編寫c語言程序
手機上怎麼編程c語言
編寫c語言的工具軟體
如何在手機上編程並運行
c語言必背18個經典程序
手機如何編寫c語言
手機怎麼寫c語言代碼
編輯c程序是指
怎樣編寫c語言程序
創建c程序的步驟
c程序實例
c語言編譯器手機版
c程序設計語言電子版
怎麼在手機上編寫c語言
編寫程序新手教程
手機上怎麼編程c語言
編寫c語言的工具軟體
如何在手機上編程並運行
c語言必背18個經典程序
手機如何編寫c語言
手機怎麼寫c語言代碼
編輯c程序是指
怎樣編寫c語言程序
創建c程序的步驟
c程序實信啟耐例
c語言編譯器手機版
c程序設計語言電子版
操作方法
01 / 04
操作方法
點擊目錄可快速跳轉至頁面對應位置
01打開手機,找到應用商店,點擊並進入,滑春如圖所示。
02進入之後,搜索「C語言編譯器」,將其下載安裝到手機上面,如圖所示。
03下載好之後,打開「C語言編譯器」,如圖所示。
04進入之後,即可對C語言進行編譯,如圖所示。
指到就不難 · © SOGOU.COM 2023
Ⅲ c程序的運行環境和運行一個c程序的方法實驗報告書
實驗目的 (1)了解所用的計算機系統的基礎操作方法,學會獨立使用該系統。 (2)了解在該系統上如何編輯、編譯、連接和運行一個C程序。 (3)通過運行簡單的C程序,初步了解C源程序的特點。 二、實驗內容 1.檢查所用的計算機系統是否已安裝了C編譯系統並確定它所在的子目錄。如果是在Windows操作系統下使用Turbo C編譯器,可以按以下步驟進行操作: ①單擊Windows桌面上的「開始」按鈕,在菜單中單擊「查找(F)」,在其右面的下拉菜單中單擊「文件或文件夾(F)」。屏幕上出現「查找」窗口。 ②在「名稱」框中輸入文件名「tc.exe」,單擊「開始查找」按鈕,系統即自動在指定的范圍內尋找所需要文件,如果找到,就會顯示出文件路徑(例如:C:\lib\tc或c:\tc)。 ③注意:在「搜索」框中應說明搜索范圍,如使「搜索」欄中的內容為「C:\」,表示從根目錄開始尋找,即搜索整個C盤。 2.建立用戶自己的子目錄 ①利用「Windows資源管理器」在磁碟(如D盤)上建立自已的文件夾。 ②利用DOS命令md在磁碟上建立自己的子目錄。 3.進入TC工作環境 第一種方法; ①單擊桌面上的「開始」按鈕,從菜單中選擇「程序」,單擊它然後在其下拉菜單中選擇「MS-DOS」,屏幕上出現MS-DOS窗口。 ②用DOS命令cd,使當前目錄改變為tc.exe所在的子目錄(例如:C:\lib\tc)。 ③在tc的子目錄下輸入tc,按回車鍵進入tc的工作環境。 第二種方法: 用滑鼠雙擊「我的電腦」圖標,進入C盤根目錄,在C盤根目錄下找到tc.exe文件所在的文件夾(如C盤下的lib文件夾下的tc文件夾),在文件夾中找到tc.exe文件,雙擊滑鼠進入TC的工作環境。 4.熟悉Turbo C集成環境 ①了解和熟悉編輯(Edit)窗口和信息(Message)窗口的作用。試一下能否向信息窗口輸入程序。按功能鍵F5,觀察它有什麼作用,再按一次F5,再觀察它有什麼作用。按F6,觀察它有什麼作用;再按一次F6,再觀察它有什麼作用。(參見第一部分的1.1節) ②按功能鍵F10,並按回車鍵,觀察「File」菜單,了解它們的作用和方法。用鍵盤上的「→」鍵,分別選中Edit、Run、Compile、Project、Options、Debug、Break/watch,觀察它們的菜單,大致上了解它們的作用,以後用到時再深入了解。 ③選擇File菜單中的New並按回車鍵,在編輯窗口中隨意輸入幾行字元,觀察窗口頂部左端line和col後面數字的變化。 5.編輯並運行一個簡單的程序 ①再選擇File菜單中的New並按回車鍵,使編輯窗口變成空白。 ②輸入下面的程序 main( ) { printf("* * * * *\n"); printf(" Hello.\n"); printf("* * * * *\n"); } ③按功能鍵F9進行編譯和連接,觀察屏幕上顯示的編譯信息。如果出現「出錯信息」,則應找出原因並改正之,再進行編譯。 ④如果編譯無錯誤,按Ctrl和F9鍵使程序運行,按Alt和F5鍵,切換到用戶屏,觀察運行結果。 ⑤按任一鍵回到TC窗口,將程序命令為ex1.c保存在自已的子目錄下。(參見第一部分1.2節的內容) 6.編輯並運行另一個C程序 ①再選擇File→New,使編輯窗口變成空白。 ②輸入以下程序 main( ) { int a,b,sum; a=150;b=200; sum=a+b; printf("sum is %d\n",sum); } ③按F9進行編譯,仔細分析編譯信息窗口和Message窗口,可能顯示有多個錯誤,逐個修改,直到不出現錯誤。 ④運行程序,分析運行結果。 ⑤將程序命名為ex2.c,保存到自己所建的子目錄下。 7.編輯並運行一個需要在運行時輸入數據的程序 ①清空編輯窗口,輸入下面的程序。 main( ) { int a,b, max; scanf("%d%d",&a,&b); if(a>b) max=a; else max=b; printf("%d",max); } ②編輯並運行,注意按Ctrl和F9運行後,先從鍵盤輸入整數2和5,然後按回車鍵,再按Alt和F5鍵,觀察運行結果。 ③將程序中的第3行改為: int a;b;max; 再進行編譯,觀察其結果。 ④將程序第5、6兩行合並為一行,即 if(a>b) max=a ; else max=b ; 進行編譯和運行,分析結果。 將程序命名為ex3.c保存在用戶自己的子目錄下。
麻煩採納,謝謝!
Ⅳ Linux進程通信實驗報告
一、實驗目的:
進一步認識並發(並行)執行的概念,區別順序執行和並發(並行)執行。
分析進程爭用臨界資源的現象,學習解決進程排斥的方法。
二、實驗環境:
一台至少具有256MB內存的計算機,並安裝Red Hat Linux 9的Linux操作系統。
三、實驗內容:
1. 預備知識
fork函數調用:創建一個新進程。
getpid函數調用:獲得一個進程的pid。
lockf系統的調用:在進程同步控制中為進程加鎖。
2. 編寫一段程序(程序名為fork1.c),使用系統調用fork()創建兩個子進程。當此程序運行時,在系統中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字元:父進程顯示字元「a」,子進程分別顯示字元「b」和字元「c」。試觀察記錄屏幕上的顯示結果,並分析原因。
(1)進入Linux操作系統。
(2)打開終端。進入vi編譯器。
(3)輸入源程序代碼。
(4)按Esc鍵,進入命令模式後,輸入「: wq文件名」就可以運行該程序了。