
1.在应用商店里搜索 C++
2.安装C/C++ IntelliSense, debugging, and code browsing
第二步:安装 VSCode ESP-IDF 扩展
1.在应用商店里搜索 Espressif
2.安装 Develop and debug applications for Espressif ESP32, ESP32-S2 chips with ESP-IDF (带乐鑫图标)
第三步:配置ESP-IDF 扩展
1.按 F1 或Ctrl+Shift+P 打开命令面板
2.输入 ESP-IDF: Configure ESP-IDF extension
加载初始设置时间较长,耐心等待
3.根据实际情况选择不同的配置方式
Express: IDF 版本 配置Python环境,扩展将安装IDF
Advanced: 手动配置已安装的开发环境
Using Existing Setup : 使用扩展检测出的环境
配置完成后显示:All settings have been configured. You can close this window.
第四步:创建项目模板,检测设置
1.按 F1 或Ctrl+Shift+P 打开命令面板 输入ESP-IDF:Create project 或按Ctrl+E+C
2.选择工程创建目录
3.选择模板类型
第五部:设置工作区的json文件
在settings.json文件中添加以下内容
"terminal.integrated.shell.windows": "cmd.exe",
"terminal.integrated.shellArgs.windows": ["/k", "c:\\esp\\esp-idf\\export.bat"],
"terminal.integrated.shell.linux": "/bin/bash",
"terminal.integrated.shellArgs.linux": ["--init-file", "~/esp/esp-idf/export.sh", "-i"],
"terminal.integrated.shell.osx": "/bin/bash",
"terminal.integrated.shellArgs.osx": ["--init-file", "~/esp/esp-idf/export.sh", "-i"],
"files.associations": {undefined
"*.md": "markdown",
"*.mdx": "tdx",
"stdio.h": "c"
},
可以在VSCode 终端中正常使用idf的各种命令。
第六步:编译工程
可以使用ESP扩展下的各个按钮完成项目的串口选择、项目配置、Full Clearn、编译、下载、监视
也可以使用命令行方式:
1.按Ctrl+` (~按键的位置)打开终端(第一次运行时扩展会有提示,选择允许 其实质就是运行~/esp/esp-idf/export.sh)
2.选择终止终端
3.重新打开终端 会看到export.sh运行的结果
Go to the project directory and run:
idf.py build
4.运行各种idf命令
第七部:下载程序并监测程序运行
1. 按Select Device Port 按钮 或运行 ESP-IDF:Device configuration命令
按提示选择/dev/ttyUSB1作为下载口
2.编译完成后,可使用下载按钮进行程序下载。此时会出现提示:
PermissionError: [Errno 13] Permission denied: '/dev/ttyUSB1'
原因:
$ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 2月 3 11:21 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 2月 3 11:21 /dev/ttyUSB1
发现ttyUSB* 设备属于root用户 dialout 用户组,当前用户不属于dialout用户组
解决方案:
(1).执行以下命令
$sudo chmod 666 /dev/ttyUSB*
修改ttyUSB设备权限为其它用户可读可写。
缺点:电脑重启后,又会出现这种问题,还要重新设置
(2).为了能让普通用户也能使用串口,可以增加udev规则来实现
$sudo vim /etc/udev/rules.d/70-ttyusb.rules
增加如下内容:
KERNEL=="ttyUSB[0-9]*",MODE="0666"
保存,重新插入USB转串口,普通用户就能搞定了
缺点:该方法会让所有的普通用户都具有访问这些串口设备的权限,存在一定的安全隐患
(3).将目标用户加入dialout用户组,可以使用以下任意一个命令
$sudo usermod -aG dialout <目标用户名>
或:
sudo gpasswd --add <目标用户名>dialout
重启系统即可
第八部:跟踪调试程序
1.按 OpenOCD Server 按钮 输出提示:
❌ Error: libusb_open() failed with LIBUSB_ERROR_ACCESS
❌ Error: no device foun
按照 https://sourceforge.net/p/openocd/code/ci/master/tree/README 文档解释做如下 *** 作:
(1). 将~/.espressif/tools/openocd-esp32/v0.10.0-esp32-20200709/openocd-esp32/share/openocd/contrib/
目录下的 60-openocd.rules 拷贝至 /etc/udev/rules.d/ 目录下
(2).确保当前用户属于 plugdev 用户组。 提示:运行 groups 命令可以查看当前用户所属的用户组
(3).重启系统
2.配置Debug 环境
参考:https://github.com/espressif/vscode-esp-idf-extension/blob/master/docs/DEBUGGING.md
注:该文档中的模板有坑。
问题:
使用 ESP-IDF Debug Adapter 配置时出现如下提示:
pygdbmi.gdbcontroller.NoGdbProcessError: gdb process has already finished with return code: 127
按照 esp_debug_adapter 说明文档 在~/.vscode/extensions/espressif.esp-idf-extension-0.6.1/esp_debug_adapter/ 目录下
$pip install -r requirements.txt
问题依然存在 暂无解决思路
使用 Microsoft C/C++ extension to debug 配置时出现如下提示:
error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
实质是系统中没有python2.7的库,解决:
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install libpython2.7
问题解决
同时也解决了使用 ESP-IDF Debug Adapter 配置时出现的问题 故是否需要pip install …… 不能确定
在使用 Microsoft C/C++ extension to debug 配置时 会提示出现异常,不用理会可正常跟踪调试。
有时会提示
Error: couldn’t bind tcl to socket: Address already in use
则证明 刚刚启动的 进程未被终止。
解决办法:
a).查看当前活动进程
netstat为显示网络相关信息 a(all:默认显示所有,如果加了其他选项此项不生效) n(number:以数字形式显示) t(仅仅显示tcp连接),p(process:显示该项是由哪个程序建立起来的)
$ sudo netstat -antp
b). 强制杀死它(假设进程号为3560,-9为强制杀死)
$ sudo kill -9 3560
Debug正常运行时,状态栏由蓝色变为棕色。
附:scode的各个json文件
c_cpp_properties.json
======================================
{undefined
"configurations": [
{undefined
"name": "ESP-IDF",
"compilerPath": "${default}",
"cStandard": "c11",
"cppStandard": "c++17",
"includePath": [
"${config:idf.espIdfPath}/components/**",
"${config:idf.espIdfPathWin}/components/**",
"${workspaceFolder}/**"
],
"browse": {undefined
"path": [
"${config:idf.espIdfPath}/components",
"${config:idf.espIdfPathWin}/components",
"${workspaceFolder}"
],
"limitSymbolsToIncludedHeaders": false
}
}
],
"version": 4
}
settings.json
======================================
{undefined
"terminal.integrated.shell.windows": "cmd.exe",
"terminal.integrated.shellArgs.windows": ["/k", "c:\\esp\\esp-idf\\export.bat"],
"terminal.integrated.shell.linux": "/bin/bash",
"terminal.integrated.shellArgs.linux": ["--init-file", "~/esp/esp-idf/export.sh", "-i"],
"terminal.integrated.shell.osx": "/bin/bash",
"terminal.integrated.shellArgs.osx": ["--init-file", "~/esp/esp-idf/export.sh", "-i"],
"files.associations": {undefined
"*.md": "markdown",
"*.mdx": "tdx",
"stdio.h": "c"
},
"C_Cpp.clang_format_style": "Visual Studio",
"editor.formatOnSave": false,
"[cpp]": {undefined
"editor.quickSuggestions": true
},
"[c]": {undefined
"editor.quickSuggestions": true
},
"C_Cpp.intelliSenseEngine": "Tag Parser",
//配置下载接口
"idf.port": "/dev/ttyUSB1",
//配置下载方式
"idf.flashType": "UART",
//openOcd配置,根据开发板确定
"idf.openOcdConfigs": [
//新版建议用“board/XXX” 配置
"interface/ftdi/esp32_devkitj_v1.cfg",
"target/esp32.cfg"
]
}
launch.json
======================================
{undefined
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{undefined
"type": "espidf",
"name": "ESP_Debug",
"request": "launch",
"debugPort": 43474,
"logLevel": 2,
//模板中有坑的地方,模板内容为 "mode": "manual",
//这样不能自动启动 Debug Adapter
"mode": "auto",
"initGdbCommands": [
"target remote :3333",
"symbol-file ${workspaceFolder}/build/${command:espIdf.getProjectName}.elf",
"set remote hardware-watchpoint-limit 2",
"mon reset halt",
"flushregs",
"thb app_main",
"c"
],
"env": {undefined
"PATH": "${env:PATH}:${config:idf.customExtraPaths}"
}
},
{undefined
"name": "GDB",
"type": "cppdbg",
"request": "launch",
"MIMode": "gdb",
"miDebuggerPath": "${command:espIdf.getXtensaGdb}",
"program": "${workspaceFolder}/build/${command:espIdf.getProjectName}.elf",
"windows": {undefined
"program": "${workspaceFolder}\\build\\${command:espIdf.getProjectName}.elf"
},
"cwd": "${workspaceFolder}",
"environment": [{ "name": "PATH", "value": "${config:idf.customExtraPaths}" }],
"setupCommands": [
{ "text": "-enable-pretty-printing",
"ignoreFailures": true },
{ "text": "file '${workspaceFolder}/build/${command:espIdf.getProjectName}.elf'"},
{ "text": "target remote :3333" },
{ "text": "set remote hardware-watchpoint-limit 2"},
{ "text": "mon reset halt" },
{ "text": "thb app_main" },
{ "text": "flushregs" }
//{ "text": "c"}
],
"externalConsole": false,
"logging": {undefined
"engineLogging": true
}
}
]
}
tasks.json 这个文用系统生成的即可 略
————————————————
版权声明:本文为CSDN博主「FuShaofeng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/FuShaofeng/article/details/113633337
编程语言Toit开源了!
Toit 是一种面向对象的物联网编程语言,在 IoT设备上能够实现秒级代码部署(注:如果使用C语言,一个简单的代码更改需要几分钟才能重新部署);同时,Toit也是一种现代的、内存安全的编程语言,集成了先进的编辑器功能,如语法高亮、goto-definitions 、代码自动补全等等。
Toit 编程语言具备以下特征:
Toit的出现是因为有一群软件工程师对IoT开发的现状感到不满,凭借着在Google为Flutter构建V8 JavaScript 引擎和Dart语言的丰富经验,他们开始自己构建适用于IoT的最佳平台。也正是在平台构建过程中,他们意识到必须有一种高效的编程语言来满足物联网的需求。最开始,他们尝试使用了Python和JavaScript,但在微控制器上,这两种语言的速度都不够快。
为了解决性能和健壮性问题,Toit团队开始研究Toit语言,经过测试发现,Toit在 ESP32 上的执行代码速度比 MicroPython 快 30 倍以上,同时学习门槛也很低,Python开发人员在几小时内就可以学会它。
为什么会选择开源Toit?Toit团队表示:“从一开始,我们就明确知道Toit肯定是会在某个时刻开源的,因为所有主流的编程语言都是开源的。开源可以获得充满活力的生态系统,编程语言才能被大规模采用。经过多次迭代和实际环境的应用,Toit语言已经成为微控制器编写强大软件的利器,我们希望更多开发者能够从中受益,因此选择将它开源出来。”
链接:https://juejin.cn/news/7034398085325422628
Toit 编译器、虚拟机和所有支持基础设施均在LGPL-2.1许可下获得许可。lib/目录中包含的标准库在MIT许可下获得许可。examples/ 目录中包含的示例在0BSD许可下获得许可。
某些子目录在它们自己的开源许可证下,在这些目录中有详细说明。这些子目录是:
虚拟机对 ESP-IDF 有要求,适用于 Linux 和 ESP32 构建(对于 Linux,它适用于 MBedTLS 实现)。
我们建议您使用 Toitware 的ESP-IDF fork,它有一些变化:
请记住将其添加到您的 ENV 中IDF_PATH:
如果要为 ESP32 构建映像,请安装 ESP32 工具。
在 Linux 上:
对于其他平台,请参阅乐鑫的文档。
请记住更新您的环境变量:
构建系统将自动使用 Toit 编译器的 32 位构建来为 ESP32 生成正确的可执行映像。如果您使用的是 64 位 Linux 机器并且您不支持编译安装的 32 位可执行文件,则您的构建可能会失败。您可以通过安装gcc-multilib和g++-multilib包在大多数 Linux 发行版上安装此支持。如果使用apt-get,则可以使用以下命令:
确保IDF_PATH已设置,如上所述。
然后在结帐的根目录下运行以下命令。
这将构建 Toit VM、编译器、语言服务器和包管理器。
然后你应该能够执行一个 toit 文件:
包管理器位于build/toitpkg:
语言服务器可以通过以下方式启动:
有关如何集成语言服务器,请参阅 IDE 的说明。
对于 VSCode,您还可以使用已发布的扩展。
对 Mac 构建的支持仍在进行中。目前,无法在 Mac 上为 ESP32 构建固件映像,因为它需要编译和运行 32 位可执行文件。我们正在努力 解决这个问题。
确保已设置 ESP32 工具的环境变量,如依赖项部分所述。
为您的 ESP32 设备构建一个可以使用esptool.py.
默认情况下,映像会启动并运行examples/hello.toit. 您可以使用自己的入口点并通过ESP32_ENTRYmake 变量指定它:
您可以通过设置ESP32_WIFI_SSID和 ESP32_WIFI_PASSWORDmake 变量轻松配置 ESP32 的内置 WiFi :
这允许 WiFi 在网络接口打开时自动启动。
Toit开源地址: https://github.com/toitlang/toit
在互联型产品中,CAN1和CAN2分享28个过滤器组,其它STM32F103xx系列产品中有14个过滤器组,用以对接收到的帧进行过滤。每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文从这些过滤器上"过"一下,能通过的报文是有效报文,收进相关联FIFO(FIFO1或FIFO2),不能通过的是无效报文(不是发给"我"的报文),直接丢弃。(标准CAN的标志长度是11位。扩展格式CAN的标志长度是29。CAN2.0A协议规定CAN控制器必须有一个11位的标识符。CAN2.0B协议中规定CAN控制器的标示符长度可以是11位或29位。STM32同时支持CAN2.0A/CAN2.0B协议。)每组过滤器组有两种工作模式:标识符列表模式和标识符屏蔽位模式。标识符屏蔽位模式:可过滤出一组标识符。此时,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。标识符列表模式:可过滤出一个标识。此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。注意:CAN_FilterIdHigh是指高16位CAN_FilterIdLow是低16位应该将需要得到的帧的和过滤器的设置值左对齐起。所有的过滤器是并联的,即一个报文只要通过了一个过滤器,就是算是有效的。按工作模式和宽度,一个过滤器组可以变成以下几中形式之一:(1) 1个32位的屏蔽位模式的过滤器。(2) 2个32位的列表模式的过滤器。(3) 2个16位的屏蔽位模式的过滤器。(4) 4个16位的列表模式的过滤器。每组过滤器组有两个32位的寄存器用于存储过滤用的"标准值",分别是FxR1,FxR2。在32位的屏蔽位模式下:有1个过滤器。FxR2用于指定需要关心哪些位,FxR1用于指定这些位的标准值。在32位的列表模式下:有两个过滤器。FxR1指定过滤器0的标准值FxR2指定过滤器1的标准值。收到报文的标识符只有跟FxR1与FxR1其中的一个完全相同时,才算通过。在16位的屏蔽位模式下:有2个过滤器。FxR1配置过滤器0,其中,[31-16]位指定要关心的位,[15-0]位指定这些位的标准值。FxR2配置过滤器1,其中,[31-16]位指定要关心的位,[15-0]位指定这些位的标准值。在16位的列表模式下:有4个过滤器。FxR1的[15-0]位配置过滤器0,FxR1的[31-16]位配置过滤器1。FxR2的[15-0]位配置过滤器2,FxR2的[31-16]位配置过滤器3。STM32的CAN有两个FIFO,分别是FIFO0和FIFO1。为了便于区分,下面FIFO0写作FIFO_0,FIFO1写作FIFO_1。每组过滤器组必须关联且只能关联一个FIFO。复位默认都关联到FIFO_0。所谓“关联”是指假如收到的报文从某个过滤器通过了,那么该报文会被存到该过滤器相连的FIFO。从另一方面来说,每个FIFO都关联了一串的过滤器组,两个FIFO刚好瓜分了所有的过滤器组。每当收到一个报文,CAN就将这个报文先与FIFO_0关联的过滤器比较,如果被匹配,就将此报文放入FIFO_0中。如果不匹配,再将报文与FIFO_1关联的过滤器比较,如果被匹配,该报文就放入FIFO_1中。如果还是不匹配,此报文就被丢弃。每个FIFO的所有过滤器都是并联的,只要通过了其中任何一个过滤器,该报文就有效。如果一个报文既符合FIFO_0的规定,又符合FIFO_1的规定,显然,根据 *** 作顺序,它只会放到FIFO_0中。每个FIFO中只有激活了的过滤器才起作用,换句话说,如果一个FIFO有20个过滤器,但是只激话了5个,那么比较报文时,只拿这5个过滤器作比较。一般要用到某个过滤器时,在初始化阶段就直接将它激活。需要注意的是,每个FIFO必须至少激活一个过滤器,它才有可能收到报文。如果一个过滤器都没有激活,那么是所有报文都报废的。一般的,如果不想用复杂的过滤功能,FIFO可以只激活一组过滤器组,且将它设置成32位的屏蔽位模式,两个标准值寄存器(FxR1,FxR2)都设置成0。这样所有报文均能通过。(STM32提供的例程里就是这么做的!)STM32 CAN中,另一个较难理解的就是过滤器编号。过滤器编号用于加速CPU对收到报文的处理。收到一个有效报文时, CAN会将收到的报文 以及它所通过的过滤器编号, 一起存入接收邮箱中。CPU在处理时,可以根据过滤器编号,快速的知道该报文的用途,从而作出相应处理。不用过滤器编号其实也是可以的, 这时候CPU就要分析所收报文的标识符, 从而知道报文的用途。由于标识符所含的信息较多,处理起来就慢一点了。STM32使用以下规则对过滤器编号:(1) FIFO_0和FIFO_1的过滤器分别独立编号,均从0开始按顺序编号。(2) 所有关联同一个FIFO的过滤器,不管有没有被激活,均统一进行编号。(3) 编号从0开始,按过滤器组的编号从小到大,按顺序排列。(4) 在同一过滤器组内,按寄存器从小到大编号。FxR1配置的过滤器编号小,FxR2配置的过滤器编号大。(5) 同一个寄存器内,按位序从小到大编号。[15-0]位配置的过滤器编号小,[31-16]位配置的过滤器编号大。(6) 过滤器编号是d性的。 当更改了设置时,每个过滤器的编号都会改变。但是在设置不变的情况下,各个过滤器的编号是相对稳定的。这样,每个过滤器在自己在FIFO中都有编号。在FIFO_0中,编号从0 -- (M-1), 其中M为它的过滤器总数。在FIFO_1中,编号从0 -- (N-1),,其中N为它的过滤器总数。一个FIFO如果有很多的过滤器,,可能会有一条报文, 在几个过滤器上均能通过,这时候,,这条报文算是从哪儿过来的呢?STM32在使用过滤器时,按以下顺序进行过滤:(1) 位宽为32位的过滤器,优先级高于位宽为16位的过滤器。(2) 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式。(3) 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高。按这样的顺序,报文能通过的第一个过滤器,就是该报文的过滤器编号,被存入接收邮箱中。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)