0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SDCC-Linux下的51 MCU編譯器

云深之無跡 ? 來源:云深之無跡 ? 作者:云深之無跡 ? 2023-06-16 15:19 ? 次閱讀

SDCC (小型設(shè)備C編譯器)是為8位微控制器開發(fā)的免費(fèi)C編譯器。盡管兼容多種不同體系結(jié)構(gòu),但SDCC C編譯器更適合8051內(nèi)核。 SDCC是命令行固件開發(fā)工具,含預(yù)處理器、編譯器、匯編器、鏈接器和優(yōu)化器。安裝文件中還捆綁了SDCDB、類似于gdb (GNU調(diào)試器)的源碼級(jí)調(diào)試器。無錯(cuò)的程序采用SDCC編譯、鏈接后,生成一個(gè)Intel十六進(jìn)制格式的加載模塊。

安裝SDCC免費(fèi)C編譯器

如果需要安裝SDCC,請(qǐng)從網(wǎng)址下載SDCC最新版本。雖然也可使用該軟件的日常構(gòu)建(nightly builds)版,但通常最安全的方式是下載經(jīng)過完全測(cè)試的最新發(fā)布版。

在“Download”頁(yè)為不同的操作系統(tǒng)提供不同的SDCC。如果您使用運(yùn)行Microsoft Windows的PC,請(qǐng)下載并運(yùn)行win32自解壓SDCC安裝文件。

安裝程序時(shí)會(huì)出現(xiàn)一個(gè)提示,詢問是否將含有程序二進(jìn)制文件的目錄添加到您的路徑中。

采用SDCC編譯器編譯一個(gè)簡(jiǎn)單的C程序

為確保SDCC已在硬盤上正確安裝,請(qǐng)?jiān)诿钐崾痉骆I入sdcc --version,然后回車,窗口中應(yīng)出現(xiàn)圖1所示文本(實(shí)際文本與您下載的SDCC版本有關(guān)):

圖1. 通過版本檢查確認(rèn)SDCC是否正確安裝.

為測(cè)試包含路徑,生成名為sdcctest.c的文件,并將以下源代碼復(fù)制到該文件中。

#include 


char str[6] = "MAXIM";
bit  flag;


void main(void)
{
     if (strcmp(str,"MAXIM") == 0)
          flag = 0;
     else
          flag = 1; 


     while(1); // program loop
}

以普通ASCII格式(如使用Microsoft記事本程序)保存該文件。在命令提示符下,鍵入sdcc sdcctest.c,然后回車。如像圖2那樣沒有任何反應(yīng),則說明程序編譯成功。

圖2. 編譯簡(jiǎn)單的SDCC程序.

當(dāng)源代碼編譯成功時(shí),SDCC會(huì)生成多個(gè)文件。在編譯目錄中可找到以下文件:

sdcctest.asm:程序的匯編文件

sdcctest.lst:程序的列表文件

sdcctest.rst:被鏈接器更新的列表文件

sdcctest.map:被鏈接器更新的最終存儲(chǔ)器映射

sdcctest.ihx:Intel十六進(jìn)制格式的加載模塊。該文件必須被下載到微控制器中。

同時(shí)還生成其它文件(多數(shù)用于源碼級(jí)調(diào)試器)。請(qǐng)閱讀SDCC文檔了解更詳細(xì)的信息

SDCC專有數(shù)據(jù)類型

SDCC支持多數(shù)ANSI-C數(shù)據(jù)類型。此外,SDCC支持多種擴(kuò)展數(shù)據(jù)類型(也稱為存儲(chǔ)類型),以充分利用8051體系結(jié)構(gòu)的優(yōu)勢(shì),這將在后面以實(shí)例說明。

與一些商用8051微控制器開發(fā)工具不同,SDCC僅支持聲明位和字節(jié)可尋址特殊功能寄存器。盡管8051匯編語言支持,但SDCC并不支持共享位和字節(jié)可尋址RAM。為證實(shí)這一點(diǎn),請(qǐng)觀察以下代碼實(shí)例和編譯完的匯編代碼。

C源程序:

