有没有51上的c++编译器,要兼容arduino都是需要c++支持

2020-01-19 19:34发布

现在51的soc很多ram,FLASH都很大了,比如CC2530。已经远胜过AVR了。
网上只找到开源免费的SDCC,但只支持C。
我想51有没C++编译器呢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
dwj0
1楼-- · 2020-01-19 21:14
 精彩回答 2  元偷偷看……
xwkm
2楼-- · 2020-01-20 00:47
51那个蛋疼的结构,支持C++效率低到
不过记得好像有人做过LLVM for 51.配合GCC-LLVM或者CLANG用吧
3050311118
3楼-- · 2020-01-20 06:05
xwkm 发表于 2015-11-7 11:35
51那个蛋疼的结构,支持C++效率低到
不过记得好像有人做过LLVM for 51.配合GCC-LLVM或者CLANG用吧
...

现在51的速度很快了啊,至少cc2530ram,flash和速度都超了atmega328这种
xwkm
4楼-- · 2020-01-20 11:01
3050311118 发表于 2015-11-7 15:54
现在51的速度很快了啊,至少cc2530ram,flash和速度都超了atmega328这种

你说CC2530的RAM和Flash比328大,是毫无疑问的。但就执行效率而言,51和AVR还差了一大截:
你可以看TI官方的指令表.
简单拿几个重要的指令比较(用AVR书写方式计):
分支指令
RJMP 51 3T AVR 2T
IJMP 51 2T AVR 2T
JMP 51 4T AVR 2T
CALL 51 6T AVR 2T
ICALL 51 (无硬件实现,要自己先PUSH DPTR再IJMP) AVR 2T
RET 51 4T AVR 2T
条件分支指令难以表示,用51和AVR组合指令比较
JNZ/JZ 51 3T AVR 2T
JB 51 4T AVR 3T
在同频条件下,TI的51的分支效率与AVR的分支效率比低不少.基本上AVR都是2T.TI 51平均4T左右。CC2530没记错应该是32M的,这部分实际处理速度可能打平了。但是51没有直接的实现ICALL。而C++虚函数对函数指针依赖很高,这块51不行。
算术指令
DIV 51 5T AVR (无硬件实现)
MUL 51 5T AVR 1T
INC 51 2T AVR 1T
ADC 51 2T AVR 1T
SUB 51 2T AVR 1T
AND 51 2T AVR 1T
ANDI 51 2T AVR 1T
ORI  51 2T AVR 1T
XOR 51 2T AVR 1T
CLR 51 1T(仅A寄存器) AVR 1T(R0~R31)
LSL
LSR
ROL
ROR
ASR均同上
同频条件下,理论上说TI跑32M的51和16M AVR速度差不多,除法强出不少。但是能用来作为运算的寄存器仅有AB。因此遇到大量复杂表达式的时候性能降低会很严重。这块51略为劣势。
数据传输指令
PUSH 51 4T AVR 1T
POP 51 4T AVR 1T/2T(X/Y/Z)
LPM 51 3T AVR 2T
MOVX(仅51有) 3T/4T AVR --(统一编址)
LD 51 3/4/5T AVR 1/2/3T
ST 51 3/4/5T AVR 1T
这里51完败不解释。即使51跑在32M,由于DPTR只有两个,还不能随意指定(如AVR的R0~R31寄存器一样用),效率得到极大的下降。
布尔操作:
SBI 51 3T AVR 1T
CBI 51 3T AVR 1T
BST 51 AVR 1T
BLD 51 AVR 1T
这里51也就靠高主频略胜AVR。但是要是传递的不是立即数,51又要瞎了……
最后总结,TI这个8051核心和C8051F还差得远。同频执行效率和编址的规整程度和AVR比还是差不少。你说51快,这三个总线编址,上C++不可避免的要实现通用指针,通用指针实现必然遇到判断问题,51本身执行效率就不行,再一倒腾还要不要活了。
xwkm
5楼-- · 2020-01-20 13:52
所以我说51这个标准C语言上去都够呛,访问XRAM还要被两个DPTR耍着玩加上编址蛋疼XRAM和IRAM起码速度差距3-4倍的系统上上C++?恐怕几个class一包装加上各种调用关系导致的深(注意,对51来说深可能其他的单片机不算什么)堆栈,IRAM就爆了哟,然后放在XRAM里效率一塌糊涂。
我觉得在51上首先得考虑的是,这玩意儿用起来效率不能太低。但是这个编址方式加上这套指令系统,C++要上效率真的不看好。
另外关于51的硬件抽象层这一块儿,又有个问题了,51所谓特殊功能寄存器是不能用指针访问的,so……只能多写接口函数了,浪费FLASH啊。
xwkm
6楼-- · 2020-01-20 16:34
 精彩回答 2  元偷偷看……

一周热门 更多>