问题标签 [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.

0 投票
1 回答
178 浏览

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,所以我选择了最接近的标签。

0 投票
1 回答
151 浏览

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 文件中存在的符号?

感谢您的澄清,

0 投票
1 回答
81 浏览

performance - 如何找出执行 Xtensa 微处理器的特定指令(例如 wsr / rsr)所需的时间?

我正在尝试优化使用 xtensa LX6 微处理器的 esp32 上的代码,我想知道用于读取或写入特殊寄存器的 wsr 和 rsr 指令的成本。

0 投票
1 回答
134 浏览

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

但它提供了相同的错误

此语法与指令集中使用的语法完全相同。

0 投票
1 回答
897 浏览

c - 汇编程序消息:错误:尝试向后移动 .org

我正在使用 xtensa-esp32-elf-8.2.0 工具链进行编译(基于 gcc 8)。我还尝试使用 xtensa-esp32-elf-5.2.0 工具链(基于 gcc 5)。两者都生成相同的错误消息。

我写了一个跳转表,它有 10 次以下指令,基本上是用来跳转特定地址并执行特定指令。但是我在编译时遇到错误

汇编程序消息:错误:尝试向后移动 .org

我已经在网上冲浪了,但是大多数页面都没有提供可行的答案,或者他们说这是编译器版本问题(我认为这不是正确的解决方案,因为我使用了最新的工具链)

有人可以帮忙吗

我的跳转表的示例使用:

0 投票
0 回答
82 浏览

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

?

0 投票
0 回答
100 浏览

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

我无法找出导致此错误的原因。有人可以帮我吗?

0 投票
2 回答
364 浏览

c - “错误:尝试向后移动 .org”使用 Xtensa XCC,GCC 工作正常

这是一个最小的可重现示例:

使用 Tensilica Xtensa xt-xcc 编译器编译它会产生汇编错误:

这可能来自哪里?

注意:GCC 工作正常。

0 投票
0 回答
25 浏览

nm - nm 结果在符号名称中带有尾随数字

我有一个空程序:

当我运行时,nm path/to/exe --format=sysv我会在符号名称中得到数字,例如file_mtx_85free_fn_89.

使用不同的程序,我可以获得var_101var_102. 我认为重复是因为我有多个具有该名称的符号,但为什么我在符号名称中得到数字,它们是什么意思?

我正在使用 Xtensa 编译器进行编译。

0 投票
0 回答
50 浏览

c - 包括用于 Xtensa Lx106 的标准库

我想为 ESP8266 编译一些 C 代码。我通过安装编译器

当我尝试编译一个简单的foo.c

使用

它报告以下错误:

我想我需要为另一个标准库添加包含路径?!我如何让它编译?