union
{
  unsigned char a_byte;
  struct
  {
    unsigned char bit0 : 1;
    unsigned char bit1 : 1;
    unsigned char bit2 : 1;
    unsigned char bit3 : 1;
    unsigned char bit4 : 1;
    unsigned char bit5 : 1;
    unsigned char bit6 : 1;
    unsigned char bit7 : 1;
  } a_bit;
} a;


bit b;

void main(void)
{
     a.a_byte     = 0x05;
     a.a_bit.bit6 = 1;
     b            = 1;


     while(1); // program loop
}

Assembly listing (.rst file):


                            ...
                            159 ;sdcctest.c a.a_byte = 5;
                            160 ;     genPointerSet
                            161 ;     genNearPointerSet
                            162 ;     genDataPointerSet
   0031 75 21 05            163     mov _a,#0x05
                            164 ;sdcctest.c a.a_bit.bit6 = 1;
                            165 ;     genPointerSet
                            166 ;     genNearPointerSet
   0034 78 21               167     mov r0,#_a
                            168 ;     genPackBits
   0036 E6                  169     mov a,@r0
   0037 44 40               170     orl a,#0x40
   0039 F6                  171     mov @r0,a
                            172 ;sdcctest.c b = 1;
                            173 ;     genAssign
   003A D2 00               174     setb    _b
                            175 ;sdcctest.c while(1); // program loop
                            ...

盡管在聲明中“a”看起來是位尋址存儲(chǔ)器,但匯編列表文件(來自由SDCC生成的.rst文件)表明變量并沒有使用位尋址。在列表中不要混淆“a”和“_a”?!癮”指累加器,而“_a”指變量。

near/data

以near或data存儲(chǔ)類型聲明的變量將被放在8051內(nèi)核的直接尋址RAM中。DS89C430/450系列微控制器具有128字節(jié)直接尋址存儲(chǔ)器,這是8051能夠訪問的速度最快的存儲(chǔ)器,生成的匯編代碼只需一個(gè)MOV指令即可讀寫該RAM中的數(shù)據(jù)。

#include "sdcc_reg420.h"


data unsigned char outPort0 = 0x4A;


void main(void)
{
     P0 = outPort0;


     while (1); // program loop
}

該例中使用的定義文件sdcc_reg420.h見附錄A。

far/xdata

以far或xdata存儲(chǔ)類型聲明的變量將被放在外部RAM中。這樣開發(fā)人員能夠訪問更大的RAM空間,但生成的匯編代碼需要使用MOVX指令來讀寫該存儲(chǔ)器,這要求將外部存儲(chǔ)器地址裝入數(shù)據(jù)指針。

DS89C430/450系列微控制器含有1K字節(jié)的內(nèi)部SRAM,可被用于以far/xdata聲明的變量。注意,電源管理寄存器(PMR)中的DME1:0位在該存儲(chǔ)器初始化或使用之前,必須先被置為內(nèi)部SRAM模式。

#include "sdcc_reg420.h"


xdata unsigned char ioPorts[2];


void main(void)
{
     PMR  |= 0x01; // Enable internal 1K SRAM


     ioPorts[0] = 0x4A;
     ioPorts[1] = 0x56;


     P0         = ioPorts[0];
     P1         = ioPorts[1];


     while (1); // program loop
}

idata

以idata存儲(chǔ)類型聲明的變量將被放在8051內(nèi)核的間接尋址存儲(chǔ)器中。間接可尋址存儲(chǔ)器與直接尋址存儲(chǔ)器類似,在8051內(nèi)核中共有128字節(jié)(不包括特殊功能寄存器)。但是,訪問idata需要額外的MOV命令將RAM地址移至工作寄存器中。

#include "sdcc_reg420.h"


idata unsigned int port0_x2;


void main(void)
{
     while (1) // program loop
     {
          port0_x2 = P0 * 2;
     }
}

pdata

存儲(chǔ)類型pdata用于訪問分頁(yè)的外部數(shù)據(jù)存儲(chǔ)器。該存儲(chǔ)類型超出了本應(yīng)用筆記范疇,有興趣的讀者可以閱讀SDCC文檔的pdata部分。

code

以code存儲(chǔ)類型聲明的變量將被放在程序存儲(chǔ)器(DS89C430/450微控制器內(nèi)部的閃存)中。對(duì)于SDCC來說,這類變量只讀,因此常使用code來聲明常量(如:查找表)。

