问题标签 [xtensa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 如何在 xtensa 架构中映射重置向量?
我是 xtensa 架构的新手,第一步尝试映射重置向量。谷歌搜索将我带到 xtensa 的 Uboot 端口(https://github.com/jcmvbkbc/u-boot-tensa/blob/master/arch/xtensa/cpu/start.S),以下是代码;
我从链接 https://0x04.net/~mwk/doc/xtensa.pdf获得了 xtensa ISA (跳转指令第 3.8.4 节)
这是我的问题;
应该将电脑移动'1f',那么之后的代码有什么用?
标签 2: 和 1: 有什么用?
这使我不再试图理解其余的代码。我提前感谢任何帮助以更好地理解代码以及有关如何在 xtensa 中映射向量的任何其他参考。我不确定标签是否合适,但我无法创建标签 xtensa,所以我选择了最接近的标签。
gcc - gcc: xtensa LX106 (ESP8266) 缺少 ELF 可执行文件中的符号名称
我对 Xtensa LX106 CPU (ESP8266) 的 gcc (5.2.0) 有一个问题,当它们存在于 *.map 文件中时,它似乎从可执行文件 (ELF) 中省略了一些符号名称,我试图了解原因。
这是 *.map 文件的一部分
如您所见,从 inc_byte_array() 到 hex2num() 没有区别,两个函数在使用后就被链接了。
但是 objdump 找不到符号 hex2num(),它完全丢失了。结果,转储程序集是错误的:
// 这里停止 inc_byte_array()
// 这里是链接器填充填充 0x40214899 0x3
// 这里开始 hex2num() 但 ELF 缺少符号 :(
现在这是一个简单的例子,调用 hex2num() 很简单。但是有些情况下 ASM 转储是完全错误的,因为缺少符号,objdump 只会与函数之前转储的文字混淆(Xtensa LX106 类似于 Cortex M0)
此外,即使 *.map 在某些情况下也是错误的,例如,说
libwpa.a:(.literal. .text.*) .text.hostapd_derive_psk 0x40210000 0x56 W:\sensor_ovi\sw\sensor\app\esp8266\lib300\libwpa.a(ap_config.o) 填充 0x40210056 0x2 .text.hostapd_setup_wpa_psk 0x40210058 0x31 W:\sensor_ovi\sw\sensor\app\esp8266\lib300\libwpa.a(ap_config.o) 0x35(放松前的大小) 0x40210058 hostapd_setup_wpa_psk
所以我们应该在 40210000 处找到 hostapd_derive_psk(),大小为 0x56,后跟 2 个字节填充,然后在 0x40210058 处找到 hostapd_setup_wpa_psk()
这是 objdump 转储的内容:
// 完全丢失符号 hostapd_derive_psk() 40210000: 241630 extui a1, a3, 6, 3 40210003: df6540 excw 40210006: 2ac840100e583ffe { excw; extui a0, a0, 0, 2; add a12, a10, a8 } 4021000e: b44000 extui a4, a0, 0, 12 40210011: 0018 l32i.n a1, a0, 0 40210013: fb3140 excw 40210016: ff .byte 0xff 40210017: 22a142 movi a4, 0x122 4021001a: f0c112 addi a1, a1, -16 4021001d: 11c9 s32i.n a12, a1, 4 4021001f: 0109 s32i.n a0, a1, 0 40210021: 02cd mov.n a12, a2 40210023: 023c movi.n a2, 48 40210202 a0,
//正确40210058:F0C112 ADDI A1,A1,-16 4021005B:016102 S32I A0,A1,A1,4 4021005E:0F2202 L32I A0,A2,A2,A2,60 40210061:01B016 BEQZ A01B016 BEQZ A0,402100864,42100644444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444年: 0129 s32i.n a2, a1, 0 40210068: 00dc bnez.n a0, 4021007c 4021006a: 10c222 addi a2, a2, 16 4021006d: fffa45 call0 40210014
// Oopss.. 我们调用了 40210014,它没有在任何地方列出,甚至在 *.map 中也没有!
<_irom0_text_start+0x14> 40210070: 0042d6 bgez a2, 40210078 ...
所以让我们手动转储正确的代码
xtensa-lx106-elf-objdump -dz --start-address=0x40210014 --stop-address=0x40210057 sensor.elf > sensor.txt
如您所见,这是正确的转储汇编代码
回到最初的问题,为什么 gcc 会去除 *.map 文件中存在的符号?
感谢您的澄清,
performance - 如何找出执行 Xtensa 微处理器的特定指令(例如 wsr / rsr)所需的时间?
我正在尝试优化使用 xtensa LX6 微处理器的 esp32 上的代码,我想知道用于读取或写入特殊寄存器的 wsr 和 rsr 指令的成本。
assembly - 汇编器消息 -> 错误:寄存器编号超出范围
我正在尝试
mula.dd.ll.ldinc m3 , a5 , m0 ,m1
在具有 xtensa LX6 处理器的 ESP32 上使用我的汇编代码中的指令。
它不会对其他指令产生错误,但是对于它正在产生的这个特定指令register number out of range
。
我正在使用 a2-a4 来接收汇编代码中的参数并为我的目的使用其他寄存器。xtensa LX6 处理器有 16 个(AR,32 位)通用寄存器
我还尝试减少传递给汇编函数并使用的参数号
mula.dd.ll.ldinc m3 , a3 , m0 ,m1
但它提供了相同的错误
此语法与指令集中使用的语法完全相同。
c - 汇编程序消息:错误:尝试向后移动 .org
我正在使用 xtensa-esp32-elf-8.2.0 工具链进行编译(基于 gcc 8)。我还尝试使用 xtensa-esp32-elf-5.2.0 工具链(基于 gcc 5)。两者都生成相同的错误消息。
我写了一个跳转表,它有 10 次以下指令,基本上是用来跳转特定地址并执行特定指令。但是我在编译时遇到错误
汇编程序消息:错误:尝试向后移动 .org
我已经在网上冲浪了,但是大多数页面都没有提供可行的答案,或者他们说这是编译器版本问题(我认为这不是正确的解决方案,因为我使用了最新的工具链)
有人可以帮忙吗
我的跳转表的示例使用:
c - 来自命令行的有效负载不会覆盖堆栈
很抱歉,这异常长,我只是想让贡献者在发布之前看到我尝试过的内容。
我的代码:
当我通过这个命令行参数:AAAABBBBCCCCCDDDD\x19\x0c\x00\x60并查看前 20 个字时,我得到:
0x603ffeb0: 0x41414141 0x42424242 0x43434343 0x44444444
0x603ffec0: 0x3931785c 0x6330785c 0x3030785c 0x3036785c
0x603ffed0: 0x603fff00 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffee0: 0x60000b9c 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8
而不是这样的:
0x603ffeb0: 0x41414141 0x42424242 0x43434343 0x44444444
0x603ffec0: 0x60000c19 0x6330785c 0x3030785c 0x3036785c
0x603ffed0: 0x603fff00 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffee0: 0x60000b9c 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8
我认为存储在 argv[1] 中的有效负载在上面的代码中被视为单个字符串,而不是数组字符。我确认它表示为“AAAABBBBCCCCDDDD\\x19\\x0c\\x00\\x60”,这对我没有用,因为它会将地址重新转换为十六进制!
可以肯定的是,我决定直接通过参数来确认这一点(工作)
0x603ffeb0: 0x41414141 0x42424242 0x43434343 0x44444444
0x603ffec0: 0x60000c19 0x60000b04 0xe8e8e8e8 0xe8e8e8e8
0x603ffed0: 0x60000804 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffee0: 0x60000bb8 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8
命令行格式:(头疼的0x3931785c返回)
0x603ffeb0: 0x41414141 0x42424242 0x43434343 0x44444444
0x603ffec0: 0x3931785c 0x6330785c 0x3030785c 0x3036785c
0x603ffed0: 0x60000800 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffee0: 0x60000bc4 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8
0x603ffef0: 0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8
如何防止 argv[1] 中的有效负载被处理为
- AAAABBBBCCCCDDDD\\x19\\x0c\\x00\\x60
?
c++ - 在 Xtensa 上使用 TFLite 模型来加速 ML 算法
我正在使用 TFLite 模型在 Xtensa 上进行 CNN 加速。我使用了 TFlite 的卷积模型并将其导入 xtensa 以构建和运行模型。但是,在构建时我遇到了一个错误:
/build/tree/RG-2017.7_kuma/p4root/Xtensa/Software/xcc/be/cg/whirl2ops.cxx的第4373行断言失败:
Code_Expansion 阶段文件 U:/workspace/CNN/tensorflow/lite/core/api/flatbuffer_conversions.cc 中的编译器错误:
XGOTO 块没有 goto 的?(1315943)
xt-xcc 错误:C:/usr/xtensa/XtDevTools/install/tools/RG-2017.7-win32/XtensaTools/libexec/xcc/be.exe 返回非零状态 3
我无法找出导致此错误的原因。有人可以帮我吗?
c - “错误:尝试向后移动 .org”使用 Xtensa XCC,GCC 工作正常
这是一个最小的可重现示例:
使用 Tensilica Xtensa xt-xcc 编译器编译它会产生汇编错误:
这可能来自哪里?
注意:GCC 工作正常。
nm - nm 结果在符号名称中带有尾随数字
我有一个空程序:
当我运行时,nm path/to/exe --format=sysv
我会在符号名称中得到数字,例如file_mtx_85
和free_fn_89
.
使用不同的程序,我可以获得var_101
和var_102
. 我认为重复是因为我有多个具有该名称的符号,但为什么我在符号名称中得到数字,它们是什么意思?
我正在使用 Xtensa 编译器进行编译。
c - 包括用于 Xtensa Lx106 的标准库
我想为 ESP8266 编译一些 C 代码。我通过安装编译器
当我尝试编译一个简单的foo.c
使用
它报告以下错误:
我想我需要为另一个标准库添加包含路径?!我如何让它编译?