首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

双核单片机之初体验

双核单片机之初体验

作者:戴上举 daishangju@163.com

不经意间,“酷睿双核”已经成为电脑CPU性能达标的代名词,双核从字面意思理解就是里面有两个CPU的核,原来一台电脑只有一个CPU核处理事情,如果用了双核CPU,就有两个CPU核来处理事情,这样速度和效能会更高。

这样在一般人眼里,双核俨然代表了先进的技术和先进的性能,当然同时也代表着先进的价格,不信可以去回顾一下市场价格,同一时期双核电脑CPU要比单核的价格高不少。

从性能和价格上电脑CPU和单片机是没有可比性,如果说电脑CPU是大佬,那么单片机就是大佬马仔的马仔的马仔的马仔的马仔。既然双核电脑CPU性能比单核的要强大不少,作为和电脑CPU八百年前祖上是一家的单片机,如果也用双核技术,想必性能也会提升不少。

理论上讲设计出双核单片机完全没有问题,只是单片机要求价格便宜,要是设计出一款双核单片机,假设性能可以提升一倍,但价格也要上升许多,恐怕不会有多少人可以用。

在我的潜意识里,一直都认为双核单片机是一种相对昂贵的产品,应该没有机会和现在大量价格不超过人民币1块钱的普通单片机进行竞争,直到去年底接触到台湾应广科技的一款双核单片机,才彻底改变了我这种认识。

在介绍这种双核单片机之前,让我们一起了解一下目前市场上价格不超过人民币1块钱的一些单片机,这些单片机的具体性能参数不做介绍,这里只列举大致参考价格(可能存在少许偏差)。

义隆 EM78P153 市场参考价0.7~0.8元
飞凌 兼容版153 市场参考价0.55~0.6元
博巨兴 兼容版153 市场参考价0.45~0.55元
麦肯、佑华等公司性能相当型号 市场参考价 0.6~0.7元

在让我们来看一下这款单片机的一些性能参数:

内置2个FPPA处理单元
1k Word OTP 程序存储器
64 Bytes RAM 数据存储器
包含跳转指令在内的绝大多数指令为单周期指令
支持位操作
支持硬件延时和等待指令 *注1 *注2
13条双向IO口+1条输入口
3通道8位A/D转换器
IO支持VDD/2电压驱动LCD
内部低速RC、内部高速RC、外部振荡器、外部RC、外部时钟可选
休眠电流<1uA
工作电压 2.5~5.5V
工作温度 -40~105摄氏度

(*注1:该单片机支持delay 100指令,该指令为延时等待100+1个周期)
(*注2:该单片机支持wait1 pa.0指令,该指令为当pa.0为高时才执行下一条指令)

以我个人的经验,现在市面上的单片机,如果想找出一款支持PWM、ADC、UART中任意一种功能的型号,价格一般都超过人民币1块钱,而且一般都只支持其中的一到两种,除非是价格达到2~3元的型号。而如果选用前面列举参数的单片机,本身硬件已经直接支持ADC,而且还可以通过软件在不影响主程序的前提下实现高速PWM和UART功能。




上图为该双核单片机的内部构架示意图,从图可见该单片机内部有两个核,分别为FPP0和FPP1,每个核自己有独立的程序指针(PC)、堆栈指针(SP)、累加器(ACC)和状态寄存器(CF)。设计原理并不复杂,是让这两个核共享系统时钟,第一个系统时钟周期执行FPP0程序,第二个系统时钟周期执行FPP1程序,依次间隔往复,这样就可以让两个核各自运行自己的程序。

两个核都可以访问控制RAM和特殊功能寄存器,因为在一个系统周期内只有一个核在工作,所以不会出现两个核同时写某个RAM或寄存器的状况。为了让大家更清晰地理解这个双核单片机的工作机理,下面我以问答的方式对部分特性进行说明。

1. 两个核的程序放在什么地方?如何执行?

样例代码:
地址    指令
0x000   goto main0
0x001   goto main1
...
main0:
...
main1:
...
回答:单片机上电后FPP0的程序指针指向0x000,FPP1的程序指针指向0x001,但是单片机系统只启动FPP0,FPP0跳转到main0开始执行该位置的代码,FPP1需要在main0代码设置相应控制寄存器位才能启动。
系统上电只启动FPP0是为了便于程序统一初始化各特殊功能寄存器,如果在FPP0和FPP1中都分别进行初始化,很有可能造成系统配置混乱。