#include "sdcc_reg420.h"


code unsigned char out[10] = {0x03,0x45,0xFA,0x43,0xDD,
                              0x1A,0xE0,0x00,0x87,0x91};


void main(void)
{
     data unsigned char i = 0;


     while (1) // program loop
     {
          P0 = out[i++];
          if (i==10)
               i=0;
     }
}

bit

以bit存儲(chǔ)類型聲明的變量被放在8051內(nèi)核的位尋址存儲(chǔ)器中。8051內(nèi)核的16字節(jié)直接尋址RAM可用作位尋址存儲(chǔ)器(字節(jié)0x20至0x2F),提供128個(gè)可尋址位。使用該類變量作為標(biāo)志位可高效利用存儲(chǔ)空間。

#include "sdcc_reg420.h"


#define ESCAPE 0x1B


bit esc_char_flag = 0;


void main(void)
{
     P1 = 0x00;


     while (!esc_char_flag)
     {
          if (P0 == ESCAPE)
               esc_char_flag = 1;
     }


     P1 = 0xFF;


     while (1); // program loop
}

sfr

存儲(chǔ)類型sfr被用來定義8051內(nèi)核專有的特殊功能寄存器(SFR)。附錄A定義文件中使用sfr標(biāo)識(shí)符定義了DS89C430/450微控制器中的所有SFR。

注意,下面的實(shí)例已定義了SFR,因此沒有必要包含定義文件s

dcc_reg420.h。




sfr at 0x80 P0;
sfr at 0x90 P1;


void main(void)
{
     P0 = 0x00;
     P1 = 0xFF;


     while (1); // program loop
}

sbit

存儲(chǔ)類型sbit用于定義可位尋址SFR中的特殊位。在8051內(nèi)核中,地址以0或者8 (十六進(jìn)制)結(jié)束的所有SFR均可位尋址。附錄A定義文件中使用sbit標(biāo)識(shí)符定義了DS89C430/450微控制器SFR的所有可尋址位。

sfr  at 0x80 P0;   // Port 0


sbit at 0x80 P0_0; // Port 0 bit 0
sbit at 0x81 P0_1; // Port 0 bit 1
sbit at 0x82 P0_2; // Port 0 bit 2
sbit at 0x83 P0_3; // Port 0 bit 3
sbit at 0x84 P0_4; // Port 0 bit 4
sbit at 0x85 P0_5; // Port 0 bit 5
sbit at 0x86 P0_6; // Port 0 bit 6
sbit at 0x87 P0_7; // Port 0 bit 7


void main(void)
{
     P0   = 0x00; // P0 = 0x00


     P0_4 =    1; // P0 = 0x10


     while (1);   // program loop
}

絕對(duì)尋址

SDCC支持采用at標(biāo)識(shí)符的絕對(duì)尋址。但是,SDCC不跟蹤聲明的絕對(duì)尋址變量,而且可能在其地址聲明其它變量,造成相互覆蓋。

以下程序顯示了有趣的潛在錯(cuò)誤。

#include "sdcc_reg420.h"


unsigned char           a     = 0x4A;
unsigned int            b     = 0x0000;
unsigned char           c[64] = {0x00};


unsigned char at 0x0010 y;
unsigned char at 0x0010 z;


void main(void)
{
     for(b=0; b<64; b++)
          c[b] = 0xAA;


     y = 0xF1;
     z = 0xF2;


     a = c[5];


     while (1); // program loop
}

使用SDCC時(shí),盡管變量"y"和"z"分配同一個(gè)位置,也可進(jìn)行無錯(cuò)誤或警告的編譯。如果要運(yùn)行該程序,我們認(rèn)為程序(a = c[5])中"a"最終將被設(shè)置為0xAA。但情況并非如此。"a"最終被分配的值為0xF2。

如果查看SDCC生成的.map文件中以下幾行語句(顯示每個(gè)變量的實(shí)際地址),便會(huì)明白這種情況的原因。

Area                               Addr   Size   Decimal Bytes (Attributes)
--------------------------------   ----   ----   ------- ----- ------------
.  .ABS.                           0000   0000 =      0. bytes (ABS,OVR)


      Value  Global
   --------  --------------------------------
     ...
     0010    _y
     0010    _z
     ...


