**
編譯msp430工程檔案時,看到:
#define __msp430_has_sd16_a1__
#define sd16inctl0_ (0x00b0u)
defc( sd16inctl0 , sd16inctl0_)
#define sd16ae_ (0x00b7u)
defc( sd16ae , sd16ae_)
#define sd16conf0_ (0x00f7u)
defc( sd16conf0 , sd16conf0_)
#define sd16conf1_ (0x00bfu)
defc( sd16conf1 , sd16conf1_)
#define sd16ctl_ (0x0100u)
defw( sd16ctl , sd16ctl_)
#define sd16cctl0_ (0x0102u)
defw( sd16cctl0 , sd16cctl0_)
#define sd16iv_ (0x0110u)
defw( sd16iv , sd16iv_)
#define sd16mem0_ (0x0112u)
defw( sd16mem0 , sd16mem0_)
找到定義:
#ifdef __iar_systems_icc__
#include "in430.h"
#pragma language=extended
#define defc(name, address) __no_init volatile unsigned char name @ address;
#define defw(name, address) __no_init volatile unsigned short name @ address;
#define defxc volatile unsigned char
#define defxw volatile unsigned short
#endif
#ifdef __iar_systems_asm__
#define defc(name, address) sfrb name = address;
#define defw(name, address) sfrw name = address;
解釋:
數值分配偽指令:
主要用於對符合的數值定義,以下是常見的定義
equ 在當前模組中賦予乙個永久的值
= 同上
define 在多個模組環境下,定義乙個在整個檔案中都有效的值
sfrb和sfrw 是老的版本對功能暫存器的定義
defc 是新的版本對功能暫存器的定義
read_only defc 是新的版本定義唯讀功能模組暫存器
擴充套件關鍵字(常用):
1.asm
也可以寫成 __asm。功能是在 c 程式中直接嵌入組合語言。
語法:asm ("string");其中 string 必須是有效的彙編語句。
2.__interrupt
放在函式前面,標誌中斷函式。下面這段程式是非同步序列口 uart0 的接收中斷函式。
uart0rx_vector 為非同步序列口 uart0 的接收中斷向量。
舉例:#pragma vector=uart0rx_vector
__interrupt void uart0_r(void) //uart0接收中斷
3.__monitor
放在函式前面, 功能是當這一函式執行的時候自動關閉中斷。 應該盡量縮短這樣的函式,否則,中斷事件無法得到及時的響應。
4.__no_init
放在全域性變數前面,功能是使程式啟動時不為變數賦初值。
5.__raw
編譯中斷函式時,編譯器會自動生成一段**,首先儲存當時所用到 cpu 內暫存器的內容,退出中斷程式時再進行恢復。將__raw放在中斷函式前可以禁止儲存 cpu內暫存器的過程,當然退出時也不會恢復。是否為中斷函式使用此關鍵字要根據需要而定。
6.__regvar
放在變數前面,作用是宣告變數為暫存器變數。可以用於整數、指標、32 位浮點數以及只含有乙個元素的結構和聯合。暫存器變數的位址只能為 r4 或者r5,也不能用指標指向這個暫存器變數,而且必須用__no_init 禁止初始化。如:__regvar __no_init unsigned char q0 @ __r4。
其他不常用的關鍵字還有:__data16、__intrinsic、__noreturn、 __root、__task、__word16
例項解析:
1、 __no_init spp_rx_struct rxdata @ "pm0_xdata";
__no_init spp_tx_struct txdata @ "pm0_xdata";
解析:@是指定位址,__no_init 是乙個segment,是給linker用的,定義到不初始化的塊中去。
定義全域性變數的時候比如int char; 即使你沒有賦值給他,編譯器還是會給他乙個初始化值0,編譯的時候編譯器把他分配到初始化為零的那個segment中去了。編譯器預設的有幾個塊,初始化為零的塊,初始化不為零的塊,和不初始化的塊,你可以定義自己的塊,如你的pm0_xdata,這個就是你自己定義的乙個塊,那你的這個塊是個什麼屬性呢,就是,__no_init 屬性,有了這個屬性,編譯器只給你分配空間,不給你初始化。
補充:volatile:作用: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。
#pragma:指令對每個編譯器給出了乙個方法,在保持與c和c++語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的。
C 語言 編譯器
c 語言是高階程式語言,人們在使用 c 語言工作的時候不必用數字碼表示指令,大大簡化了對於計算機底層暫存器的操作,人們可以把工作的重點放在 設計和具體功能的實現,編寫出更易讀易懂的 可是計算機的工作和人類正好相反,c 語言編寫的 對於計算機而言就好比是天書且沒有意義可言,因為計算機是識別機器語言的,...
C語言的編譯器
c語言的常用編譯器 目前最流行的c語言編譯器有以下幾種 gnu compiler collection 或稱 gcc microsoft c 或稱 ms c borland turbo c 或稱 turbo c 這些c語言版本不僅實現了ansi c標準,而且在此基礎上各自作了一些擴充,使之更加方便 ...
編譯器處理相關
一.預處理器 編譯器 彙編器 鏈結器 預處理器會處理相關的預處理指令,一般是以 開頭的指令。如 include xx.h define等。編譯器把對應的 cpp翻譯成 s檔案 組合語言 彙編器則處理 s生成對應的 o檔案 obj目標檔案 最後鏈結器把所有的 o檔案鏈結成乙個可執行檔案 exe 1.部...