2. 如果我在main1中使用跳转指令跳转到main0中,会有什么后果?

goto main0
goto main1
...
main0:
...
main0_loop:
...
goto main0_loop
...
main1:
...
goto main0    //***这里跳转到main0中***//
...
回答:编译器会报警出错,所以后果就是代码错误无法通过编译,需要删除该代码。

3. 会不会出现两个核同时写某个RAM变量而导致写失败的情况?

回答:每个系统时钟周期只有一个核会工作,所以不会出现两个核在同一时刻写同一地址的情况。

4. 既然FPP1需要FPP0的程序来启动,那不启动FPP1时是不是FPP0运行速度会增快一倍呢?

回答:启动FPP1与不启动FPP1不影响FPP0的运行速度,FPP0的速度总是系统时钟的一半,这个是由系统硬件自动进行分配的,不启动FPP1的影响是在属于FPP1的那一半时间单片机没有执行代码。

5. 应广双核单片机支持中断吗?

回答:应广双核单片机支持中断,中断源和其它普通单片机没有太多差异,象常见的外部中断、定时中断、ADC中断都支持,使用上也和其它普通单片机没有区别。

要留意的是应广双核单片机的中断程序只能由FPP0使用,所有的中断源共用一个中断入口,需要用户通过中断标志位判断中断类型。另外该单片机支持中断嵌套,需要用户自己对累加器和状态寄存器进行压栈和弹栈操作。

6. 应广双核单片机采用什么语言编程?好不好掌握?

回答:应广双核单片机IDE编译环境支持汇编和Mini C,非常容易上手,可以说是目前单片机IDE编译环境最好掌握的。

就是经验丰富的工程师,不少单片机开发工具拿到手后都需要提供个相对完整的工程样例才能开始编程,有的单片机甚至写完代码后工程师都还不会自己创建新工程。应广提供的IDE开发环境完全是智能傻瓜式,根本不需要任何样例代码,拿着datasheet就可以开始编程。

应广双核单片机总共有90余条汇编指令,IDE编译器支持汇编和基本C语句混合编程,而且IDE编译器会自动识别,不象其它编译器需要使用伪指令进行标示,我们可以通过一些简单例子来感受其编程的便捷性。

代码样例1

.romadr 0x000  //这一句也可以去掉,没有这一句编译器会自动从0地址开始放代码,是同样结果
goto main0
goto main1
.romadr 0x010
...
main0:
...
main0_loop:  //这里是用汇编实现FPP0主循环
...
goto main0_loop
...
main1:
...
while(1)  //这里是用基本C语句实现循环
{
...
}

代码样例2

word word_data //定义一个WORD变量
byte byte_data  //定义一个字节变量
bit bit_data //定义一个位变量
...
set1 bit_data  //用汇编指令设置该位变量为1
set1 byte_data.5  //用汇编指令将该字节变量的bit5设为1,不需要在变量中进行位定义
bit_data = 0  //用C基本语法将位变量清0
byte_data = 0 //用C基本语法将字节变量清0
mov a,0x12  //用汇编将WORD变量赋值0x3412
mov lb@word_data,a
mov a,0x34
mov hb@word_data,a
word_data = 0x5678  //用C基本语法将WORD变量赋值0x5678
pa = 0b111_101_00  //用二进制对pa口进行设置,注意可以自由添加下划线做分隔标示符
pb =  0b11110000 //
...
word_data = 0  //C基本语句和汇编可以任意组合
byte_data = 100
while(byte_data)
{
  word_data++
  byte_data--
  mov a,byte_data
  mov pa,a
}

要留意的是对于分号(;)编译器当做注释符,所以使用C语句时不能用分号,这样for(;;)循环就无法使用。另外编译器对部分C语法支持有限,建议只用最基本的C指令。

7. 应广双核单片机开发环境复杂吗?是否支持在线编程?

回答:应广双核单片机的开发环境非常精简,IDE编译器和烧录软件的安装文件大小总共不到7M,安装后就编译和烧录两个文件。

编译器自带样例工程,并可用指定IO口自动生成软件模拟的UART/SPI/I2C等代码。