Area                               Addr   Size   Decimal Bytes (Attributes)
--------------------------------   ----   ----   ------- ----- ------------
DSEG                               0008   0043 =     67. bytes (REL,CON)


      Value  Global
   --------  --------------------------------
     0008    _a
     0009    _b
     000B    _c

注意,變量名稱前的下劃線是由編譯器添加的。如果"c"位于地址0x000B,長(zhǎng)度為64字節(jié),那么它將覆蓋位于地址0x0010處的變量"y"和"z"。

絕對(duì)尋址可用于仿真位尋址變量。在下面的例子中,在位尋址存儲(chǔ)器的最后一個(gè)字節(jié)處定義變量n_byte。然后,在8051內(nèi)核位尋址存儲(chǔ)器的最后8位定義n_bit0至n_bit7。由于這種重疊,可采用變量n_bit0至n_bit7對(duì)變量n_byte進(jìn)行位尋址。

#include "sdcc_reg420.h"


data unsigned char at 0x002F n_byte;


bit                at 0x78   n_bit0;
bit                at 0x79   n_bit1;
bit                at 0x7A   n_bit2;
bit                at 0x7B   n_bit3;
bit                at 0x7C   n_bit4;
bit                at 0x7D   n_bit5;
bit                at 0x7E   n_bit6;
bit                at 0x7F   n_bit7;


void main(void)
{
     n_byte = 0x00;
     n_bit4 = 1;


     P0     = n_byte; // P0 = 0x10


     while (1);       // program loop
}

存儲(chǔ)器模式

SDCC支持兩種存儲(chǔ)器模式:小模式和大模式。使用存儲(chǔ)器小模式時(shí),SDCC在內(nèi)部RAM中聲明所有不帶存儲(chǔ)類型的變量(如,data、idata、xdata、pdata、bit、code)。使用存儲(chǔ)器大模式時(shí),SDCC在外部RAM中聲明所有不帶存儲(chǔ)類型的變量。

采用SDCC編譯時(shí),默認(rèn)為小模式。如果要強(qiáng)制SDCC使用特定的存儲(chǔ)器模式,可使用以下命令行參數(shù)

sdcc--model-smallsdcctest.c

或者

sdcc --model-large sdcctest.c

不要鏈接使用不同存儲(chǔ)器模式編譯的模塊或目標(biāo)文件。

SDCC的中斷

定義中斷服務(wù)程序(ISR)時(shí),應(yīng)使用以下格式:


void interrupt_identifier (void) interrupt interrupt_number using bank_number
{
     ...
}

其中interrupt_identifier可以是任意有效的SDCC函數(shù)名,interrupt_number代表中斷在中斷向量表中的位置。表1列出了DS89C430/450系列微控制器支持的每個(gè)中斷的中斷號(hào)??蛇x參數(shù)bank_number用于指示SDCC采用哪個(gè)寄存器區(qū)存儲(chǔ)ISR中的局部變量。

表1. DS89C430/450中斷服務(wù)程序的中斷號(hào).
Interrupt Name Interrupt Vector Interrupt Number
External Interrupt 0 0x03 0
Timer 0 Overflow 0x0B 1
External Interrupt 1 0x13 2
Timer 1 Overflow 0x1B 3
Serial Port 0 0x23 4
Timer 2 Overflow 0x2B 5
Power Fail 0x33 6
Serial Port 1 0x3B 7
External Interrupt 2 0x43 8
External Interrupt 3 0x4B 9
External Interrupt 4 0x53 10
External Interrupt 5 0x5B 11
Watchdog Interrupt 0x63 12

SDCC處理與ISR編程相關(guān)的許多細(xì)節(jié),如使用堆棧保存和恢復(fù)累加器及數(shù)據(jù)指針。(實(shí)際上所有函數(shù)均進(jìn)行此操作。請(qǐng)參考SDCC手冊(cè)中的_naked關(guān)鍵字來禁止在堆棧中保存這些變量)。其它細(xì)節(jié)不由SDCC處理(因?yàn)楹侠淼脑?,這對(duì)嵌入式編程開發(fā)新手帶來一定難度。許多這類問題屬于高級(jí)編程范疇,已超出本文討論的范圍,SDCC手冊(cè)和嵌入式編程教材可提供更深入的內(nèi)容。

