Ⅰ 如何在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很麻烦。