目前应广单片机均为OTP类型,需要专门的仿真器进行调试,然后用专门的烧录器进行烧写。仿真器和烧录器都是免驱动USB接口,插上电脑即可使用。

8. 应广双核单片机价格贵吗?和其它普通单片机相比最大优势是什么?

回答:应广双核单片机价格不但不贵,而且可以说相当便宜。前面我有介绍部分其它品牌单片机市场参考价,这里我不能很详细的透露应广的价格,但可以很明确的告诉大家,应广的价格和上述单片机比非常有竞争力。

和其它普通单片机相比,在我看来最大优势是用硬件在一个简单的单片机上实现了类似多任务操作系统的功能,在一些需要处理多个实时性比较强的事件时会非常简单。除了双核单片机,应广还有四核和八核的型号,价格约为双核的2~3倍。

9. 应广双核单片机性能稳定吗?抗干扰能力怎么样?

回答:我的回答肯定是性能稳定,抗干扰能力强。

客观的说个说法需要大量用户的实际产品应用作为辅证,应广科技是台湾近几年才升起的一家公司,和松翰与义隆有一定技术渊源,从技术上讲不会弱于这两家,而且已经有相当数量的出货量,从客户反馈看在稳定性和抗干扰能力方面都不错,比较典型的用户是用到HW公司产品的风扇控制上。

10. 能否通过一些应用实例来让大家了解应广双核单片机针对某些应用场合的便捷性?

例1:目前价格低于0.2美元的单片机大都不带UART(串口)硬件,如果用一款低价单片机开发需要支持串口通讯的产品,只能是用IO口软件模拟串口。

用IO口软件模拟串口的代码并不复杂,但如果单片机还要处理其它事情,就会遇到麻烦。假定通讯速率是9600,这样每个位宽大约为104us。

一种方法是直接在主程序中循环完成通讯,这样当有数据收发的时候就无法处理其它事情,每个字节会占用超过1ms的时间,数据越多,占用的时间越长,对于数据发送处理还好,数据接收就会很麻烦,理论上需要程序每52us去查看一次IO状态才行,这样的程序只要简单一想就知道编写起来不是一件简单的事情。

另一种方法是用中断,这种处理方法比循环的要简便一些,但要做到同时收发和兼顾处理其它事情,同样也不是一件简单的事情。
对于普通单片机如果只处理串口数据收发,不做其它事情,不管程序循环还是中断方式,程序相对都不会太过复杂,上面只所以复杂是需要同时处理其它的事情。

使用应广双核单片机就可以很好的解决这个问题,首先价格上不会超过0.2美元;其次代码会相对简单,一个内核处理主程序,一个内核专门负责串口通讯,两者都会有很好的实时性。

例2:处理38K红外遥控码。

38K红外遥控码是频率38K占空比为1:2的方波,如果单片机硬件不支持IR接口,就需要单片机能连续输出宽度约为9us和18us的高低电平。如果要单片机输出这种周期持续稳定的方波,在发码期间基本上不能使用中断,象东芝码一次发码时间大约需要60ms,这样就会严重影响程序的计时等功能。

红外码的接收相对要好一些,每个码都有几百微秒的时间,采用中断完全可以实现解码,唯一麻烦的是红外码通常都是数据包,而且数据包中间还包含一些特殊格式,不象串口所有的字节码都是固定格式,这样需要程序按照特定流程才能解码,无法象串口一样只要一个字节的接收程序就可以完成所有数据的接收,所以红外的接收解码程序会比较长,中间如果夹入其它事情处理就会变得很复杂。
以我个人的经验,普通单片机完成红外遥控码的处理,大约需要2~3天时间,最终效果不会太好,但如果使用应广双核单片机,半天即可完成,代码数量要少许多,效果则是更理想。

例3:一个用应广双核单片机做的红外遮挡开光(反射式)全部代码。

IR_SW equ pb.1
IR_INPUT equ pa.0
IR_OUTPUT equ pa.6


byte ir_new
byte ir_old
byte ir_enable
byte i
byte ir_new1
byte ir_new2
byte ir_new3

  goto main0
goto main1

//----------------FPPA0-------------------
main0:
.ADJUST_OTP_IHRCR 8MIPS  // IHRC/2 = 8MIPS, WatchDog Disable, RAM 0,1 temporary be used