使用中斷時(shí),應(yīng)遵循以下原則。

可在ISR內(nèi)部寫、并可在ISR外部訪問的每個(gè)全局變量必須被聲明為volatile,以確保優(yōu)化器不會(huì)刪除與該變量相關(guān)的指令。

以非原子(non-atomic)方式使用數(shù)據(jù)時(shí)(如,訪問16位/32位變量)應(yīng)禁止中斷。當(dāng)對(duì)變量的訪問為原子方式時(shí),處理器無法中斷(帶有ISR)對(duì)存儲(chǔ)器的數(shù)據(jù)存取。

避免在ISR內(nèi)部調(diào)用函數(shù)。如果必須這樣做,需要將函數(shù)聲明為reentrant (參見SDCC手冊(cè)),這樣函數(shù)中的所有局部變量被分配在堆棧中,而不是在RAM中。

注意,如果被SDCC使用的含ISR的源文件不含main()函數(shù),那么含main()函數(shù)的源文件應(yīng)包含每個(gè)ISR的函數(shù)原型。

下面的例子定義了一個(gè)處理串行通信接口1 (SCI_1)的中斷服務(wù)程序(ISR)。程序接收來自SCI_1接收器的一個(gè)字節(jié),將接收字節(jié)加1,通過SCI_1發(fā)射器連續(xù)發(fā)送出去。

#include "sdcc_reg420.h"


volatile unsigned char n = 0x4A;


void sci1ISR (void) interrupt 7
{
    if (RI_1)
    {
        n     = SBUF1+1;     // Save Rx byte
        RI_1  = 0;           // Reset SCI_1 Rx interrupt flag
    }
    else if (TI_1)
    {
        SBUF1 = n;           // Load byte to Tx
        TI_1  = 0;           // Reset SCI_1 Tx interrupt flag
    }
}


void main(void)
{
    // 1. Init Serial Port
    EA    = 0;              // Enable global interrupt mask
    SCON1 = 0x50;           // Set SCI_1 to 8N1, Rx enabled
    TMOD |= 0x20;           // Set Timer 1 as Mode 2
    TH1   = 0xDD;           // Set SCI_1 for 2400 baud
    TR1   = 1;              // Enable Timer 1
    ES1   = 1;              // Enable interrupts for SCI_1
    EA    = 1;              // Disable global interrupt mask


    // 2. Initiate SCI_1 Tx
    SBUF1 = n;


    // 3. Program loop...
    while (1);
}

內(nèi)嵌匯編

SDCC完全支持內(nèi)嵌匯編。使用該功能時(shí),匯編代碼應(yīng)嵌在_asm和_endasm標(biāo)識(shí)符之間。注意,通過在變量名前加下劃線,內(nèi)嵌匯編代碼也可以訪問C變量。以下實(shí)例采用內(nèi)嵌匯編執(zhí)行nop指令(用于在微控制器內(nèi)部占用一個(gè)時(shí)鐘周期),然后將變量"a"加1。

#include "sdcc_reg420.h"


unsigned char a;


void main(void)
{
    // program loop...
    while (1)
    {


          a = P0;


          _asm
               nop
               nop
               nop
               inc _a
          _endasm;


          P1 = a;
    }
}

SDCC還可用于C和匯編函數(shù)接口,這是較深入的問題;請(qǐng)參考SDCC手冊(cè),了解詳細(xì)信息。

附錄A:DS89C430/450的SFR定義文件(sdcc_reg420.h)

/*
 * sdcc_reg420.h
 *
 * MAXIM INTEGRATED PRODUCTS
 *
 * Special Function Register definitions file
 * DS89C430/450 Ultra-High Speed 8051-compatible uCs
 *
 */


#ifndef __REG420_H__
#define __REG420_H__


