搜索
bottom↓
回复: 50

riscv的编译环境要怎么安装和用起来?请坛友分享一下使用技巧

[复制链接]

出0入18汤圆

发表于 2024-6-4 10:42:06 | 显示全部楼层 |阅读模式
在fpga上跑riscv,需要安装编译环境,github上的readme写的太简单了,根本就执行不下去
网上找了几篇blog比着试,发现也是各种报错
这东西太麻烦了,又要linux,又要各种命令行,搞半天工具都装不上
有没有win下ide环境可以用呢,请坛友分享一下riscv的使用技巧

感谢!

https://github.com/riscv-collab/riscv-gnu-toolchain

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入17汤圆

发表于 2024-6-4 11:18:57 | 显示全部楼层
放弃吧!

出0入16汤圆

发表于 2024-6-4 11:22:13 | 显示全部楼层
为什么跑RISCV

出0入18汤圆

 楼主| 发表于 2024-6-4 11:41:42 | 显示全部楼层

一个开源的参考设计,里面用了riscv,想跑起来试试

出0入18汤圆

 楼主| 发表于 2024-6-4 11:52:05 | 显示全部楼层

为啥劝退?被坑过吗

出0入442汤圆

发表于 2024-6-4 12:00:25 | 显示全部楼层
ide是标准linux。eclipse可以直接用。

编译器自己找riscv toolchain,git下来然后慢慢build,很详细。

系统的话可能不太好搞,你试试buildroot,我没有折腾。不跑系统的话随意。

fpga上面有vexriscv,可以直接例化soc练手,熟练了可以自己用核搭soc。

想省rom,gcc需要自己改一下floatunsisf,floatundisf等几个api,libgcc转换先double再float,要多几百字节。

出0入17汤圆

发表于 2024-6-4 12:07:23 | 显示全部楼层
smbxfdbz 发表于 2024-6-4 11:52
为啥劝退?被坑过吗
(引用自5楼)

开源的东西是需要花时间、沉下心去搞清楚的,首先搞清楚你用的开源核的ISA配置,再去找对应的工具链,如果相用IDE,可以尝试segger的,另外,Quartus现在也直接内置了RV的工具链

出0入328汤圆

发表于 2024-6-4 12:23:47 来自手机 | 显示全部楼层
docker 很简单,唯一要解决科学上网

出0入4汤圆

发表于 2024-6-4 13:03:11 | 显示全部楼层
https://gitee.com/liangkangnan/tinyriscv
参考这里的4.1和4.4

出0入17汤圆

发表于 2024-6-4 13:24:12 来自手机 | 显示全部楼层
smbxfdbz 发表于 2024-6-4 11:52
为啥劝退?被坑过吗
(引用自5楼)

开源核的名称是什么?最好用它指定的编译好的toolchain,省去很多踩坑过程

出0入18汤圆

 楼主| 发表于 2024-6-4 16:14:40 | 显示全部楼层
wye11083 发表于 2024-6-4 12:00
ide是标准linux。eclipse可以直接用。

编译器自己找riscv toolchain,git下来然后慢慢build,很详细。
(引用自6楼)

请教大神,这个有没有widows下能直接编译调试的那种IDE?

出0入442汤圆

发表于 2024-6-4 18:45:13 | 显示全部楼层
smbxfdbz 发表于 2024-6-4 16:14
请教大神,这个有没有widows下能直接编译调试的那种IDE?
(引用自11楼)

调试的话你得研究openocd,我没折腾过。都是在win上编译仿真测试之后丢板子上。

出0入18汤圆

 楼主| 发表于 2024-6-4 19:04:28 来自手机 | 显示全部楼层
wye11083 发表于 2024-6-4 18:45
调试的话你得研究openocd,我没折腾过。都是在win上编译仿真测试之后丢板子上。 ...
(引用自12楼)

在win上编译一般用什么工具,怎么搭建坏境?

出0入442汤圆

发表于 2024-6-4 19:40:25 | 显示全部楼层
smbxfdbz 发表于 2024-6-4 19:04
在win上编译一般用什么工具,怎么搭建坏境?
(引用自13楼)

