Ⅰ 如何在Windows平台下編譯esp8266 SOC源碼
一,安裝編譯環境
1,下載安裝文件Fans_ESP8266_SDK_Make.exe:
雙擊Fans_ESP8266_SDK_Make.exe執行安裝,默認安裝到C盤,不用改變安裝路徑,一路遇到選擇框就點擊「確定」和「允許」。安裝完成後,會在C盤根目錄下生成三個文件夾:c:\python27, c:\ESP8266_SDK_Fans_V2.0, c:\usr
2,需要配置license,用文本編譯器打開C:\usr\xtensa\XtDevTools\install\tools\RC-2010.1-win32\XtensaTools\Tools\lic\license.dat,在裡面有如下一行:HOSTID=1008B149EFD7,等號後面的是本機的mac地址,需要修改成自己電腦的MAC。選擇右下角的網路連接圖標,選擇網路連接詳情可查看:
二,編譯
進入到C:\usr\xtensa\esp_iot_sdk目錄下,下載測試用例(http://download.csdn.net/detail/yunjinwang/9629398),將auto_app_test和auto_lib兩個文件夾拷貝到這里,然後進入C:\usr\install目錄下,雙擊「xtensa_IOT」,將會運行一個dos窗口,最後一行應該是C:\usr\xtensa\esp_iot_sdk, 然後執行cd auto_app_test,
輸入make,如果編譯成功會有如下結果:
輸入makebin會生成對應的鏡像包Fans_SDK_flash.bin文件
三,刷機
首先確保PC機上沒有其它串口設備,可進入「設備管理」中查看com,如果有多個,不能確保一定能燒寫成功。
用USB轉串口板連接ESP8266串口腳到PC的USB口上,在「設備管理」中查看是否會生成一個com設備。同時需要將GPIO0接GND。(在我們的開發套件上,只需要把USB線把板和PC連上,用線將D3與GND連接,就OK了)
在dos窗口上輸入burnbin,就會開始刷機了。
當出現以下情況時,請確保1,GPIO0接GND,2,串口設置沒有被其它軟體打開。
四,運行
刷機完成後,將GPIO0與GND斷開,重新斷電或reset ,即可重新去行。
Ⅱ 如何使用eclipse搭建esp8266的開發環境
進入Cygwin的官網下載最新版的Cygwin軟體,根據自己的電腦選擇位數,32位的就選32位的系統。
再進入Eclipse CDT的官網,下載最新版的CDT軟體。
新建一個文件夾Eclipse-Neon,將下載好的兩個軟體放進去。
解壓eclipse軟體到當前文件夾中。
新建文件夾cygwin64,將cygwin的安裝軟體放進去。
進入cygwin64,雙擊打開set-x86_64.exe,開始在本地安裝cygwin環境。
選擇Install from Internet。
指定Cygwin軟體的根目錄位置。
指定Cygwin安裝的軟體包的存放路徑。
選擇聯網的方式。
主要是選擇需要安裝的linux軟體包,默認情況下,Cygwin沒有選擇C++開發所需要的包,需要選中軟體包。
等到安裝結束後,查看root目錄下是否安裝成功,添加Cygwin的路徑到Windows的用戶環境變數PATH中。
在cygwin命令行中查看當前安裝的gcc和gdb的版本,以驗證基本的軟體包是否安裝成功。
開始新建一個C語言工程,取名為test,編譯鏈工具選擇Cygwin GCC。
配置路徑映射,點擊調試按鈕,將調用GDB調試軟體即可。
Ⅲ 用匯編語言如何編譯一個程序
正文如下(復制虛線內文本,粘貼到rq.txt):
------------------------------------
a100
PUSH CS
POP DS
MOV AH,01
MOV CX,2020
INT 10
CLD
MOV DI,01F9
MOV AH,2A
INT 21
MOV AX,CX
PUSH DX
XOR DX,DX
MOV SI,03E8
DIV SI
MOV SI,DX
OR AL,30
STOSB
MOV AX,SI
MOV DL,64
DIV DL
MOV DH,AH
OR AL,30
STOSB
MOV AL,DH
CALL 01A0
INC DI
POP CX
MOV AL,CH
CALL 01A0
INC DI
MOV AL,CL
CALL 01A0
INC DI
MOV AH,2C
INT 21
PUSH DX
MOV AL,CH
CALL 01A0
INC DI
MOV AL,CL
CALL 01A0
INC DI
POP AX
MOV AL,AH
CALL 01A0
INC DI
MOV AH,2A
INT 21
MOV BL,09
MUL BL
MOV SI,01B0
ADD SI,AX
MOV CX,0009
REPZ
MOVSB
MOV AH,03
MOV BH,00
INT 10
MOV DL,15
MOV AH,02
INT 10
MOV AH,09
MOV DX,01F0
INT 21
MOV AH,01
INT 16
JNZ 018E
MOV CX,FFFF
LOOP 0184
MOV AX,0E0D
INT 10
JMP 0109
MOV AH,01
MOV CX,0E0F
INT 10
MOV AX,0E0A
INT 10
MOV AH,4C
INT 21
ADD [BX+SI],AL
MOV AH,00
MOV BH,0A
DIV BH
OR AX,3030
MOV DX,AX
STOSB
MOV AL,AH
STOSB
RET
PUSH BX
JNZ 0221
DB 64
DB 61
JNS 01E5
AND [BX+SI],AH
DEC BP
DB 6F
DB 6E
DB 64
DB 61
JNS 01EE
AND [BX+SI],AH
PUSH SP
JNZ 022A
JNB 022B
DB 61
JNS 01F8
AND [BX+65],DL
DB 64
DB 6E
DB 65
JNB 0236
DB 61
JNS 0229
DB 68
JNZ 024A
JNB 023E
DB 61
JNS 020B
INC SI
JB 0249
DB 64
DB 61
JNS 0212
AND [BX+SI],AH
PUSH BX
DB 61
JZ 025F
JB 0250
DB 61
JNS 021D
AND AL,54
DB 6F
DB 64
DB 61
JNS 0216
DB 69
JNB 0219
XOR DH,[BX+SI]
XOR [BX+SI],DH
SUB AX,3530
SUB AX,3130
AND [BP+SI],DH
XOR [BP+SI],BH
XOR [BX+SI],DH
CS:
XOR [BX+SI],DH
AND [DI+6F],CL
DB 6E
DB 64
DB 61
JNS 0242
AND [BX+SI],AH
AND AL,24
CS:
MOV CX,[9148]
CS:
MOV AX,[914A]
n RQ1.com
rcx
120
w
q
------------------------------------
進入DOS模式,先確保rq.txt在當前目錄,輸入
Debug<rq.txt
當前目錄會自動生成rq.com。
再運行rq.com就行了。
你只要不碰電腦,它就一直走,顯示當前時間。
我還用匯編寫了一個滿屏的大鍾(效果是電腦半屏數字電子鍾),自己寫著玩兒;
還有鍵盤電子琴,有興趣的可重編一下,要求:
1.三個八度音;2.屏顯電平表,低音綠燈,中音黃燈,高音紅燈。
Ⅳ 如何搭建自己平台的esp8266編譯器
ESP8266 SKD的開發環境有很多,官方的開發環境配置比較復雜,這里介紹使用安可信出品的集成開發環境ESP8266 IDE2.0,其實就是eclipse集成了相關的開發插件,用起來還是挺方便的,網上也有很多其它兄弟寫的現成的教程可以參考,我這里也重新再簡單介紹一下。
下載解壓壓縮包能得到三個可運行程序和幾個文件夾,ESP8266IDE.exe就是開發工具,ESP8266Flasher.exe是固件刷寫工具,這里我們使用官方的刷寫工具刷寫,這個可不管,運行ESP8266IDE.exe,隨便設置個工程目錄,用過eclipse的兄弟可能一眼就認出這個熟悉的界面了。解壓文件下有個project目錄,裡面其實就是官方給出的案例文件,一開始我們可以隨便導入一個工程案例,參考他們的框架來進行開發。
Ⅳ ESP8266編譯問題
你這程序編譯沒有錯誤嗎?在子程序中聲明變數
uint a=0;
前面有可執行語句,這聲明是無效的,這是keil的語法規定的,不同於c語言的語法。
Ⅵ 匯編語言和c語言的混合編程中,為什麼ESP+4可以用來接收c語言函數的參數
ESP用於指向棧的棧頂(下一個壓入棧的活動記錄的頂部),而棧由高地址向低地址成長,函數調用是用入棧的方式傳遞參數,故在函數處理參數時,ESP+4就是最後一個入棧的參數的地址,ESP+8就是再前一個參數的地址。
Ⅶ gcc的三級優化到底優化了哪些
這是個很惡心的問題。我乍一看覺得應該是655我再vc6.0上實驗(Debug模式)發現結果是555(vc6debug模式匯編代碼)004013A8movdwordptr[ebp-4],5;先將5給[ebp-4]004013AFmoveax,dwordptr[ebp-4];再將5傳給eax004013B2pusheax;將eax壓棧004013B3movecx,dwordptr[ebp-4];將5==>ecx004013B6movdwordptr[ebp-20h],ecx;將5==>[ebp-20h]004013B9movedx,dwordptr[ebp-20h];將5==>edx004013BCpushedx;將5壓棧004013BDmoveax,dwordptr[ebp-4]004013C0pusheax;還是將5壓棧004013C1pushoffsetstring"%d%d%d\n"(00426000)004013C6movecx,dwordptr[ebp-4]004013C9addecx,1004013CCmovdwordptr[ebp-4],ecx004013CFcallprintf(00401620)004013D4addesp,10h顯而易見結果是555了。不過我為了驗證又在release下運行了一把,發現結果竟然是656(vc6release模式匯編代碼),10hxoreax,eaxret暈。編譯器給優化了。。。顯而易見結果是656了還是不死心再看看linux下gcc編譯的發現結果也是656(gccdebug)00401326|.C744241C050>movdwordptr[esp+1C],5;|現將5放到[esp+1c]中0040132E|.8B44241Cmoveax,dwordptr[esp+1C];|5==>eax00401332|.FF44241Cincdwordptr[esp+1C];|[esp+1c]++;[esp+1c]等於6了00401336|.8B54241Cmovedx,dwordptr[esp+1C];|6==>edx0040133A|.8954240Cmovdwordptr[esp+C],edx;|這相當於pushedx也就是將6壓棧0040133E|.89442408movdwordptr[esp+8],eax;|這相當於pusheax也就是將5壓棧00401342|.8B44241Cmoveax,dwordptr[esp+1C];|將6放到eax中00401346|.89442404movdwordptr[esp+4],eax;|這相當於pusheax也就是將6壓棧0040134A|.C70424243040>movdwordptr[esp],00403024;|ASCII"%d%d%d",LF00401351|.E836060000call;\printf所以結果是656啦gcc的release和debug一樣。。還是不死心。有在vc2005的debug下運行了一把發現結果是656??(vc2005debug匯編代碼)00411B4Cmovdwordptr[ebp-0Ch],5;5==>[EBP-0c]00411B53moveax,dwordptr[ebp-0Ch]。;5==>eax00411B56movdwordptr[ebp-1194h],eax5==>[ebp-1194h]00411B5Cmovecx,dwordptr[ebp-0Ch];5==>ecx00411B5Faddecx,1;ecx++;ecx==6;00411B62movdwordptr[ebp-0Ch],ecx;6==>[ebp-0Ch]00411B65movesi,esp00411B67movedx,dwordptr[ebp-0Ch];6==>edx00411B6Apushedx;將6壓棧00411B6Bmoveax,dwordptr[ebp-1194h];5==>eax00411B71pusheax;將5壓棧00411B72movecx,dwordptr[ebp-0Ch];6==>ecx00411B75pushecx;將6壓棧00411B76pushoffsetstring"%d%d%d\n"(41E9ACh)00411B7Bcalldwordptr[__imp__printf(423780h)]00411B81addesp,10h結果是656唉。看來結果就是656啦。。vc2005和以後版本都注意到了這個問題。我也說不上哪個正確,你又相信哪個呢?
Ⅷ 誰知道匯編與c語言怎樣互相調用啊,還有怎樣在linux編譯啊,如果可以的話,就寫個簡單的程序介紹。謝謝哈
對於C和匯編語言的介面主要有兩個問題需要解決。
一、調用者與被調用者的參數傳遞
這種數據傳遞通過堆棧完成,在執行調用時從調用程序參數表中的最後一個參數開始 ,自動依次壓入堆棧;將所有參數壓入堆棧後,再自動將被調用程序執行結束後的返回地址 (斷點)壓入堆棧,以使被調程序結束後能返回主調程序的正確位置而繼續執行。例如一調用名為add匯編程序模塊的主函數:main( ){...... add(dest,op1,op2,flages);......}。在此例中對主函數進行反匯編,主函數在調用add函數前自動組織的堆棧。
.
.
.
lea 0xfffffffe8(%ebp),%eax #flages數組的首地址入棧
push %eax
pushl 0xfffffff8(%ebp) #OP2入棧
pushl 0xfffffffc(%ebp) #OP1 入棧
pushl 0xfffffff0(%ebp) #dest地址入棧
call 0x80483f0 <add> #調用add函數
.
.
進入匯編子程序後,為了能正確獲取主調程序並存入堆棧中的數據,被調的匯編子程序先後要做如下一些工作:
1、 保存esp的副本
進入匯編子程序後,子程序中免不了要有壓棧和出棧的操作,故ESP時刻在變化。為了能用 ESP訪問堆棧中的參數,安全辦法是一進入子程序後,先為ESP制副本,以後對傳遞參數的訪問 都用副本進行。一般可用EBP保存ESP,如:
push %ebp
mov %ebp,%esp
2、保留數據空間
如果匯編子程序中需要一些局部數據,可以簡單地減小ESP的值,以便在棧空間中保留出一段存貯區,用於存放局部數據,該區域須在子程序結束後恢復。如下語句可以保留一個局部數據區:
push %ebp
mov %ebp ,%esp
subl space,%esp;設space=4
movl $0x0,%ebp
movl $0x0,-2(%ebp)
如上語句段中,space是局部數據的總位元組數。在以後的應用中,由於ESP是變化的,而 EBP是 固定的,用負偏移量可以存取局部變數。上例利用EBP及偏移量,將兩個字的局部數 據初始化為0。
3、保留寄存器值
如果在被調子程序中用到ESI、EDI等其它寄存器,則應先把它們壓入堆棧,以保留寄存器原值 。例如,下例就是將ESI和EDI寄存器的值壓棧:
pushl %ebp
movl %ebp ,%esp
subl $space ,%esp,
pushl %esi
pushl %edi
4、獲取傳遞參數
作完了1~3步的操作後,結合上面C程序傳送參數這一例子,現在棧結構如圖二所示。
由此可見,EBP保留了ESP在參數傳遞完並將EBP壓棧後的一個副本,利用EBP可以很方便地訪問各參數。現假設各參數都是2位元組的整數值,在小模式編譯方式共佔用2個位元組。如果要將傳遞的參數op1、op2取出,並分別賦給ebx、ecx寄存器,可由下列語句完成這一功能:
movl 0x8(%ebp),%eax
movl 0xc(%ebp),%ecx
5、子程序返回值
當子程序的執行結果需要返回時,根據返回值的字長,C按如下約定接收返回值:1位元組在AL 寄存器中;2位元組在EAX寄存器中;4位元組則高位部分在EDX中、低位部分在EAX寄存器中。C可從這些寄存器中取出返回值。
6、退出匯編子程序
結束匯編子程序的步驟如下:
1) 若ESS、EDS、ESI或EDI已被壓棧,則需按保存它們的相反順序彈出它們。
2) 若在過程開始時分配了局部數據空間,則以指令 mov %esp和%ebp 恢復%esp。
3) 以指令pop %ebp 恢復%ebp ,該步是必須的。或者可以用leave語句來恢復%ebp 。它相當於movl %ebp, %esp; popl %ebp
4) 最後以ret結束匯編程序。
二、 說明和建立調用者與被調用者間的連系
為了建立調用與被調用模塊間的連接關系,被調用的匯編程序應用global,說明其可被外部模塊調用;而調用程序則應預先說明要引用的外部模塊名。下面通過我的例子進行說明,該例是C調用add0的匯編子程序。程序清單如下:
/* add.c */
#include <stdio.h>
extern void add(int *dest,int op1,int op2,short int*flages);
/*聲明調用外部的匯編函數*/
int main(void){
int op1,op2,result;
int *dest=&result;
short int flages[4]={0,0,0,0};
printf("please enter two soure operater:");
scanf("%x%x",&op1,&op2);
add(dest,op1,op2,flages);/*調用add0函數*/
printf("The result of ADD is :%x/n flages N(negative) Z(zero) C(carry) V(overflow:%d,%d,%d,%d/n",*dest,flages[3],flages[2],flages[1],flages[0]);
return 0;
}
#add.s
.text
.align 2
.global add
.type add,function
#定義add為外部可調用的函數
add:
push %ebp #ebp寄存器內容壓棧,保存add函數的上級調用函數的棧基地址
mov %esp,%ebp #esp值賦給ebp,設置add函數的棧基地址
mov 0x8(%ebp),%edx
mov 0x10(%ebp),%eax
add 0xc(%ebp),%eax
mov %eax,(%edx)
mov 0x14(%ebp),%eax
jo OF
C:
jc CF
S:
js SF
jz ZF
jmp out
OF:
movw $0x1,(%eax)
jmp C
CF:
movw $0x1,0x2(%eax)
jmp S
SF:
movw $0x1,0x6(%eax)
movw $0x0,0x4(%eax)
jmp out
ZF:
movw $0x1,0x4(%eax)
movw $0x0,0x6(%eax)
out:
leave #將ebp值賦給esp,pop先前棧內的上級函數棧的基地址給#ebp,恢復原棧基址
ret #add函數返回,回到上級的調用函數
其中.text 標志一個代碼段的開始,這是AT&T的段格式;global add;/n
type add,function說明add是公用的,可以由外部其它單獨編譯模塊調用。
將C源程序以文件名add.c存檔,匯編語言源程序以add.s 存檔;通過MAKE進行編譯和連接連接代碼如下:
all: myadd
myadd: adds.o addc.o
gcc –o myadd adds.o adc.o
adds.o: add.s
as –o adds.o add.s
addc.o: add.c
gcc –g –o addc.o add.c
由上可見,在C中調用匯編模塊很方便。所以我們在實際軟體開發中,可以採用混合編程的技術,從而盡可能利用各語言的優勢。既滿足實際問題的需要,又簡化設計過程,達到事半功倍的效果。
Ⅸ ESP32 ubantu環境下make出錯
esp32是樂鑫出品的一款集成了wifi和藍牙的集成模塊,板上自帶兩個哈佛結構的Xtensa LX6 CPU雙核處理器,本文主要講解如何在linux下搭建其編譯開發環境。
首先ctrl+alt+t打開終端,sudo -s選擇用root許可權登陸,以免後面的操作一直要sudo很麻煩。