tag 标签: 多核

相关博文
  • 热度 15
    2014-1-8 15:53
    1437 次阅读|
    0 个评论
      如果说, 2013 年是手机历史上的八核元年,那么, 2014 年智能手机的“核战争”将正式开打。去年,联发科、三星、 LG 相继发布八核处理器,近期,索尼、酷派、华为、 TCL 等纷纷推出八核智能手机。一场突如其来又在意料之中的智能手机“多核战”悄然升级。 早在2012年,当年的MWC引发了“多核”之争,有人质疑,我们真的需要四核吗?“四核到底有没有必要”?可是,到了2012年底, 联想、华为、中兴、 HTC 等四核中高端手机已经风靡市场。仅仅一年时间,智能手机 从双核到四核,再到八核,发展速度之快,让许多业内人士目瞪口呆。 芯片大佬大唱反调 全球最大的智能手机芯片厂商高通属于坚定的反对派。高通 CEO 保罗·雅各布 (Paul Jacobs) 曾向中国媒体公开表示,“高通已经证明,有的时候‘ 2 〉 4 ’——高通的双核处理器比一些竞争对手的四核处理器的性能还要强。”雅各布明确指出,无论是消费者,还是终端厂商或运营商,他们最终关注的是终端的用户体验,而不是有几个核。他认为,“手机芯片这种强调核的数量的趋势,不会持续太久”。高通高级副总裁 Anand Chandrasekher 甚至指责联发科的八核,“一味追求核的数量,是愚蠢和没有意义的事情”。 PC 芯片大佬英特尔跟高通一唱一和。在手机芯片市场上,英特尔虽然不能像高通那样号令天下,但凭其自身的影响力,对于八核的态度也足以让人不可轻视。杨叙就曾在多个场合表示,“多核”只是概念炒作,智能手机实际上不需要多核。一位资深手机产品经理为其佐证:苹果最新 iPhone 产品一直使用双核芯片,其整体体验仍然居于领先地位。并且认定,很多手机应用实际上并不需要“多核”,单核更能有效控制功耗,延长使用时间。 以 Android 占领智能手机半壁江山的谷歌,一直鼓励应用开发者,提升速度,降低功耗。在谷歌应用商店中国区排名前 100 名的应用和前 10 名的游戏当中,大部分手机只用到一个或两个核。即使是在谷歌应用商店上 20 多万个独立应用中,第三、第四个核也绝大部分时间处于闲置状态。 中国厂商一呼百应 用户决定需求,需求决定市场。中国市场一年之内完成了双核到四核再到八核的“三极跳”,根本原因在于市场的推动。八核一出,中国手机厂商旗帜鲜明,及时跟随。手机硬件的比拼就和 PC 一样,没有终点,对厂家而言,八核可在跑分上赢得用户喝彩;对用户来说,则可形成加快手机终端更新换代的驱动力,给智能手机市场带来新一波热潮。 用 户的消费心理决定厂商的营销策略,中国消费者的最大特点是追风追潮,当多核成为手机的最大卖点时,消费者也把多核视为身价和地位的象征。三星等厂商大炒大 卖多核,正是投中国消费者所好。即使多核用不上,但同样的价格,一个双核一个四核,消费者必然选择后者。一些厂商正是在双核进入四核时代时坚持单核,而遭 遇挫折,追悔莫及。比如,一家国产手机厂商曾参与一次运营商的招标,标的是双核处理器,虽在价格上有优势,但另一个厂商用同样价格提供四核产品,错失良 机。 在中国手机市场上,如果不妥协于消费者和运营商的选择,就意味着放弃。运营商居于主导地位,如果运营商主导推出八核手机,手机厂商则必须跟随,否则就失去了市场。总而言之,如果消费者需要,就应该做。因此,对于八核,中国本土手机厂商可谓一呼百应。 国产手机不可错过机遇 PC 的 30 多年发展史告诉我们,在科技进步的推动下,硬件的升级是没有止境的。同样,手机硬件的发展,也不会停止不前。无论芯片业如何争论,都必须承认一点,真八核智能手机,已经上市了。 事实上,多核并不是决定手机终端整体体验的唯一要素。智能手机的创新, CPU 只是一个因素,在其它各个要素未能达到全面提升之前,对于一款手机的整体性能和应用体验而言,八核确实意义不大。而且, 8 核手机硬件配置高,提高了成本,增加了耗电,直接影响用户体验。 不 过,手机厂商要生存要发展,必须寻求并创造新的增长点。国内手机厂商力挺八核,既是对三星等领导厂商的效仿和追随,也是对国内市场和消费者的深度理解,有 助于冲出高通的技术控制,也有助于实现国产品牌在高端智能手机市场的突破。在一个由运营商主导消费的市场环境下,“多核战”仍有很多大号召力,八核竞争不 是终点。未来的“多核战”还会升级到什么层面,很难预料。 电 子技术日新月异,近十年手机市场竞争的结果一再证明,产品升级换代速度制胜。手机市场依赖于两个速度的驱动,一个是移动互联网发展与用户需求的速度,一个 是手机技术与平台运行的速度,两者互为作用,哪一个速度跟不上,都会制约整个手机市场的发展。国内智能手机厂商参与“八核战”,对于提升品牌形象及高端市 场竞争力,都是不可错过的机遇。 本文转自新浪博客
  • 热度 20
    2012-12-20 21:03
    2767 次阅读|
    1 个评论
    本例是用针对标准I2C接口EEPROM存储器24C02进行读写操作,只要对例程做适当修改,就可以用到大部分控制I2C接口设备的场合。   //----------------------------------------- //应广单片机软件I2C接口例程(MASTER模式) //本例仅供参考,欢迎指正程序中的问题 //2012年12月20日 // //作者:戴上举 //邮箱:daishangju@163.com //博客:forum.eet-cn.com/BLOG_daishangju_334.HTM //电话:13509678051 //Q  Q:1514292225 //----------------------------------------- .chip p201cs14a //{{PADAUK_CODE_OPTION  .Code_Option Bootup  Slow  // 1024 ILRC  .Code_Option LVD  2.79V  // Maximum performance = 4 MIPS  .Code_Option Security Enable  // Security 3/4 words Enable //}}PADAUK_CODE_OPTION //定义I2C接口 I2C_SDA equ pa.7 I2C_SCL equ pa.6 I2C_SDA_DIR equ pac.7 I2C_SCL_DIR equ pac.6 I2C_LONG_DLY equ 50 I2C_SHORT_DLY equ 20 I2C_SDA_HIGH equ set1 I2C_SDA  I2C_SDA_LOW equ set0 I2C_SDA I2C_SCL_HIGH equ set1 I2C_SCL I2C_SCL_LOW equ set0 I2C_SCL I2C_SDA_OUTPUT equ set1 I2C_SDA_DIR I2C_SDA_INPUT equ set0 I2C_SDA_DIR I2C_SCL_OUTPUT equ set1 I2C_SCL_DIR I2C_SCL_INPUT equ set0 I2C_SCL_DIR //定义I2C变量 byte i2c_rw_addr //读写地址 byte i2c_rw_byte //读写数据 byte i2c_rw_cmd //读写的器件地址 byte i2c_rw_temp //读写过程中间变量 byte i2c_rw_cnt //读写过程中间变量 // byte Xms byte ms_cnt // byte test_addr byte test_data .romadr 0x000  goto main0  goto main1 .romadr 0x010 isr_entry:  pushaf  intrq = 0  popaf  reti //---------------------------- //产生START信号 //---------------------------- i2c_start:  I2C_SDA_OUTPUT  I2C_SCL_OUTPUT  I2C_SDA_HIGH  delay I2C_LONG_DLY  I2C_SCL_HIGH  delay I2C_LONG_DLY  I2C_SDA_LOW  delay I2C_LONG_DLY  I2C_SCL_LOW  delay I2C_LONG_DLY  ret //---------------------------- //产生STOP信号 //---------------------------- i2c_stop:  I2C_SCL_LOW  delay I2C_LONG_DLY  I2C_SDA_LOW  delay I2C_LONG_DLY  I2C_SCL_HIGH  delay I2C_LONG_DLY  I2C_SDA_HIGH  delay I2C_LONG_DLY  //  I2C_SCL_INPUT  I2C_SDA_INPUT  ret //---------------------------- //检查SALVE ACK信号 //---------------------------- i2c_slave_ack:  //don't check ACK  I2C_SDA_INPUT  delay I2C_SHORT_DLY  I2C_SCL_HIGH  delay I2C_SHORT_DLY  I2C_SCL_LOW  delay I2C_SHORT_DLY  I2C_SDA_OUTPUT  I2C_SDA_LOW  delay I2C_SHORT_DLY  ret //---------------------------- //输出MASTER ACK信号 //---------------------------- i2c_master_ack:  I2C_SDA_OUTPUT  I2C_SDA_LOW  delay I2C_SHORT_DLY  I2C_SCL_HIGH  delay I2C_SHORT_DLY  I2C_SCL_LOW  delay I2C_SHORT_DLY  ret //---------------------------- //输出MASTER NACK信号 //---------------------------- i2c_master_nack:  I2C_SDA_OUTPUT  I2C_SDA_HIGH  delay I2C_SHORT_DLY  I2C_SCL_HIGH  delay I2C_SHORT_DLY  I2C_SCL_LOW  delay I2C_SHORT_DLY  ret //------------------------------ //写一个字节 //Input: i2c_rw_temp //Used:  i2c_rw_cnt //------------------------------ i2c_write_8bit:  i2c_rw_cnt = 8 i2c_write_8bit_loop:  slc i2c_rw_temp  swapc I2C_SDA  delay I2C_SHORT_DLY  I2C_SCL_HIGH  delay I2C_SHORT_DLY  I2C_SCL_LOW  delay I2C_SHORT_DLY  dzsn i2c_rw_cnt  goto i2c_write_8bit_loop  ret //------------------------------ //读一个字节 //Used:   i2c_rw_cnt //Output: i2c_rw_temp //------------------------------ i2c_read_8bit:  i2c_rw_temp = 0  i2c_rw_cnt = 8  delay I2C_SHORT_DLY i2c_read_8bit_loop:  I2C_SCL_HIGH  delay I2C_SHORT_DLY  swapc I2C_SDA  slc i2c_rw_temp  I2C_SCL_LOW  delay I2C_SHORT_DLY  dzsn i2c_rw_cnt  goto i2c_read_8bit_loop  ret //------------------------------ //Input:  i2c_rw_addr //        i2c_rw_cmd //Used:   i2c_rw_cnt //        i2c_rw_temp //Output: i2c_rw_byte //------------------------------ i2c_read_byte:  //start  call i2c_start  //write device address(write)  i2c_rw_temp = i2c_rw_cmd  call i2c_write_8bit  //slave ack  call i2c_slave_ack  //write register address  i2c_rw_temp = i2c_rw_addr  call i2c_write_8bit  //slave ack  //don't check ACK  call i2c_slave_ack  //start repeat  call i2c_start  //write device address(read)  i2c_rw_temp = i2c_rw_cmd  i2c_rw_temp.0 = 1  call i2c_write_8bit  //slave ack  //don't check ACK  I2C_SDA_INPUT  delay I2C_SHORT_DLY  I2C_SCL_HIGH  delay I2C_SHORT_DLY  I2C_SCL_LOW  delay I2C_SHORT_DLY //这里为特殊情况I2C_SDA不用转为输出  //read data  i2c_rw_temp = 0  call i2c_read_8bit  i2c_rw_byte = i2c_rw_temp //store data  //master nack  call i2c_master_nack  //stop  call i2c_stop  //retune  delay I2C_LONG_DLY  wdreset  ret //------------------------------ //Input:  i2c_rw_addr //        i2c_rw_byte //        i2c_rw_cmd //Used:   i2c_rw_cnt //        i2c_rw_temp //------------------------------ i2c_write_byte:  //start  call i2c_start  //write device address  i2c_rw_temp = i2c_rw_cmd  call i2c_write_8bit  //slave ack  //don't check ACK  call i2c_slave_ack  //write register address  i2c_rw_temp = i2c_rw_addr  call i2c_write_8bit  //slave ack  //don't check ACK  call i2c_slave_ack  //write data  i2c_rw_temp = i2c_rw_byte  call i2c_write_8bit  //slave ack  //don't check ACK  call i2c_slave_ack  //stop  call i2c_stop  //retune  delay I2C_LONG_DLY  wdreset  ret EEPROM_RW_CMD equ 0xA0 //------------------------------ //函数名: eeprom_read_byte //Input:  i2c_rw_addr //Used:   i2c_rw_cnt //        i2c_rw_temp //Output: i2c_rw_byte //------------------------------ eeprom_read_byte:  i2c_rw_cmd = EEPROM_RW_CMD  goto i2c_read_byte //注意这里用的是跳转 //------------------------------ //函数名: eeprom_write_byte //Input:  i2c_rw_addr //        i2c_rw_byte //Used:   i2c_rw_cnt //        i2c_rw_temp //注意:  调用完后需要等待一段时间以保证写操作完成 //------------------------------ eeprom_write_byte:  i2c_rw_cmd = EEPROM_RW_CMD  goto i2c_write_byte //注意这里用的是跳转   //---------------------------------------- //input: ms //该函数以4M频率为基准时钟实现延时 //---------------------------------------- delayXms:  while(Xms)  {   wdreset   ms_cnt = 20   while(ms_cnt)   {    delay 195     ms_cnt--   }   Xms--  }  ret   main0:  .ADJUST_OTP_IHRCR 8MIPS  // IHRC/2 = 8MIPS, WatchDog Disable, RAM 0,1 temporary be used  sp = 0x30  disgint  inten = 0  pa = 0b0000_0000  paph = 0b1101_0000  pac = 0b0000_0001   pb = 0b0000_0000  pbph = 0b0000_0000  pbc = 0b1111_1111  I2C_SDA_INPUT  I2C_SCL_INPUT  delay 200  mov a,0b100_11_111  mov t16m,a  clkmd.1 = 1 //enable watch dog  wdreset  Xms = 100  call delayXms    test_data = 0  test_addr = 0 main0_loop:  wdreset  //写E2EPROM  i2c_rw_addr = test_addr  i2c_rw_byte = test_data  call eeprom_write_byte  //调用EEPROM写操作函数后要等待一段时间,以保证数据写操作完成  Xms = 20  call delayXms  //读E2EPROM  i2c_rw_addr = test_addr  call eeprom_read_byte  if(i2c_rw_byte != test_data)  {   //读回的数据比较出错,判断为读写E2PROM出错   nop  }  test_addr ++  test_data --    goto main0_loop //----------------FPPA1------------------- main1:   sp = 52 main1_loop:  goto main1_loop   本例代码是从实际程序中移植而来,已编译,未做最终调试
  • 热度 24
    2012-12-16 10:56
    4269 次阅读|
    9 个评论
    单片机工程师面对一种新单片机时,最希望的是能有一个简单的样例,这个样例连上仿真器就能运行,里面最好包含一些基本功能,这样工程师就可以在这个样例的基础上很快改出自己需要的代码。   这里我以应广pdk22c12写了一段程序框架,已经包含对这个单片机的各种基本设置,拿回去就可以自己进行仿真调试,相信能让新接触应广单片机的朋友很快上手。   //----------------------------------------- //应广单片机软件基本框架例程 //本例仅供参考,欢迎指正程序中的问题 //本例是根据应广单片机的特点创建的基本程序框架 //包含定时中断、外部中断、AD转换、段位数码管显示,简单按键处理等功能 //用户在本例基础上很容易就能改出自己需要的程序 //2012年12月15日 // //作者:戴上举 //邮箱:daishangju@163.com //博客:forum.eet-cn.com/BLOG_daishangju_334.HTM //电话:13509678051 //Q  Q:1514292225 //----------------------------------------- .chip pdk22c12 //{{PADAUK_CODE_OPTION  .Code_Option LVD  2.4V~2.9V // Maximum performance = 8 MIPS  .Code_Option Security Enable  // Security 7/8 words Enable //}}PADAUK_CODE_OPTION //#define MOB_FLASH_MODE KEY equ pa.5 //定义数码管的IO口,这里是显示三个8 LED_A equ pa.1 LED_B equ pa.0 LED_C equ pa.7 LED_D equ pa.6 LED_E equ pb.7 LED_F equ pb.6 LED_G equ pb.5 LED_DP equ pb.1 LED_COM1 equ pa.2 LED_COM2 equ pa.3 LED_COM3 equ pa.4 LED_A_ON equ set1 LED_A LED_A_OFF equ set0 LED_A LED_B_ON equ set1 LED_B LED_B_OFF equ set0 LED_B LED_C_ON equ set1 LED_C LED_C_OFF equ set0 LED_C LED_D_ON equ set1 LED_D LED_D_OFF equ set0 LED_D LED_E_ON equ set1 LED_E LED_E_OFF equ set0 LED_E LED_F_ON equ set1 LED_F LED_F_OFF equ set0 LED_F LED_G_ON equ set1 LED_G LED_G_OFF equ set0 LED_G LED_DP_ON equ set1 LED_DP LED_DP_OFF equ set0 LED_DP SELECT_LED1 macro  set1 LED_COM2  set1 LED_COM3  set0 LED_COM1  endm SELECT_LED2 macro  set1 LED_COM1  set1 LED_COM3  set0 LED_COM2  endm SELECT_LED3 macro  set1 LED_COM1  set1 LED_COM2  set0 LED_COM3  endm ALL_LED_OFF macro  set1 LED_COM1  set1 LED_COM2  set1 LED_COM3  LED_A_OFF  LED_B_OFF  LED_C_OFF  LED_D_OFF  LED_E_OFF  LED_F_OFF  LED_G_OFF  LED_DP_OFF  endm LED_DELAY macro  delay 250  delay 250  endm word init_timer //用于数码管显示时进行查表转换 word disp_ptr word disp_data word disp_data_temp byte Xms byte ms_cnt byte pb2_voltage //用于数码管显示 byte disp1_buf byte disp2_buf byte disp3_buf byte disp_temp byte led1_buf byte led2_buf byte led3_buf //用于定时中断计时 byte timer_cnt //用于单键按键判断 byte key_cnt bit key_press_flag //定义标志位,用于数码管显示和闪烁控制 bit led_en_flag bit led_flash_flag bit update_disp_flag //应广单片机程序入口,第一条必须为跳转到第一个内核主程序入口地址的指令,第二条为第二个内核,有几个内核就有几条 .romadr 0x000  goto main0  goto main1 //应广单片机中断程序入口地址,所有中断共用同一个入口,需要用户自己判断中断类型 .romadr 0x010  pushaf  if(intrq.T16) //定时中断  {   stt16 init_timer //重设定时器值   if(timer_cnt 9) //得到1000ms间隔   {    timer_cnt ++   }   else   {    timer_cnt = 0    if(led_flash_flag) //数码管闪烁处理    {     led_flash_flag = 0    }    else    {     led_flash_flag = 1    }   }   intrq.T16 = 0  }  elseif(intrq.PB0) //PB0外部中断  {   if(pb.0)   {    //读到PB0状态为高,为上升沿    nop //添加用户自己的代码   }   else   {    //读到PB0状态为低,为下降沿    nop //添加用户自己的代码   }  }  intrq.AD = 0 //强制清除AD中断标志位,防止意外进入AD中断后程序不停响应  intrq.PA0 = 0 //强制清除PA0外部中断标志位,防止意外进入PA0中断后程序不停响应  popaf  reti //---------------------------------------- //input: ms //用该函数可以再4M的频率下得到近似1毫秒的延时,在第一个内核中调用中断会导致延时加长 //---------------------------------------- delayXms:  while(Xms)  {   wdreset //这里需要有清看门狗操作,否则有可能在长延时下导致看门狗溢出复位   ms_cnt = 20   while(ms_cnt)   {    delay 195    ms_cnt--   }   Xms--  }  ret //---------------------------------------- // //对PB2进行AD转换,得到上面的电压 //---------------------------------------- get_pb2_voltage:  //对新的一路AD通道进行AD转换时,第一次转换的结果可能不可靠,这里连续转换两次,取第二次结果  //如果连续对同一通道进行AD转换,可以只转换一次  adcc = 0b10_0010_00 //enable ADC, select pb2   ad_start = 1  wait1 ad_start //等待AD转换结束  a = adcr //放弃第一次转换结果  ad_start = 1  wait1 ad_start  pb2_voltage = adcr //存储第二次转换结果  ret //数码管BCD显示用的转换表,最后的两个0x00可以不要 //数码管的a,b,...,g,dp分别对应bit7,bit6,...,bit0 bcd_tbl: //0~9  dc 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0x00,0x00 //---------------------------------------- //以十进制形式显示数据disp_data //只修改显示缓冲区 //---------------------------------------- update_led_disp_buf:  //a,b,...,g,dp -- bit7,bit6,...,bit0  if(!update_disp_flag)  {   disp_data_temp = disp_data //先将需要显示的数据放到临时中间变量中,防止转换时数据更新导致显示出错   //得到数据管第一位LED1的BCD码   disp_temp = 0   while(disp_data_temp = 100) //直接用循环减实现除法   {    disp_data_temp = disp_data_temp - 100    disp_temp ++   }   disp_ptr = bcd_tbl //查表操作   disp_ptr = disp_ptr + disp_temp   ldtabl disp_ptr   mov disp1_buf,a   //得到数据管第二位LED2的BCD码   disp_temp = 0   while(disp_data_temp = 10)   {    disp_data_temp = disp_data_temp - 10    disp_temp ++   }   disp_ptr = bcd_tbl   disp_ptr = disp_ptr + disp_temp   ldtabl disp_ptr   mov disp2_buf,a   //得到数据管第三位LED3的BCD码   disp_temp = disp_data_temp   disp_ptr = bcd_tbl   disp_ptr = disp_ptr + disp_temp   ldtabl disp_ptr   mov disp3_buf,a   update_disp_flag = 1  }  ret //第一个内核程序入口 //----------------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  //小延时后在修改其它系统状态设置  delay 200  clkmd.1 = 1 //打开看门狗,这个设置尽量靠前,以增强可靠性  wdreset //清看门狗  //设置IO口  pac = 0b1101_1111 //PA5设置 IN  paph = 0b0000_0000  pbc = 0b1111_1010 //PB2设为模拟输入不开上拉电阻,PB0设为输入  pbph = 0b0000_0000 //poll high  ALL_LED_OFF  init_timer = 7768 //从7768进行校准为100ms  mov a,0b100_11_111  mov t16m,a  stt16 init_timer  //上电后清需要使用的变量  key_cnt = 0  disp1_buf = 0  disp2_buf = 0  disp3_buf = 0  led1_buf = 0  led2_buf = 0  led3_buf = 0  update_disp_flag = 0  timer_cnt = 0  disp_data = 000  led_en_flag = 1 //数码管进行显示  //将PB2设为模拟输入口进行AD转换  adcdi = 0b0000_0100 //pb2 is analog input  adcc = 0b10_0010_00 //enable ADC, select pb2  adcm = 0b000_0100_0 //system clock/16  //adcm = 0b000_0111_0 //system clock/128    //延时一段时间等系统稳定  Xms = 100  call delayXms  //得到按键初始状态,这样在按键损坏时不会误判按键按下或松开  if(!KEY)  {   key_press_flag = 1  }  else  {   key_press_flag = 0  }  stt16 init_timer  intrq = 0  inten.T16 = 1 //打开定时中断  inten.PB0 = 1 //打开PB0外部中断  engint //允许中断  set1 fppen.1 //打开第二个内核   main0_loop:      wdreset //clear watch dog  //得到PB2的AD转换结果  call get_pb2_voltage  //AD转换完立即更新数码管显示缓冲区  call update_led_disp_buf  if(!KEY) //电压恢复正常只要按键就立刻结束倒计时  {   if(key_cnt 3)   {    key_cnt ++   }   else   {    if(!key_press_flag)    {     key_press_flag = 1 //这里是按键按下     //按键切换数码管是否进行显示     if(led_en_flag)     {      led_en_flag = 0 //数码管不显示     }     else     {      led_en_flag = 1 //数码管显示     }    }   }  }  else  {   if(key_cnt)   {    key_cnt --   }   else   {    if(key_press_flag)    {     key_press_flag = 0 //这里是按键松开    }   }  }  //延时50毫秒,目的是让第一个内核循环的时间大于第二个内核循环时间的两倍  //以保证显示缓冲区再次更新前第二个核已经做出响应,保证显示正确  Xms = 50  call delayXms  goto main0_loop //第二个内核程序入口 //----------------FPPA1------------------- main1:  sp = 0x38 //设置第二个内核的堆栈地址  delay 200 main1_loop:  if(update_disp_flag) //有数据更新时才进行更新  {   led1_buf = disp1_buf   led2_buf = disp2_buf   led3_buf = disp3_buf   update_disp_flag = 0  }  //第二个内核循环扫描显示数码管,这样可以得到没有闪烁的显示效果  if(led_en_flag) //数码管需要显示  {   //下面程序尽量让数码管每个段位的处理时间相同,这样可以保证各个段位亮度一致   //LED1   ALL_LED_OFF   LED_DELAY   SELECT_LED1   if(led1_buf.7)   {    LED_A_ON   }   LED_DELAY   LED_A_OFF   if(led1_buf.6)   {    LED_B_ON   }   LED_DELAY   LED_B_OFF   if(led1_buf.5)   {    LED_C_ON   }   LED_DELAY   LED_C_OFF   if(led1_buf.4)   {    LED_D_ON   }   LED_DELAY   LED_D_OFF   if(led1_buf.3)   {    LED_E_ON   }   LED_DELAY   LED_E_OFF   if(led1_buf.2)   {    LED_F_ON   }   LED_DELAY   LED_F_OFF   if(led1_buf.1)   {    LED_G_ON   }   LED_DELAY   LED_G_OFF   if(led1_buf.0)   {    LED_DP_ON   }   LED_DELAY   LED_DP_OFF   //LED2   ALL_LED_OFF   LED_DELAY   SELECT_LED2   if(led2_buf.7)   {    LED_A_ON   }   LED_DELAY   LED_A_OFF   if(led2_buf.6)   {    LED_B_ON   }   LED_DELAY   LED_B_OFF   if(led2_buf.5)   {    LED_C_ON   }   LED_DELAY   LED_C_OFF   if(led2_buf.4)   {    LED_D_ON   }   LED_DELAY   LED_D_OFF   if(led2_buf.3)   {    LED_E_ON   }   LED_DELAY   LED_E_OFF   if(led2_buf.2)   {    LED_F_ON   }   LED_DELAY   LED_F_OFF   if(led2_buf.1)   {    LED_G_ON   }   LED_DELAY   LED_G_OFF   if(led2_buf.0)   {    LED_DP_ON   }   LED_DELAY   LED_DP_OFF   //LED3   ALL_LED_OFF   LED_DELAY   SELECT_LED3   if(led3_buf.7)   {    LED_A_ON   }   LED_DELAY   LED_A_OFF   if(led3_buf.6)   {    LED_B_ON   }   LED_DELAY   LED_B_OFF   if(led3_buf.5)   {    LED_C_ON   }   LED_DELAY   LED_C_OFF   if(led3_buf.4)   {    LED_D_ON   }   LED_DELAY   LED_D_OFF   if(led3_buf.3)   {    LED_E_ON   }   LED_DELAY   LED_E_OFF   if(led3_buf.2)   {    LED_F_ON   }   LED_DELAY   LED_F_OFF   if(led3_buf.1)   {    LED_G_ON   }   LED_DELAY   LED_G_OFF   if(led3_buf.0)   {    LED_DP_ON   }   LED_DELAY   LED_DP_OFF  }  else //数码管不需要显示  {   ALL_LED_OFF  }  goto main1_loop    已编译,未调试
  • 热度 27
    2012-11-27 09:56
    2867 次阅读|
    1 个评论
    作者:磐石之心 最近,搭载英特尔ATOM处理器的摩托罗拉MT788手机备受关注,网上关于这款手机的消息也越来越多。之所以获得如此高的关注度,因为MT788手机搭载的芯片非ARM架构而是X86架构,手机背面写着intel inside,是英特尔宣布进军手机芯片市场以来非常重量级的一款产品。 英特尔、摩托罗拉、X86、ATOM......这些关键字放到一起相信没有人会不感兴趣,肯定也会有一连串的问题。在双核、四核安卓机盛行的当下,单核心的MT788性能方面表现如何?X86架构的ATOM凌动芯片在多媒体、功耗等方面表现如何?英特尔的移动芯片计划是否前景光明? 手机“核战争”的终结者 基于ARM架构的四核手机已经有多款上市,而双核更是标配。而且多核心已经成为手机品牌之间比拼的焦点,也成为吸引消费者购买的主要筹码,小米、中兴、华为......都加入了四核大战。 很多用户会有疑问,为何电脑上双核的CPU都已经足够快,而手机运行的系统比电脑小,软件比电脑轻,处理的任务比电脑弱,为何都需要上四核了?之所以这样干,一方面因为ARM架构基于精简指令集设计,在超线程方面较弱,需要多核心进行补充。其次,增加核心数量,可以推动产业链共同发展,让用户愿意为多核心扔掉旧手机购买新手机。 而英特尔收购了英飞凌之后推出基于X86架构的凌动手机处理器,首先从处理器架构上就在性能方面有着强大与ARM数倍的优势,通过单核心的超线程技术即可达到ARM双核的速度,同时在多媒体等方面拥有先天优势,比如,即便是现今最强大的ARM内核依然还在为软解1080p H.264而奋斗,但一颗普通的中端Core i处理器却可以用接近十倍播放速度的速度去压缩1080p H.264视频。此外,最让用户担心的功耗问题也通过类似睿频加速的功能以及英特尔在芯片制造工艺上(演进路线:32nm/22nm/14nm)的绝对领先优势得到良好解决。 摩托罗拉和中移动助intel一臂之力 无论技术多么优秀,要获得成功必须要得到消费者的认可,而距离消费者最近的不是英特尔而是手机OEM厂商,因此intel需要实力雄厚的手机品牌厂商支持。此前,曾和联想、中兴等国产厂商合作推出手机,但是并未引起市场足够重视。 现在选择与摩托罗拉合作,并且联手中国移动推出TD版的MT788,应该能够获得消费者的认可。一方面,摩托罗拉在国际上拥有强大的品牌影响力,精湛的工业设计能力,MT788就是采取 CNC处理12道工艺的铝合金外壳,堪比iPhone 5。另外,中国移动强大的营销和推广能力,必将帮助这款手机迅速普及。 此外,摩托罗拉MT788或许成为当前手机多核之战终结的导火索,让手机之争回归本质的体验至上,工艺至上,而不是虚无缥缈的多核营销至上。对此,我们也拭目以待!  
  • 热度 12
    2011-10-13 10:20
    1386 次阅读|
    0 个评论
    能耗分析 随着全球气候变暖问题日益显现以及各种“绿色”电子系统的纷纷面世,如何测量嵌入系统的能耗逐渐成为行业关注的焦点。在现代技术刊物中,关于电池驱动设备与低功耗微处理器的文章随处可见。该领域内越来越多的新技术赢得了各种创新奖项。多年来,行业内已采取了各种降低系统能耗的措施。但如果不能通过一个软件时刻来监控嵌入式系统,并使各个硬件工作在的剩电模式,则这些措施很难真正见效。自 2006 年初以来,Lauterbach 工具已开始支持各种测量功能,能够对嵌入式系统内的软件与功耗之间的相互影响进行比较分析。该技术从 2010 年中开始用在 TRACE32 CombiProbe 中。 多核调试 虽然多核芯片用于嵌入式系统中已有 10 年历史,且Lauterbach 早在 2001 年就开发出多核芯片调试器,但该领域仍然是一个技术热点。由于目前市场上关于增强内部系统操作可见性的需求正日益提高,因此在芯片调试结构内集成新型跟踪单元亦已成为大势所趋。以前只能够对单核生成跟踪信息,而现在可以有很多的其他跟踪源: TRACE32 调试器重视不断改进和持续开发,确保支持最新的跟踪源,而且保证调试器的配置简单,以及能够提供所得信息的综合分析功能。 串行端口跟踪 为了实现内部芯片流程的可见性,需要采集和处理大量跟踪数据,因此复杂的多核芯片和高性能处理器必须具有更大的带宽和以及更快速的跟踪端口。为了满足芯片制造商的要求,Lauterbach 开发出串行跟踪端口,这是近几年来行业内非常重要的创新产品之一。硬盘制造商很多年前就开始使用串行接口实现硬盘与计算机之前的高速数据交换,2008 年Lauterbach 开始推出采用串行端口技术的跟踪工具。在此期间,还有一些其他处理器使用串行跟踪接口。 更大的跟踪存储器 快速跟踪接口与高数据传输率显然都需要更大的跟踪存储空间,否则,将根本无法存储复杂嵌入系统大型程序的记录与长时间程序分析。   劳特巴赫工程师精心为您准备在线视频讲座,欢迎观看! http://v.youku.com/v_show/id_XMzExNzcwMTI4.html   登录“劳特巴赫(Lauterbach)中国公司”官方微博http://weibo.com/lauterbach 官方博客http://blog.sina.com.cn/lauterbachchina 官方网站http://www.lauterbach.com/frames.html?country=cn%3fhome_c.html 留言与专家进行互动,为您做免费咨询解答。  
相关资源