我用wsl+makefile。你得自己找。

出215入118汤圆

发表于 2024-6-4 21:54:14 | 显示全部楼层
本帖最后由 snowy 于 2024-6-4 21:55 编辑
smbxfdbz 发表于 2024-6-4 16:14
请教大神,这个有没有widows下能直接编译调试的那种IDE?
(引用自11楼)


Embedded Studio for RISC-V

出0入18汤圆

 楼主| 发表于 2024-6-8 11:00:27 | 显示全部楼层
wye11083 发表于 2024-6-4 19:40
我用wsl+makefile。你得自己找。
(引用自14楼)

大神,再向你请教个问题,riscv编译工具链我装好了,编译简单的测试代码也正常
但是我编译一个开源代码时,里面用到了类似下面这种代码,编译会报错:test.c:3: Error: unrecognized opcode `csrr t0,misa', extension `zicsr' required
int main(int argc, char *argv[])
{
  asm volatile ("csrr t0, misa");
  return 0;
}

github上有人探讨这个问题,但是我这方面水平太菜,没看明白怎么弄,能帮忙看下怎么处理这个问题吗?感谢!
https://github.com/riscv-collab/riscv-gnu-toolchain/issues/1262

出0入18汤圆

 楼主| 发表于 2024-6-8 11:18:10 | 显示全部楼层
wye11083 发表于 2024-6-4 19:40
我用wsl+makefile。你得自己找。
(引用自14楼)


刚测试添加 -march=rv32im_zicsr,测试代码可以编译通过
riscv32-unknown-elf-gcc -march=rv32im_zicsr test.c -o test.exe

但是那个开源设计,用cmake+make编译的,如何把 -march=rv32im_zicsr这个配置传进make里呢?

出0入442汤圆

发表于 2024-6-8 11:23:22 | 显示全部楼层
smbxfdbz 发表于 2024-6-8 11:00
大神,再向你请教个问题,riscv编译工具链我装好了,编译简单的测试代码也正常
但是我编译一个开源代码时 ...
(引用自16楼)

没遇到你说的问题,你装的gcc版本太老了吧,或者是llvm。从源码编译的不存在这个问题。csrr/csrw/csrwi都是非常常规的操作,只要你核带csr模块就是标准读写。

想要编译后体积小,建议11.1。新版本编译后反而大了。

cmake不知道怎么用,你得上网查。

编译gcc时一定要传入正确的--with-arch和--with-abi,否则gcc用的库不一定是正确的。即,rv32g编译rv32em程序是有可能不工作的。

出0入0汤圆

发表于 2024-6-8 13:39:33 | 显示全部楼层
riscv可以参考沁恒的开发环境

出0入228汤圆

发表于 2024-6-8 18:22:24 来自手机 | 显示全部楼层
vscode   +  plaoformio

出0入18汤圆

 楼主| 发表于 2024-6-9 09:59:06 | 显示全部楼层
wye11083 发表于 2024-6-8 11:23
没遇到你说的问题,你装的gcc版本太老了吧,或者是llvm。从源码编译的不存在这个问题。csrr/csrw/csrwi都 ...
(引用自18楼)


我用的是13.2,已经是最新的了
如何安装旧版本的呢?github是有编译好的文件,但是--with-arch= --with-abi=参数不对,如果想修改话这两个参数的话,是不是只能自己重新编译?
如何clone旧版本的代吗呢?

出0入442汤圆

发表于 2024-6-9 10:14:00 | 显示全部楼层
smbxfdbz 发表于 2024-6-9 09:59
我用的是13.2,已经是最新的了
如何安装旧版本的呢?github是有编译好的文件,但是--with-arch= --with-a ...
(引用自21楼)

那你就用13.2,重新编译。riscv toolchain有详细说明。

出0入18汤圆

 楼主| 发表于 2024-6-9 10:27:31 | 显示全部楼层
wye11083 发表于 2024-6-9 10:14
那你就用13.2,重新编译。riscv toolchain有详细说明。
(引用自22楼)