sp = 0x30

disgint
inten = 0

mov a,0b000_11_111 //disable timer
mov t16m,a

set1 pbc.1
set0 IR_SW

set0 pac.0
set1 pac.6
set0 IR_OUTPUT

delay 200

ir_new = 0
ir_old = 0
ir_enable = 0

mov a,0
mov intrq,a


set1 fppen.1 //eanble FPPA1

ir_enable = 1
i = 20
while(i)
{
  delay 200
  i--
}

if(IR_INPUT)
{
  ir_old = 1
}
else
{
  ir_old = 0
}

ir_enable = 0
i = 5
while(i)
{
  delay 200
  i--
}

clkmd.1 = 1 //enable watch dog


main0_loop:
wdreset
call check_ir

if(ir_new != ir_old)
{
  if(ir_new != 1)
  {
   tog IR_SW
  }
  ir_old = ir_new
}

i = 100
while(i)
{
  delay 200
  i--
}
goto main0_loop

check_ir:
ir_enable = 1
i = 20
while(i)
{
  delay 200
  i--
}

if(IR_INPUT)
{
  ir_new1 = 1
}
else
{
  ir_new1 = 0
}

i = 5
while(i)
{
  delay 200
  i--
}

if(IR_INPUT)
{
  ir_new2 = 1
}
else
{
  ir_new2 = 0
}

i = 5
while(i)
{
  delay 200
  i--
}

if(IR_INPUT)
{
  ir_new3 = 1
}
else
{
  ir_new3 = 0
}

if((ir_new1 == ir_new2) && (ir_new2 == ir_new3))
{
  ir_new = ir_new1
}
else
{
  ir_new = ir_old
}

ir_enable = 0
i = 20
while(i)
{
  delay 200
  i--
}
ret

//----------------FPPA1-------------------
main1:
sp = 0x38
delay 200
main1_loop: //output 38k IR signal
if(ir_enable)
{
  set1 IR_OUTPUT
  delay 33
  set0 IR_OUTPUT
  delay 67
}
else
{
  set0 IR_OUTPUT
  delay 10
}
goto main1_loop



11. 应广双核单片机存在哪些不足?

回答:到目前为止已经上市的所有型号最低工作电压为2.5V,这个电压值有点高,不适合电池供电的产品,如果能做到2.2V会更具竞争力。了解到的信息是应广科技有计划推出更低工作电压的版本。

编译工具存在一些不足,对C语言的支持并不是很理想,仿真时选择3.3V工作电压容易产生低电压复位(此时需要保证工作电压大于3.3V)。对于有经验的工程师这点不是关键问题,开发过程可以绕过这些不足。

部分型号的ADC精度略微偏低,但可满足大部分场合的应用需求。

某些功能上存在个别瑕疵,不过应广科技在其网页上已经将这些瑕疵全部列举出来,并提出了相应解决方法。这一点比其它公司要做得好,其它公司往往是用到最后才发现有这样那样的问题,还有可能是无法解决的问题,让用户进退两难。

12. 应广科技对客户的技术支持是否及时?

回答:应广科技作为一家成立时间不长的公司,非常重视客户服务,无论大小客户,只要你在使用应广科技的产品进行开发,所有技术问题都有专人进行回复,通常会在第二个工作日回复电子邮件。

13. 应广的双核单片机保密性怎样?花多少钱可以解密?

回答:相较其它台系单片机,应广有着良好的保密性,目前市场上暂无提供针对应广单片机的解密服务。

14. 如果我想用应广的单片机开发产品?什么地方可以买到芯片和开发工具?

回答:这个需要联系当地的代理商,如果不知道代理商可以直接联系应广科技进行咨询,应广科技网址www.padauk.com.tw
我这里不提供应广单片机裸片,但可以根据客户需求用应广双核单片机完成产品开发,并且不收开发费。

15. 哪些产品适合选用应广的单片机?

回答:这个问题有点不好回答,其实蛮多场合都挺适合的,可以这么说,相信你一旦使用过应广的产品,就会喜欢上它。
在我看来,用义隆153做有点难,用松翰和合泰单片机做有点贵,这类产品最适合应广的单片机;当然,那种带有通讯等实时性强功能的低成本方案应广更是不二选择。
返回列表