[MCS51] MAC 底下單片機(8051)的開發方法
date: 2018/05/08 author:Ryuusouei
MAC 底下 SDCC 編譯方法
要開發 C51 單片機之前,必須在 MAC 系統上先安裝 C51 的編譯器 SDCC,安裝完 SDCC 後,即可使用 SDCC 編譯 C語言檔案,使其編譯產生出可以用來燒錄的 HEX 檔文件
step 1:
「SDCC name.c」
[description]:
1.Open cmd.exe and navigate to xxxxx Folder. Type the following command to compile the C file.
2.If there are no errors ,the code will compile and generate several files that xxxxx.ihx is the hex file created by SDCC .
step 2:
「packihx name.ihx > name.hex」
step 3:
Downloading Hex file to 8051
MAC 燒錄 STC IC 的方法
將 HEX 檔燒錄到 STC 晶片之前,MAC 系統必須先安裝 “stcflash”的軟件, 透過 stcflash 才可以燒錄下載 HEX(BIN, ihx) 檔到 STC 的晶片當中。
請各位讀者要注意的事情,目前 stcflash 軟件僅支援燒錄的 IC 型號如下:STC89C5xRC, STC89C5xRD+, STC90C5xRC, STC10Fxx, STC11Fxx, STC12Cx052x, STC12C52xx, STC12C56xx, STC12C5Axx
step 1:
「stcflash name.ihx」
[description]:
更改 port 的方法:
預設用來燒錄通訊的 port 為 /dev/usbserial,
如果需要更改 port ,可以透過 -p 來指定 port 的位置,如
「stcflash name.ihx -p /dev/tty.wchusbserial1410」
更改 baudrate 的方法
預設燒錄的 baudrate 為 2400,可以透過 -l 來更改燒錄時的Baudrate 儘管大多數的場合不需要設定,操作方式如下:
「stcflash name.ihx -l 4800」
Note:目前測試下來,包率最高可以更改為4800,大於 4800 無法偵測到裝置,原因不明
把源代码编译成链接库文件.rel 的方法
透過底下的指令可以將 .c 的的文件,編譯成鏈結檔,等同於庫文件。在做大型專案或是函數庫時需要學會的技巧之一。
「sdcc -c delay.c」
[result]會發現檔案中產生出了 .rel 的鏈結庫文件,此文件可透過再次編譯組合來產生我們所知道的燒錄文件 .ihx
Note:
- 將檔案變成鏈結庫文檔的用意,主要是當一個專案很大的時候,程序內容會分做很多的 .c 檔來寫,這樣就需要個別編譯。而多個 .c 檔在做編譯時,需要花上許多時間來做編譯,也就會讓人感覺編譯很慢很久,所以普遍做法是哪個文件有被修改,就僅僅編譯被改過的文件。這時候採用 .rel 鏈結庫檔案就會快很多,因為從 .c 檔到 .rel 檔案,編譯已經幫你做了大多數的工作,只是差別在沒有做最後的組合。在一個大型的專案中,僅編譯被修改過的 .c 文檔到 .rel 檔,然後將所有的 .rel 檔組合再一起生成了為 .ihx 檔案,如此速度就會比較快速。
- 另外,當你寫了一個函數,此函數是可以通用的,可供許多人來使用,但是你不希望讓別人知道源代碼的內容或是為了要避免被其他人修改導致函數出錯。此時你可以只給對方 。rel 的文件及函數描述的頭文檔 .h檔,對可以可直接將你的函數放到他自己的專案內來做使用,而不用去管你的源代碼是如何來編寫的。
多個檔案要做鏈結編譯:
當你有多個檔案需要結合在一起產生燒錄檔的時候可以透過下列範例的方式來產生 .ihx 可燒錄檔。
「stcflash name.c delay.rel serial.rel」
SDCC 及 Keil C51 的語法差異
SDCC Keil C51
頭文檔 8051.h/8052.h reg51.h/reg52.h
IO端口 P2_0 P2^0
定義 #define LED P2_0 sbit LED = P2^0
中斷函數 void INT0() _interrupt 0 void INT0() interrupt 0
Keil C51 的編譯行為:
* 有些时候能使用 register 的地方非要用 data;
* 常數識別不足,比如 { a=2; b=3; c=a*b; },會老老實實的編譯成 3 个 MOV 和 一個 MUL,而不是直接 c=6;
* 會編譯出 SJMP 0 這樣的無用指令
SDCC 的編譯行為:
* a=(b<<8)|c,會先把 b<<8 和 c 都轉為 16bit int,然後再 orl;
* for (i=8; i>0; i--) {...} 不用 DJNZ,不過 for (i=8; i!=0; i--) {...}是編譯成 DJNZ 的;
补充:
Makefile的方式搭建Linux下的烧录环境https://www.cnblogs.com/zjutlitao/p/9292449.html