/*  BYTE Registers  */
sfr at 0x80 P0;
sfr at 0x81 SP;
sfr at 0x82 DPL;
sfr at 0x83 DPH;
sfr at 0x84 DPL1;
sfr at 0x85 DPH1;
sfr at 0x86 DPS;
sfr at 0x87 PCON;
sfr at 0x88 TCON;
sfr at 0x89 TMOD;
sfr at 0x8A TL0;
sfr at 0x8B TL1;
sfr at 0x8C TH0;
sfr at 0x8D TH1;
sfr at 0x8E CKCON;
sfr at 0x90 P1;
sfr at 0x91 EXIF;
sfr at 0x96 CKMOD;
sfr at 0x98 SCON0;
sfr at 0x99 SBUF0;
sfr at 0x9D ACON;
sfr at 0xA0 P2;
sfr at 0xA8 IE;
sfr at 0xA9 SADDR0;
sfr at 0xAA SADDR1;
sfr at 0xB0 P3;
sfr at 0xB1 IP1;
sfr at 0xB8 IP0;
sfr at 0xB9 SADEN0;
sfr at 0xBA SADEN1;
sfr at 0xC0 SCON1;
sfr at 0xC1 SBUF1;
sfr at 0xC2 ROMSIZE;
sfr at 0xC4 PMR;
sfr at 0xC5 STATUS;
sfr at 0xC7 TA;
sfr at 0xC8 T2CON;
sfr at 0xC9 T2MOD;
sfr at 0xCA RCAP2L;
sfr at 0xCB RCAP2H;
sfr at 0xCC TL2;
sfr at 0xCD TH2;
sfr at 0xD0 PSW;
sfr at 0xD5 FCNTL;
sfr at 0xD6 FDATA;
sfr at 0xD8 WDCON;
sfr at 0xE0 ACC;
sfr at 0xE8 EIE;
sfr at 0xF0 B;
sfr at 0xF1 EIP1;
sfr at 0xF8 EIP0;


/* BIT Registers  */


/* P0 */
sbit at 0x80 P0_0;
sbit at 0x81 P0_1;
sbit at 0x82 P0_2;
sbit at 0x83 P0_3;
sbit at 0x84 P0_4;
sbit at 0x85 P0_5;
sbit at 0x86 P0_6;
sbit at 0x87 P0_7;


/* TCON */
sbit at 0x88 IT0;
sbit at 0x89 IE0;
sbit at 0x8A IT1;
sbit at 0x8B IE1;
sbit at 0x8C TR0;
sbit at 0x8D TF0;
sbit at 0x8E TR1;
sbit at 0x8F TF1;


/* P1 */
sbit at 0x90 P1_0;
sbit at 0x91 P1_1;
sbit at 0x92 P1_2;
sbit at 0x93 P1_3;
sbit at 0x94 P1_4;
sbit at 0x95 P1_5;
sbit at 0x96 P1_6;
sbit at 0x97 P1_7;


/* SCON0 */ 
sbit at 0x98 RI_0;
sbit at 0x99 TI_0;
sbit at 0x9A RB8_0;
sbit at 0x9B TB8_0;
sbit at 0x9C REN_0;
sbit at 0x9D SM2_0;
sbit at 0x9E SM1_0;
sbit at 0x9F SM0_0;
sbit at 0x9F FE_0;


/* P2 */
sbit at 0xA0 P2_0;
sbit at 0xA1 P2_1;
sbit at 0xA2 P2_2;
sbit at 0xA3 P2_3;
sbit at 0xA4 P2_4;
sbit at 0xA5 P2_5;
sbit at 0xA6 P2_6;
sbit at 0xA7 P2_7;


/* IE */
sbit at 0xA8 EX0;
sbit at 0xA9 ET0;
sbit at 0xAA EX1;
sbit at 0xAB ET1;
sbit at 0xAC ES0;
sbit at 0xAD ET2;
sbit at 0xAE ES1;
sbit at 0xAF EA;


/* P3 */
sbit at 0xB0 P3_0;
sbit at 0xB1 P3_1;
sbit at 0xB2 P3_2;
sbit at 0xB3 P3_3;
sbit at 0xB4 P3_4;
sbit at 0xB5 P3_5;
sbit at 0xB6 P3_6;
sbit at 0xB7 P3_7;


/* IP0 */
sbit at 0xB8 LPX0;
sbit at 0xB9 LPT0;
sbit at 0xBA LPX1;
sbit at 0xBB LPT1;
sbit at 0xBC LPS0;
sbit at 0xBD LPT2;
sbit at 0xBE LPS1;