我重新编译过13.2,--with-arch --with-abi都是对的,但就是用他编译我要用的那个开源工程时,csr指令报错
用github release的11.1版本可以编译csr,但编译提示can't link soft-float modules with double-float modules,感觉是--with-abi不对
所以我想修改一下--with-abi,重新编译11.1,大神能否提示一下,编译旧版本的toolchain,如何操作?
我直接下载releases目录下的source code尝试编译,但里面的目录基本上都是空的,根本编译不了,提示:did not match any file(s) known to git

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入442汤圆

发表于 2024-6-9 13:04:14 | 显示全部楼层
smbxfdbz 发表于 2024-6-9 10:27
我重新编译过13.2,--with-arch --with-abi都是对的,但就是用他编译我要用的那个开源工程时,csr指令报错 ...
(引用自23楼)

编译脚本也要加上正确的-mabi  -march

出0入18汤圆

 楼主| 发表于 2024-6-9 16:43:39 来自手机 | 显示全部楼层
wye11083 发表于 2024-6-9 13:04
编译脚本也要加上正确的-mabi  -march
(引用自24楼)

我找到个方法,用checkout可以检出历史版本
历史版本很多,随便找了个21年的,编译出来是10.2,用这个版本编译那个开源代码,确实能编译成功。
但我有个疑问,不同版本的toolchain编译出来的执行文件是否通用呢?会不会开发者调试时用的新版本,而使用者用老版本,导致编译出来的执行文件运行不了?

出0入442汤圆

发表于 2024-6-9 17:09:01 | 显示全部楼层
smbxfdbz 发表于 2024-6-9 16:43
我找到个方法,用checkout可以检出历史版本
历史版本很多,随便找了个21年的,编译出来是10.2,用这个版 ...
(引用自25楼)

有可能的。尽量用较新版本。不过目前riscv全都是碎片化,各家都有各自的魔改,所以基本不存在你说的情况。

出0入18汤圆

发表于 2024-6-11 11:27:01 | 显示全部楼层
win下最简单的就是segger embedded studio了,然后调试直接用jlink。

出0入18汤圆

 楼主| 发表于 2024-6-13 17:23:04 | 显示全部楼层
wye11083 发表于 2024-6-9 17:09
有可能的。尽量用较新版本。不过目前riscv全都是碎片化,各家都有各自的魔改,所以基本不存在你说的情况 ...
(引用自26楼)

大神,再请教点问题,这个开源设计我翻了一遍所有代码,没有网表,也没有封装起来的库文件,开源的很彻底
我本来以为他是完全免费的,后来发邮件问,回复说是要收费25000欧元的,开源的代码仅用于评估,工作一小时候后,会停止工作
我的问题就是,既然开源了所有代码,他怎么限止只能工作1小时呢?是赌用户找不到这个一小时限止在代码的那个地方吗?还是有什么其他的方法限止工作时间?
帮忙指点一下实现思路吧



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入442汤圆

发表于 2024-6-13 17:31:36 | 显示全部楼层
smbxfdbz 发表于 2024-6-13 17:23
大神,再请教点问题,这个开源设计我翻了一遍所有代码,没有网表,也没有封装起来的库文件,开源的很彻底 ...
(引用自28楼)

??一小时之后不能用了? 这不太好办,其它部分能工作么?其它部分能工作就检查信号,否则芯片被保护了。

出0入18汤圆

 楼主| 发表于 2024-6-13 17:40:11 | 显示全部楼层
本帖最后由 smbxfdbz 于 2024-6-13 17:41 编辑
wye11083 发表于 2024-6-13 17:31
??一小时之后不能用了? 这不太好办,其它部分能工作么?其它部分能工作就检查信号,否则芯片被保护了 ...
(引用自29楼)


和芯片没关系,他是跑在FPGA上的
我感觉一定是要在代码里控制的,可既然开源了代码,那不是代码改一下就绕过lecense了吗?是不是作者觉得别人找不到?还是有其他方法控制呢

出0入442汤圆

发表于 2024-6-13 20:42:05 | 显示全部楼层
smbxfdbz 发表于 2024-6-13 17:40
和芯片没关系,他是跑在FPGA上的
我感觉一定是要在代码里控制的,可既然开源了代码,那不是代码改一下就 ...
(引用自30楼)

