IAR C編譯器相關(C語言補充學習)

2021-06-26 01:32:30 字數 3161 閱讀 1148

**

編譯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.部...