/* SCON1 */
sbit at 0xC0 RI_1;
sbit at 0xC1 TI_1;
sbit at 0xC2 RB8_1;
sbit at 0xC3 TB8_1;
sbit at 0xC4 REN_1;
sbit at 0xC5 SM2_1;
sbit at 0xC6 SM1_1;
sbit at 0xC7 SM0_1;


/* T2CON */
sbit at 0xC8 CP_RL_2;
sbit at 0xC9 C_T_2;
sbit at 0xCA TR_2;
sbit at 0xCB EXEN_2;
sbit at 0xCC TCLK;
sbit at 0xCD RCLK;
sbit at 0xCE EXF_2;
sbit at 0xCF TF_2;


/* PSW */
sbit at 0xD0 PARITY;
sbit at 0xD0 P;
sbit at 0xD1 F1;
sbit at 0xD2 OV;
sbit at 0xD3 RS0;
sbit at 0xD4 RS1;
sbit at 0xD5 F0;
sbit at 0xD6 AC;
sbit at 0xD7 CY;


/* WDCON */
sbit at 0xD8 RWT;
sbit at 0xD9 EWT;
sbit at 0xDA WTRF;
sbit at 0xDB WDIF;
sbit at 0xDC PFI;
sbit at 0xDD EPFI;
sbit at 0xDE POR;
sbit at 0xDF SMOD_1;


/* EIE */
sbit at 0xE8 EX2;
sbit at 0xE9 EX3;
sbit at 0xEA EX4;
sbit at 0xEB EX5;
sbit at 0xEC EWDI;


/* EIP0 */
sbit at 0xF8 LPX2;
sbit at 0xF9 LPX3;
sbit at 0xFA LPX4;
sbit at 0xFB LPX5;
sbit at 0xFC LPWDI;


#endif

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16790

    瀏覽量

    349318
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1345

    瀏覽量

    40152
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11161

    瀏覽量

    208459
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1607

    瀏覽量

    48977
  • SDCC
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    8371

原文標(biāo)題:SDCC-Linux下的51 MCU編譯器

