c語言空指令
A. 單片機匯編中為什麼要用NOP
在單片機c語言中加入NOP指令是因為標準的C語言中沒有空語句。
但備檔桐在單片機的C語言編程中,經常需要用幾個空指令產生短延時的效果。
這在匯編語言中很容易實現,寫幾個nop就行了。
在AVR-GCC中,如下方法嵌入匯編指令:
asm ("nop; nop; nop; nop;" ::);
在keil C51中,直接調用庫函數:
#include// 聲明了void _nop_(void);
_nop_();// 產生一條NOP指令
(1)c語言空指令擴展閱讀
執行NOP指令只使程序計數器PC加1,所以佔用一個機器周期。實例:MOVLW 0xOF ;送OFH到W MOVWF PORT_B ;W內容寫入B口 NOP ;空操作 MOVF PORT_B,W 。
讀操作說明:該三條指令是一種對I/O口的B口連續操作的實例,其目的達到寫入B口的蠢源內容要讀出時,應保證寫、讀之間有個穩定時間,因此加入了空操作指令NOP。
作用:對於延時很短的,要求在us級的,採用「_nop_ 」函數,這個函數相當匯編NOP指令,延時幾微秒。NOP指令為單周期指令,可由晶振頻率算出延時時間,對於12M晶振,延時1uS。
對於延時比較長的,要求在大於10us,採用C51中的循環語句來實現。
在選擇C51中循環語句時,要注意以下幾個問題:
第一、定義的C51中循環變數,盡量採用無符號字元型變數。
第二、在FOR循環語句中,盡量採用變數減減來做循環。
第三、在do,, while, while 語句中,循環體內變數也採用減減方法。
這因為在C51編譯器中,對不同的循環方法,採用不同的指令來完成的。仿坦
B. C語言中調用_nop_();應包含什麼頭文件
#include<intrins.h>
intrins.h一般出現在C51單片機編程中,一般程序中需要使用到空指令_nop_();字元循環移位指令_crol_等時使扒迅用。
這個頭文件中的其他函數:
_crol_ 字元循環左移
_cror_ 字元循環右移
_irol_ 整數循環左移
_iror_ 整數循環右移
_lrol_ 長整數循環左移
_lror_ 長整數循環右移
_nop_ 空操作 (相當於8051 NOP 指令)
_testbit_ 測試春敗此並清零位 (相當於8051 JBC 指令)
函數名: _crol_,枯廳_irol_,_lrol_
原 型:
unsigned char _crol_(unsigned char val,unsigned char n);
unsigned int _irol_(unsigned int val,unsigned char n);
unsigned int _lrol_(unsigned int val,unsigned char n);
C. C中 _nop_()是什麼意思
C中 _nop_()是空指令,延時一個指令周期;
鬧凳如果是51單片機,外部晶振是12M,那麼延時時間為1、12M*12=1us;
C語蔽乎言是一門通用計算機編程語言,應用廣泛。
C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及液並旅不需要任何運行環境支持便能運行的編程語言。
D. 在c語言中僅由一個分號構成的語句為空語句他什麼也不做
c語言中虛旁的空語差虛橡句經編譯後就成了空譽孝指令,而空指令不會執行任何運算,但同樣會消耗CPU的執行時間。
E. 51單片機c語言 _nop_()是一個空指令短時間延時的空幾個機器周期
這個_nop_()等效與匯編裡面的,NOP指令,也就是空一個機器周期,如果是傳統51單片機的話,等於空12個時鍾周期【即一個機器周期】山前,操作方法如下:
1、首先,可以利用keil來進行模擬實驗,觀察軟體所顯示的數值,然後再進行相關的運算,即可得出結果侍唯猛。
F. c語言空操作可執行多少次
執行次數不受限制。
c語言中空操作的指令是只由分號構成的語句,任何空語句都是可執行的源叢源,當你執行一個空語句時和普通雹態語句沒有區別,只是空語句什麼也不做而已,當你執行完一個空語句的時候(也就是什麼都不用做鄭悔就執行完了),自然就到語句的結束點,進而執行下一條語句。
G. C語言中 空操作的指令是什麼
C語言中 空操作的指令是只由分號構成的語句
解釋:C語言都是以;結尾的,所以空操作直接打一個;就可以,
H. 匯編空行指令是什麼
沒聽說什麼叫「旦信好空行指令」。一般的CPU倒是有一條什麼都不操作模鉛的空指令,其匯編格式大多為:NOP
不同的CPU是有不同的指令的,其表示方法也不坦早一定相同。
I. 匯編程序中nop的作用是什麼
在單片機的C語言編程中,經常需要許多空指令來產生短延遲效應。
很容易做的匯編語言,只寫幾個空操作。
avr-gcc採用以下方法嵌入組裝說明:
Asm(nop」;nop。nop。nop。」:);
在keilC51中,直接調用庫函數:
包括//聲明void_nop_(void);
_nop_();//生成一個NOP指令
(9)c語言空指令擴展閱讀:
執行NOP指令只會增加程序計數器1個人電腦,所以需要一個機器周期。實例:MOVLW0xof;將OFH發送到WMOVWFPORT_B;在B埠寫W到NOP;空操作MOVFPORT_B,W。
讀指令:這三個埠B的連續操作指令的I/O埠,目的是為了寫的內容讀埠B,需要確保一個穩定的讀寫之間的時間,所以NOP添加空操作指令。
效果:很短的延遲,需要「_nop_」功能在美國水平,而編譯NOP指令延遲的幾微秒。NOP指令是單周期指令,延遲時間可以通過晶體振盪器的頻率來計算。對於一個12M的晶體振盪器,延遲時間是1uS。
對於一個相對較長的延遲,要求大於10us,使用C51中的loop語句弊桐來實現。
在C51中選擇loop語句時,要注意以下幾點:
首先,在C51中定義了循環變數,盡量使用無符號字元變數。
其次,在FORloop語句中,嘗試使用變數-來執行循租唯坦環。
第三,在while和while語句中,循環體變數也使用了減法。
這是因為山早在C51編譯器中,不同的指令用於不同的循環方法。
J. C語言 #if……#else……的意思
預處理指令是以#號開頭的代碼行。#號必須是該行除了任何空白字元外的第一個字元。#後是指令關鍵字,在關鍵字和#號之間允許存在任意個數的空白字元。整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源代碼做某些轉換。下面是部分預處理指令:
指令
用途
#
空指令,無任何效果
#include
包含一個源代碼文件
#define
定義宏#undef
取消已定義的宏#if
如果給定條件為真,則編譯畝褲塌下面代碼
#ifdef
如果宏已經定義,則編譯下面代碼
#ifndef
如果宏沒有定義,則編譯下面代碼
#elif
如果前面的#if給定條件不為真,當前條件為真,則編譯下面代碼,其實就是else
if的簡寫
#endif
結束一個#if……#else條件編譯塊#error
停止編譯並顯示錯誤信息
#if……#else……
就是預編譯,比如:
#if
1
。。。。
#else……
這里#if
1表示此次編譯把其下的純啟代碼編譯進去,如果改為#if
0,則表示此次編譯把#else後面的代碼編譯進去,而不是#if
0下的代碼。
#if
TT
……#else……
TT是一個宏,這里表示如果TT這個宏定義的話,則編譯#if
下的代碼,否則#else下的迅圓代碼。
具體可以參考:
http://blog.csdn.net/qiantuo1234/article/details/6976072