你测过1个小时后会挂掉?

出0入18汤圆

 楼主| 发表于 2024-6-13 20:57:25 来自手机 | 显示全部楼层
wye11083 发表于 2024-6-13 20:42
你测过1个小时后会挂掉?
(引用自31楼)

我还没测,要做板子才能测,我只是发邮件问了一下作者,他说只能工作一小时

出0入442汤圆

发表于 2024-6-13 22:10:38 | 显示全部楼层
smbxfdbz 发表于 2024-6-13 20:57
我还没测,要做板子才能测,我只是发邮件问了一下作者,他说只能工作一小时 ...
(引用自32楼)

。。。开源的应该没限制。商业版本有限制。

出0入18汤圆

 楼主| 发表于 2024-6-14 09:45:22 | 显示全部楼层
wye11083 发表于 2024-6-13 22:10
。。。开源的应该没限制。商业版本有限制。
(引用自33楼)

作者的回复是:The open source IP-core on GitHub can be used for evaluation and demo purposes. The IP-core will stop operating after 1 hour.
If the DP IP-core is used in a commercial project, then a license is required.

应该就是在代码里加了逻辑控制,商用一般没人会尝试破解,毕竟会有各种技术风险

出0入442汤圆

发表于 2024-6-15 13:53:19 | 显示全部楼层
smbxfdbz 发表于 2024-6-14 09:45
作者的回复是:The open source IP-core on GitHub can be used for evaluation and demo purposes. The  ...
(引用自34楼)

他这套硬件应该是完整的。固件里面做了限制。注意看这几个文件:

DisplayPort-main.zip\DisplayPort-main\software\src\lib\

这里面有几个ram/rom文件,这个是通过主SOC下载进从SOC里面的(估计有3个RISCV)。这两个是没有给源码的,估计license是另外下载进去的。

出0入18汤圆

 楼主| 发表于 2024-6-16 09:36:21 来自手机 | 显示全部楼层
wye11083 发表于 2024-6-15 13:53
他这套硬件应该是完整的。固件里面做了限制。注意看这几个文件:

DisplayPort-main.zip\DisplayPort-mai ...

(引用自35楼)

是的,应该是在这里封闭了部分源码
我是需要实现edp1.4 ip的一收两发,要放进封装厚度小于1mm的芯片,找了一圈只找到AU15P以下的型号参数合适封装也合适,但这个资源远放不下官方edp IP。所以我就尝试找其他IP方案。有家方案商过来聊了一下,说是他们从新思采购的IP,当时花了100万美金,用了一年才消化用起来。帮我出方案,就要找新思裁剪IP,才能放进AU15P以下的型号,给我预估了200万费用,可以承诺搞不定退款。
我的疑问就是,搞定这个事情真的要这么多钱吗?大神能否给点方案选型建议

出0入442汤圆

发表于 2024-6-16 13:49:35 | 显示全部楼层
smbxfdbz 发表于 2024-6-16 09:36
是的,应该是在这里封闭了部分源码
我是需要实现edp1.4 ip的一收两发,要放进封装厚度小于1mm的芯片,找 ...
(引用自36楼)

??一收两发直接复制显示?如果只是这个简单的需求,你需要做几件事情:
(1)打通aux通道。建议的话可以考虑做个aux中继,或者直接把aux连到后端输出接口,这样foga就不用对付aux了(aux接口协议非常麻烦,几百个api)。
(2)打通serdes的drp通道,可以动态配置速率(非常关键)。如果显示器分辨率/帧率是固定的,理论上可以写死。
(3)serdes直接透传,不做协议解析。做解析就非常复杂了,拆包,解包,聚合,重组,链路管理,。。,etc。最简单的就是,clk使用rxclk,然后rxd直接给txd。这里可能存在一些稳定性风险,因此还是建议做一些最基本的工作,比如检测any sop重同步再转发,这样可以在中间插入idle而不至于丢数据。这样是不需要解包的,只需要一个同步器。
如果还需要对付分辨率切换,就麻烦了。如果链路速率变化,则fpga肯定会出问题。