文章出處:【微信號(hào):TT1827652464,微信公眾號(hào):云深之無跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于SDCC編譯器和FreeRTOS操作系統(tǒng)怎么在C8051F340上移植?

    MCS-51系列單片機(jī)應(yīng)用廣泛,在我國(guó)學(xué)習(xí)研究的人較多。使用C語言在單片機(jī)上開發(fā)程序可提高開發(fā)效率,目前針對(duì)該內(nèi)核兼容單片機(jī)開發(fā)的C語言編譯器有Keil、Tasking、Raisonance、IAR
    發(fā)表于 09-17 08:24

    MPLAB 3.60和SDCC插件

    Linux的MPLABX 3.60有安裝SDCC工具鏈的麻煩。解決方案:使用COMANDLN的SDCC SDCCN編譯器
    發(fā)表于 04-17 06:02

    安裝編譯器SDCC的方法

    STC單片機(jī)+SDCC+Stcgal(MAC環(huán)境)1. 安裝編譯器SDCC:我們?cè)贛ac上通常使用 brew 這個(gè)包管理工具,通過 brew 來安裝 SDCC 的命令:brew ins
    發(fā)表于 11-25 08:12

    怎樣在linux上搭建SDCC編譯環(huán)境

    設(shè)備的C語言編譯器,該編譯器是標(biāo)準(zhǔn)C語言,可以編譯Intel MCS51架構(gòu)的微處理,也可以編譯
    發(fā)表于 12-01 08:07

    Cx51編譯器使用手冊(cè)

    Cx51編譯器使用手冊(cè) 對(duì)傳統(tǒng)和擴(kuò)展的8051 微處理的優(yōu)化的C 編譯器和庫(kù)參考 本手冊(cè)講述對(duì)8051 的目標(biāo)環(huán)境如何使用Cx51 優(yōu)
    發(fā)表于 03-12 10:24 ?32次下載

    C51智能反編譯器

    C51智能反編譯器
    發(fā)表于 04-07 17:36 ?63次下載

    INTEL的PLM51編譯器

    PLM51 FOR DOS,INTEL的PLM51編譯器plm51
    發(fā)表于 04-14 15:07 ?39次下載

    MCS-51程序空間擴(kuò)展原理及編譯器優(yōu)化

    討論了MCS-51系列單片機(jī)程序空間擴(kuò)展的原理,包括硬件與編譯器兩個(gè)方面,并提出一種編譯器優(yōu)化方案.該方案在Keil仿真上檢驗(yàn)并通過關(guān)健詞:C51
    發(fā)表于 10-23 08:55 ?100次下載

    使用免費(fèi)的SDCC C編譯器開發(fā)DS89C430/450系列

    摘要:SDCC (小型設(shè)備C編譯器)是為8位微控制開發(fā)的免費(fèi)C編譯器。本應(yīng)用筆記演示如何使用SDCC來開發(fā)DS89C430/450系列超高
    發(fā)表于 04-23 13:55 ?6072次閱讀
    使用免費(fèi)的<b class='flag-5'>SDCC</b> C<b class='flag-5'>編譯器</b>開發(fā)DS89C430/450系列

    了解Linux安裝ARM交叉編譯器的步驟

    gcc是linux環(huán)境的asm和c語言編譯器,生成的是可以在x86平臺(tái)上運(yùn)行的可執(zhí)行程序;
    發(fā)表于 04-26 16:12 ?6427次閱讀

    如何在linux使用SDCC開發(fā)MCS51單片機(jī)

    如果你試圖建立自己的微控制系統(tǒng),那么SDCC是適合你的。您可以免費(fèi)使用SDCC(GPL的許可證),它在Windows和Linux平臺(tái)下都
    發(fā)表于 06-28 17:42 ?1次下載
    如何在<b class='flag-5'>linux</b><b class='flag-5'>下</b>使用<b class='flag-5'>SDCC</b>開發(fā)MCS<b class='flag-5'>51</b>單片機(jī)

    SDCC編譯器和FreeRTOS在C8051F上的開發(fā)的應(yīng)用

    SDCC編譯器和FreeRTOS在C8051F上的開發(fā)的應(yīng)用(通訊電源技術(shù)2020年15期)-SDCC編譯器和FreeRTOS在C8051F上的開發(fā)應(yīng)用 ? ? ? ??
    發(fā)表于 08-31 11:38 ?4次下載
    <b class='flag-5'>SDCC</b><b class='flag-5'>編譯器</b>和FreeRTOS在C8051F上的開發(fā)的應(yīng)用

    SDCC編譯器和FreeRTOS在C8051F上的開發(fā)應(yīng)用

    SDCC編譯器和FreeRTOS在C8051F上的開發(fā)應(yīng)用(肇慶理士電源技術(shù)有限公司怎么樣)-引言MCS-51系列單片機(jī)應(yīng)用廣泛,在我國(guó)學(xué)習(xí)研究的人較多。使用C語言在單片機(jī)上開發(fā)程序可提高開發(fā)效率
    發(fā)表于 09-17 12:53 ?8次下載
    <b class='flag-5'>SDCC</b><b class='flag-5'>編譯器</b>和FreeRTOS在C8051F上的開發(fā)應(yīng)用

    SDCC編譯器和FreeRTOS在C8051F上的開發(fā)應(yīng)用

    SDCC編譯器和FreeRTOS在C8051F上的開發(fā)應(yīng)用(核達(dá)中遠(yuǎn)通電源技術(shù)有限公司招聘信息)-SDCC編譯器和FreeRTOS在C8051F上的開發(fā)應(yīng)用? ? ? ? ? ? ??
    發(fā)表于 09-18 17:14 ?21次下載
    <b class='flag-5'>SDCC</b><b class='flag-5'>編譯器</b>和FreeRTOS在C8051F上的開發(fā)應(yīng)用

    51單片機(jī)在Ubuntu和MacOS程序開發(fā)和下載

    Linux通用,Ubuntu16.04,18.04.20.04均可。什么是SDCC?SDCC是可重定目標(biāo)的,優(yōu)化的標(biāo)準(zhǔn)C(ANSI C89,ISO C99,ISO C11)編譯器套件,
    發(fā)表于 11-16 19:51 ?3次下載
    <b class='flag-5'>51</b>單片機(jī)在Ubuntu和MacOS<b class='flag-5'>下</b>程序開發(fā)和下載