出0入18汤圆

 楼主| 发表于 2024-6-16 15:16:34 来自手机 | 显示全部楼层
wye11083 发表于 2024-6-16 13:49
??一收两发直接复制显示?如果只是这个简单的需求,你需要做几件事情:
(1)打通aux通道。建议的话可 ...

(引用自37楼)

输入的帧率要切换,类似显示器有60hz 120hz之类的,输出帧率与输入同步。这种场景分辨率和lane速率应该是不变的,但我不想自己做ip,很麻烦,而且也担心健壮性。搞定这类ip需要几百万这么多吗?

出0入442汤圆

发表于 2024-6-16 15:36:30 | 显示全部楼层
smbxfdbz 发表于 2024-6-16 15:16
输入的帧率要切换,类似显示器有60hz 120hz之类的,输出帧率与输入同步。这种场景分辨率和lane速率应该是 ...
(引用自38楼)


商用级ip 百万$非常正常。

所以不想花钱就自己搞定速率切换,然后直接转发就行了。

出0入18汤圆

 楼主| 发表于 2024-6-17 08:27:36 来自手机 | 显示全部楼层
wye11083 发表于 2024-6-16 15:36
商用级ip 百万$非常正常。

所以不想花钱就自己搞定速率切换,然后直接转发就行了。 ...

(引用自39楼)

这个我感觉也就你这样的大神有能力自己做,我是没把握自己做,也不敢让公司的fpga工程做,健壮性与开发周期都不可控,只能想办法找商用IP资源。如果行情就是几百万,那也没办法,研发不是闭门造车,该花的省不了。

出0入442汤圆

发表于 2024-6-17 08:41:14 | 显示全部楼层
smbxfdbz 发表于 2024-6-17 08:27
这个我感觉也就你这样的大神有能力自己做,我是没把握自己做,也不敢让公司的fpga工程做,健壮性与开发周 ...
(引用自40楼)

你这做个纯bridge还好吧

出0入18汤圆

 楼主| 发表于 2024-6-18 17:34:47 | 显示全部楼层
wye11083 发表于 2024-6-15 13:53
他这套硬件应该是完整的。固件里面做了限制。注意看这几个文件:

DisplayPort-main.zip\DisplayPort-mai ...
(引用自35楼)

抱着学习的心态,我在看parretto的开源代码,他在PL里只例化了一个riscv cpu呀,没有例化多个cpu

而且我看lib文件夹下的ram和rom数据,是初始化时在下面这个函数里使用的
他这个初始化过程是遍历lib下的一个rom数组,然循环赋值给dp->dev->mem

// DP Initialize rom
void prt_dp_rom_init (prt_dp_ds_struct *dp, uint32_t len, uint8_t *rom)
{
        uint32_t dat;

        // Start initialization
        dp->dev->ctl = PRT_DP_CTL_MEM_STR;

        for (int word = 0; word < (len/4)+1; word++)
        {
                for (int byte = 3; byte >= 0; byte--)
                {
                        dat <<= 8;
                        dat |= rom[(word * 4) + byte];
                }
                dp->dev->mem = dat;
        }
}

dp->dev->mem其实只是prt_dp_ds_struct结构体里的prt_dp_dev_struct结构体里的一个成员变量,上面这个循环的结果好像只是把rom的最后四个字节赋值给dp->dev->mem,感觉完成是无效操作
这里完全没理解是个什么操作原理,大神能帮忙再解下疑吗?

// Device structure
typedef struct {
  uint32_t ctl;                         // Control
  uint32_t sta;                         // Status
  uint32_t mail_out;                // Mail out (pm -> host)
  uint32_t mail_in;                 // Mail in (host -> pm)
  uint32_t aux;                         // AUX
  uint32_t mem;                         // Memory update
} prt_dp_dev_struct;


// Data structure
typedef struct {
        uint8_t                                                                 id;
        volatile prt_dp_dev_struct                                 *dev;                        // Device
        prt_dp_mail_ds_struct                                         mail_in;                // Mail in
        prt_dp_mail_ds_struct                                         mail_out;                // Mail out
        volatile prt_dp_debug_struct                        debug;                        // Debug
        volatile uint32_t                                                 evt;                        // Event
        prt_dp_cb_struct                                                cb;                                // Callback
        prt_dp_sta_struct                                                sta;                        // Status
        prt_dp_trn_struct                                                trn;                        // Training
        prt_dp_hpd_type                                                 hpd;                        // HPD
        prt_dp_lnk_struct                                                lnk;                        // Link
        prt_dp_vid_struct                                                vid[2];                        // Video
        prt_dp_edid_struct                                                edid;                        // EDID
#ifdef PRT_SIM
        prt_dp_aux_ds_struct                                        aux;                        // AUX
#endif
} prt_dp_ds_struct;

出0入442汤圆

发表于 2024-6-18 18:17:19 | 显示全部楼层
smbxfdbz 发表于 2024-6-18 17:34
抱着学习的心态,我在看parretto的开源代码,他在PL里只例化了一个riscv cpu呀,没有例化多个cpu

而且我 ...
(引用自42楼)

你编译一遍看看utilization

出0入18汤圆

 楼主| 发表于 2024-6-18 19:38:50 | 显示全部楼层
wye11083 发表于 2024-6-18 18:17
你编译一遍看看utilization
(引用自43楼)

也看不出来什么,编译出来的rom.mem,32KB左右

关键我不理解,楼上的那个prt_dp_rom_init 函数是在干什么,从C语言的角度理解,感觉是原地转圈,完全没用一样

出0入17汤圆

发表于 2024-6-18 19:47:48 来自手机 | 显示全部楼层
没看代码,盲猜是类似于写fifo的方式按字节写dp->dev->mem

出0入18汤圆

 楼主| 发表于 2024-6-18 19:53:48 来自手机 | 显示全部楼层
Nuker 发表于 2024-6-18 19:47
没看代码,盲猜是类似于写fifo的方式按字节写dp->dev->mem
(引用自45楼)

28楼有完整代码,能否帮忙看看?
写fifo的话肯定要有地址指针指向某个固定地址呀,但是代码里完全没有这种设定

出0入17汤圆

发表于 2024-6-18 20:04:51 来自手机 | 显示全部楼层
你就没有注意到写dp->dev->mem循环之前,先写了dp->dev->ctl吗?

出0入17汤圆

发表于 2024-6-18 20:12:29 来自手机 | 显示全部楼层
Nuker 发表于 2024-6-18 19:47
没看代码,盲猜是类似于写fifo的方式按字节写dp->dev->mem
(引用自45楼)

更正,不是字节写,是大小端逆转之后word写

出0入18汤圆

 楼主| 发表于 2024-6-18 20:45:14 | 显示全部楼层
Nuker 发表于 2024-6-18 20:04
你就没有注意到写dp->dev->mem循环之前,先写了dp->dev->ctl吗?
(引用自47楼)

他是写了dp->dev->ctl,但dp->dev->ctl也只是结构体里的一个成员变量,我还是看不出来他是怎么跟硬件rom ram关联在一起的
而且我全局搜索了dp->dev->ctl,只找到这个变量被写,完全没找到在哪里有被引用到

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2024-6-18 20:51:41 | 显示全部楼层
smbxfdbz 发表于 2024-6-18 20:45
他是写了dp->dev->ctl,但dp->dev->ctl也只是结构体里的一个成员变量,我还是看不出来他是怎么跟硬件rom  ...
(引用自49楼)

prt_dp_app.c的186行:
  1. prt_dp_set_base (&dptx, PRT_DPTX_BASE);
复制代码

  1. // Set base address
  2. void prt_dp_set_base (prt_dp_ds_struct *dp, uint32_t base)
  3. {
  4.         // Base address
  5.         dp->dev = (prt_dp_dev_struct *) base;
  6. }
复制代码

出0入18汤圆

 楼主| 发表于 2024-6-18 21:59:43 | 显示全部楼层

我懂了,谢谢指点

绑定地址后prt_dp_dev_struct中的成员变量就指向了硬件地址,通过操作prt_dp_dev_struct的成员变量就可以操作硬件外设的寄存器了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 14:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表