瑞萨RL78簇bootloader深入探讨(一)

前言

bootloader是单片机开发重要的一环,近期笔者需要完成一个瑞萨相关的bootloader项目,然而ARM有关bootloader的开发资料网上能找到很多,但是瑞萨相关的资料相对而言就少很多了。经过一周多从各处收集资料,总结,实验,现将近期完成的一些工作整理成本文,以便日后翻查和给其他人一些经验。
当然,本项目也是东拼西凑,仅供交流学习,许多错误之处也请多多批评指正。
注:本文代码部分均来自网络以及自编,侵删。

概述

本文的目标是完成一个由boot区和user区共同组成的完整工程,user区即用户应用程序,boot区则是程序引导区,主要是为了更新用户程序使用。然后程序复位后能够进入boot程序检查更新,然后跳转进入user程序。
相信许多看到这篇文章的同学对BootLoader都有一定了解,这里不在赘述。

user工程建立

1.新建一个新工程,MCU笔者选择R5F100LG

2.使用代码快速生成工具生成代码
为了展示中断向量表的重映射,这里专门加入几个常用中断响应。主要配置如下:
2.1 LED灯输出P14.0
2.2 串口0收发中断
2.3 ADC中断
2.4 定时器0中断




3.点击生成工程
3.1 r_main.c的初始化中启动三个中断

3.2 ADC中断中插入处理动作

3.3 在定时器中断中加入定时功能:分别是1s LED闪烁一次,2s ADC启动一次转换。(注意函数声明和加入adc的库文件)

3.4 烧录测试,测试结果是灯正常闪烁,adc中断能正常进入。证明用户基础工程建立完毕。

user工程加入启动文件、地址偏移文件、中断向量映射文件。

R5F100LG的FLASH空间是128K (0x0000 ~ 0x1FFFF),笔者将0x0000 ~ 0x2000作为boot区。0x4000 ~ 0x1FFFF作为user区。
下图是RL78G13中断向量表(节选),我们要将中断向量表映射到0x4000开始的位置。

记住我们用到得4个中断源分别是:0x1E串口0发送中断标志、0x20串口0接收中断标志、0x2C定时器0中断标志、0x34ADC中断标志。我们后续需要处理这几个中断向量。

1.加入启动文件cstart.asm及相关的def.inc、macro.inc
文件可以在C:\Program Files (x86)\Renesas Electronics\CS+\CACX\CA78K0R\V1.72\Src\cc78k0r\src目录下找到

其中cstart.asm文件中这一段要屏蔽掉,让该地址跟随我们重新定义的U_ROM地址分配。

  1. 在工程Startup中加入cstart.asm文件,并在Debug tool设置中设置为cstart启动,生成堆栈解决方案符号设置为Yes。


到这里如果再次进行调试,可以看到程序是从cstart.asm启动的,并在第294行跳转到main()函数

3. 新建并加入分区文件boot.dr,输入以下内容用于分区

MEMORY ROM       : ( 000000H, 02000H )
MEMORY U_ROM       : ( 004000H, 01C000H )merge @@CNST :=U_ROM
merge @@CNSTL :=U_ROM
merge @@R_INIT :=U_ROM
merge @@R_INIS :=U_ROM
merge @@RLINIT :=U_ROM
merge @@CODE :=U_ROM
merge @@LCODE :=U_ROM
merge @@BASE :=U_ROM
merge @@CODEL :=U_ROM

新建int_vect.asm,用于中断跳转声明,输入下列内容:

NAME    INT_VECTEXTRN   _@cstartEXTRN   AVT_RSTEXTRN   AVT_E00EXTRN   AVT_E01EXTRN   AVT_E02EXTRN   AVT_E03EXTRN   AVT_E04EXTRN   AVT_E05EXTRN   AVT_E06EXTRN   AVT_E07EXTRN   AVT_E08EXTRN   AVT_E09EXTRN   AVT_E10EXTRN   AVT_E11EXTRN   AVT_E12EXTRN   AVT_E13EXTRN   AVT_E14EXTRN   AVT_E15EXTRN   AVT_E16EXTRN   AVT_E17EXTRN   AVT_E18EXTRN   AVT_E19EXTRN   AVT_E20EXTRN   AVT_E21EXTRN   AVT_E22EXTRN   AVT_E23EXTRN   AVT_E24EXTRN   AVT_E25EXTRN   AVT_E26EXTRN   AVT_E27EXTRN   AVT_E28EXTRN   AVT_E29EXTRN   AVT_E30EXTRN   AVT_E31EXTRN   AVT_E32EXTRN   AVT_E33EXTRN   AVT_E34EXTRN   AVT_E35EXTRN   AVT_E36EXTRN   AVT_E37EXTRN   AVT_E38EXTRN   AVT_E39EXTRN   AVT_E40EXTRN   AVT_E41EXTRN   AVT_E42EXTRN   AVT_E43EXTRN   AVT_E44EXTRN   AVT_E45EXTRN   AVT_E46EXTRN   AVT_E47EXTRN   AVT_E48EXTRN   AVT_E49EXTRN   AVT_E50EXTRN   AVT_E51EXTRN   AVT_E52EXTRN   AVT_E53EXTRN   AVT_BRK@@VECT_RST CSEG AT 0000HDW      AVT_RST
@@VECT00 CSEG AT 0004HDW      AVT_E00                     ; 0x04
@@VECT01 CSEG AT 0006HDW      AVT_E01                  ; 0x06
@@VECT02 CSEG AT 0008HDW      AVT_E02                     ; 0x08
@@VECT03 CSEG AT 000AHDW      AVT_E03                     ; 0x0A
@@VECT04 CSEG AT 000CHDW      AVT_E04                     ; 0x0C
@@VECT05 CSEG AT 000EHDW      AVT_E05                     ; 0x0E
@@VECT06 CSEG AT 0010HDW      AVT_E06                  ; 0x10
@@VECT07 CSEG AT 0012HDW      AVT_E07                     ; 0x12
@@VECT08 CSEG AT 0014HDW      AVT_E08                     ; 0x14
@@VECT09 CSEG AT 0016HDW      AVT_E09                     ; 0x16
@@VECT10 CSEG AT 0018HDW      AVT_E10                     ; 0x18
@@VECT11 CSEG AT 001AHDW      AVT_E11                     ; 0x1A
@@VECT12 CSEG AT 001CHDW      AVT_E12                     ; 0x1C
@@VECT13 CSEG AT 001EHDW      AVT_E13                     ; 0x1E
@@VECT14 CSEG AT 0020HDW      AVT_E14                     ; 0x20
@@VECT15 CSEG AT 0022HDW      AVT_E15                     ; 0x22
@@VECT16 CSEG AT 0024HDW      AVT_E16                     ; 0x24
@@VECT17 CSEG AT 0026HDW      AVT_E17                     ; 0x26
@@VECT18 CSEG AT 0028HDW      AVT_E18                     ; 0x28
@@VECT19 CSEG AT 002AHDW      AVT_E19                     ; 0x2A
@@VECT20 CSEG AT 002CHDW      AVT_E20                     ; 0x2C
@@VECT21 CSEG AT 002EHDW      AVT_E21                     ; 0x2E
@@VECT22 CSEG AT 0030HDW      AVT_E22                     ; 0x30
@@VECT23 CSEG AT 0032HDW      AVT_E23                     ; 0x32
@@VECT24 CSEG AT 0034HDW      AVT_E24                     ; 0x34
@@VECT25 CSEG AT 0036HDW      AVT_E25                    ; 0x36
@@VECT26 CSEG AT 0038HDW      AVT_E26                     ; 0x38
@@VECT27 CSEG AT 003AHDW      AVT_E27                     ; 0x3A
@@VECT28 CSEG AT 003CHDW      AVT_E28                     ; 0x3C
@@VECT29 CSEG AT 003EHDW      AVT_E29                     ; 0x3E
@@VECT30 CSEG AT 0040HDW      AVT_E30                     ; 0x40
@@VECT31 CSEG AT 0042HDW      AVT_E31                     ; 0x42
@@VECT32 CSEG AT 0044HDW      AVT_E32                     ; 0x44
@@VECT33 CSEG AT 0046HDW      AVT_E33                     ; 0x46
@@VECT34 CSEG AT 0048HDW      AVT_E34                     ; 0x48
@@VECT35 CSEG AT 004AHDW      AVT_E35                     ; 0x4A
@@VECT36 CSEG AT 004CHDW      AVT_E36                     ; 0x4C
@@VECT37 CSEG AT 004EHDW      AVT_E37                     ; 0x4E
@@VECT38 CSEG AT 0050HDW      AVT_E38                     ; 0x50
@@VECT39 CSEG AT 0052HDW      AVT_E39                     ; 0x52
@@VECT40 CSEG AT 0054HDW      AVT_E40                     ; 0x54
@@VECT41 CSEG AT 0056HDW      AVT_E41                     ; 0x56
@@VECT42 CSEG AT 0058HDW      AVT_E42                     ; 0x58
@@VECT43 CSEG AT 005AHDW      AVT_E43                     ; 0x5A
@@VECT44 CSEG AT 005CHDW      AVT_E44                     ; 0x5C
@@VECT45 CSEG AT 005EHDW      AVT_E45                     ; 0x5E
@@VECT46 CSEG AT 0060HDW      AVT_E46                     ; 0x60
@@VECT47 CSEG AT 0062HDW      AVT_E47                     ; 0x62
@@VECT48 CSEG AT 0064HDW      AVT_E48                     ; 0x64
@@VECT49 CSEG AT 0066HDW      AVT_E49                     ; 0x66
@@VECT50 CSEG AT 0068HDW      AVT_E50                     ; 0x68
@@VECT51 CSEG AT 006AHDW      AVT_E51                     ; 0x6A
@@VECT52 CSEG AT 006CHDW      AVT_E52                     ; 0x6C
@@VECT53 CSEG AT 006EHDW      AVT_E53                     ; 0x6E
@@VECT_BRK CSEG AT 007EHDW      AVT_BRK                     ; 0x7E     END

屏蔽中断函数的声明和静态声明,用于接下来得外部调用,以r_adc_user.c为例。

新建vect_table.asm用于映射中断跳转。输入以下内容,主要是中断响应函数声明和中断向量对应的中断响应函数。

       NAME    VECT_TABLE
; External symbols ----------------------------------------------------------EXTRN   _@cstartEXTRN   _r_tau0_channel0_interruptEXTRN   _r_adc_interruptEXTRN   _r_uart0_interrupt_sendEXTRN   _r_uart0_interrupt_receiveBR_VALUE EQU 0EDh  ;RL78 BR opcode
; Public symbols ------------------------------------------------------------  PUBLIC   AVT_RST     PUBLIC   AVT_E00PUBLIC   AVT_E01PUBLIC   AVT_E02PUBLIC   AVT_E03PUBLIC   AVT_E04PUBLIC   AVT_E05PUBLIC   AVT_E06PUBLIC   AVT_E07PUBLIC   AVT_E08PUBLIC   AVT_E09PUBLIC   AVT_E10PUBLIC   AVT_E11PUBLIC   AVT_E12PUBLIC   AVT_E13PUBLIC   AVT_E14PUBLIC   AVT_E15PUBLIC   AVT_E16PUBLIC   AVT_E17PUBLIC   AVT_E18PUBLIC   AVT_E19PUBLIC   AVT_E20PUBLIC   AVT_E21PUBLIC   AVT_E22PUBLIC   AVT_E23PUBLIC   AVT_E24PUBLIC   AVT_E25PUBLIC   AVT_E26PUBLIC   AVT_E27PUBLIC   AVT_E28PUBLIC   AVT_E29PUBLIC   AVT_E30PUBLIC   AVT_E31PUBLIC   AVT_E32PUBLIC   AVT_E33PUBLIC   AVT_E34PUBLIC   AVT_E35PUBLIC   AVT_E36PUBLIC   AVT_E37PUBLIC   AVT_E38PUBLIC   AVT_E39PUBLIC   AVT_E40PUBLIC   AVT_E41PUBLIC   AVT_E42PUBLIC   AVT_E43PUBLIC   AVT_E44PUBLIC   AVT_E45PUBLIC   AVT_E46PUBLIC   AVT_E47PUBLIC   AVT_E48PUBLIC   AVT_E49PUBLIC   AVT_E50PUBLIC   AVT_E51PUBLIC   AVT_E52PUBLIC   AVT_E53PUBLIC   AVT_BRK; Application Vector Table --------------------------------------------------SEC_APP            CSEG                  AT    4000H
AVT_RST:DB       BR_VALUE         ; BRDW       _@cstart      ; Reset vector
AVT_E00:DB       BR_VALUE      ; BR 0x04DW       _@cstart      ; Interrupt Service Routine
AVT_E01:                DB       BR_VALUE     ; BR 0x06DW       _@cstart      ; Interrupt Service Routine
AVT_E02:DB       BR_VALUE     ; BR 0x08DW       _@cstart      ; Interrupt Service Routine
AVT_E03:DB       BR_VALUE     ; BR 0x0ADW       _@cstart      ; Interrupt Service Routine
AVT_E04:DB       BR_VALUE     ; BR 0x0CDW       _@cstart      ; Interrupt Service Routine
AVT_E05:DB       BR_VALUE     ; BR 0x0EDW       _@cstart      ; Interrupt Service Routine
AVT_E06:DB       BR_VALUE     ; BR 0x10DW       _@cstart      ; Interrupt Service Routine
AVT_E07:DB       BR_VALUE     ; BR 0x12DW       _@cstart      ; Interrupt Service Routine
AVT_E08: DB       BR_VALUE     ; BR 0x14DW       _@cstart      ; Interrupt Service Routine
AVT_E09: DB       BR_VALUE     ; BR 0x16DW      _@cstart;DW       _@cstart      ; Interrupt Service Routine
AVT_E10: DB       BR_VALUE     ; BR 0x18DW       _@cstart      ; Interrupt Service Routine
AVT_E11: DB       BR_VALUE     ; BR 0x1ADW       _@cstart      ; Interrupt Service Routine
AVT_E12: DB       BR_VALUE     ; BR 0x1CDW       _@cstart      ; Interrupt Service Routine
AVT_E13: DB       BR_VALUE     ; BR 0x1EDW       _r_uart0_interrupt_send      ; Interrupt Service Routine
AVT_E14: DB       BR_VALUE     ; BR 0x20DW       _r_uart0_interrupt_receive      ; Interrupt Service Routine
AVT_E15: DB       BR_VALUE     ; BR 0x22DW       _@cstart      ; Interrupt Service Routine
AVT_E16: DB       BR_VALUE     ; BR 0x24DW       _@cstart      ; Interrupt Service Routine
AVT_E17:  DB       BR_VALUE     ; BR 0x26DW       _@cstart      ; Interrupt Service Routine
AVT_E18:  DB       BR_VALUE     ; BR 0x28DW       _@cstart      ; Interrupt Service Routine
AVT_E19:  DB       BR_VALUE     ; BR 0x2ADW       _@cstart      ; Interrupt Service Routine
AVT_E20:  DB       BR_VALUE     ; BR 0x2CDW       _r_tau0_channel0_interrupt;DW       _@cstart      ; Interrupt Service Routine
AVT_E21:  DB       BR_VALUE     ; BR 0x2EDW       _@cstart;DW       _@cstart      ; Interrupt Service Routine
AVT_E22: DB       BR_VALUE     ; BR 0x30DW       _@cstart      ; Interrupt Service Routine
AVT_E23: DB       BR_VALUE     ; BR 0x32DW       _@cstart      ; Interrupt Service Routine
AVT_E24:  DB       BR_VALUE     ; BR 0x34DW       _r_adc_interrupt         ; Interrupt Service Routine
AVT_E25: DB       BR_VALUE     ; BR 0x36DW       _@cstart      ; Interrupt Service Routine
AVT_E26: DB       BR_VALUE     ; BR 0x38DW       _@cstart      ; Interrupt Service Routine
AVT_E27: DB       BR_VALUE     ; BR 0x3ADW       _@cstart      ; Interrupt Service Routine
AVT_E28:DB       BR_VALUE     ; BR 0x3CDW       _@cstart      ; Interrupt Service Routine
AVT_E29:DB       BR_VALUE     ; BR 0x3EDW       _@cstart      ; Interrupt Service Routine
AVT_E30: DB       BR_VALUE     ; BR 0x40DW       _@cstart      ; Interrupt Service Routine
AVT_E31: DB       BR_VALUE     ; BR 0x42DW       _@cstart      ; Interrupt Service Routine
AVT_E32: DB       BR_VALUE     ; BR 0x44DW       _@cstart      ; Interrupt Service Routine
AVT_E33: DB       BR_VALUE     ; BR 0x46DW       _@cstart      ; Interrupt Service Routine
AVT_E34: DB       BR_VALUE     ; BR 0x48DW       _@cstart         ; Interrupt Service Routine
AVT_E35: DB       BR_VALUE     ; BR 0x4ADW       _@cstart      ; Interrupt Service Routine
AVT_E36: DB       BR_VALUE     ; BR 0x4CDW       _@cstart      ; Interrupt Service Routine
AVT_E37: DB       BR_VALUE     ; BR 0x4EDW       _@cstart      ; Interrupt Service Routine
AVT_E38:DB       BR_VALUE     ; BR 0x50DW       _@cstart      ; Interrupt Service Routine
AVT_E39:DB       BR_VALUE     ; BR 0x52DW       _@cstart      ; Interrupt Service Routine
AVT_E40: DB       BR_VALUE     ; BR 0x54DW       _@cstart      ; Interrupt Service Routine
AVT_E41: DB       BR_VALUE     ; BR 0x56DW       _@cstart      ; Interrupt Service Routine
AVT_E42: DB       BR_VALUE     ; BR 0x58DW       _@cstart      ; Interrupt Service Routine
AVT_E43: DB       BR_VALUE     ; BR 0x5ADW       _@cstart      ; Interrupt Service Routine
AVT_E44: DB       BR_VALUE     ; BR 0x5CDW       _@cstart         ; Interrupt Service Routine
AVT_E45: DB       BR_VALUE     ; BR 0x5EDW       _@cstart      ; Interrupt Service Routine
AVT_E46: DB       BR_VALUE     ; BR 0x60DW       _@cstart      ; Interrupt Service Routine
AVT_E47: DB       BR_VALUE     ; BR 0x62DW       _@cstart      ; Interrupt Service Routine
AVT_E48:DB       BR_VALUE     ; BR 0x64DW       _@cstart      ; Interrupt Service Routine
AVT_E49:DB       BR_VALUE     ; BR 0x66DW       _@cstart      ; Interrupt Service Routine
AVT_E50: DB       BR_VALUE     ; BR 0x68DW       _@cstart      ; Interrupt Service Routine
AVT_E51: DB       BR_VALUE     ; BR 0x6ADW       _@cstart      ; Interrupt Service Routine
AVT_E52: DB       BR_VALUE     ; BR 0x6CDW       _@cstart      ; Interrupt Service Routine
AVT_E53: DB       BR_VALUE     ; BR 0x6EDW       _@cstart      ; Interrupt Service Routine
AVT_BRK: DB       BR_VALUE     ; BRDW       _@cstart      ; Interrupt Service Routine         END

测试与分析

完整得工程目录如图所示:

下载并开始调试:
1.开始调试之后复位会默认进入0H的位置:

2.然后会跳转AVT_RST的声明处,也就是我们重映射的4000H地址:

3.按F11进行下一步,可以看到成功跳转到_@cstart标签,也就是启动文件。

4. 294行打下断点,可以看到启动文件即将进入main()函数:

5.在重映射的中断跳转函数中打下断点,按F5进行调试,等待100ms后可以看到程序进入了我们设的重映射中断中:


6. 同理可在adc中断打下断点进行测试。

总结

本章完成了user工程的Flash区分配,中断向量表的重映射,并且重新建工程开始一步一步展示如何操作。
下一章将准备介绍boot工程的建立。期(duan)待(geng) ε≡٩(๑>₃<)۶

参考

1.《【总结】cstart.asm,78K0R系列启动文件详解》
https://blog.csdn.net/iluzhiyong/article/details/51902297

2.《自定义瑞萨单片机RL78 启动文件的六个步骤》
http://diagram.eepw.com.cn/diagram/circuit/cid/138/cirid/125679

3.《Rl78 bootloader vector table application notes》

瑞萨RL78簇bootloader深入探讨(一):User工程建立相关推荐

  1. 瑞萨RL78 dataflash pfdl库使用教程

    瑞萨RL78 dataflash pfdl库使用 1.安装PFDL库 2.CS+ for CC配置 4.读dataflash 5.写dataflash 6.注意事项 1.安装PFDL库 从瑞萨官方下载 ...

  2. 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植

    2015年的电赛已经结束了.赛前接到器件清单的时候,看到带防护圈的多旋翼飞行器赫然在列,又给了一个瑞萨RL78/G13的MCU,于是自然联想到13年的电赛,觉得多半是拿RL78/G13做四旋翼的主控, ...

  3. 关于瑞萨RL78/G13在2018年TI杯的使用

    经过4天3夜的奋斗,TI杯终于结束.俗话说的好,做任何一件事都可以得到好多东西.这次TI杯,我选用了瑞萨RL78/G13,并选做了D题,手势识别.由于我技术不够,导致算法的优化以及识别的容错率比较低, ...

  4. 瑞萨RA系列 bootloader使用MCUBoot模块更新升级应用的实例

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 本文描述瑞萨RA系列 bootloader 使用MCUBoot模块以覆盖方式更新升级应用的实例. 一.设计Bootlo ...

  5. 基于瑞萨RH850的BootLoader调试问题记录

    最近要基于瑞萨的RH850开发BootLoader,调试过程遇到了一些问题,在这里记录一下. 1 Flash擦写问题 1.1 Flash介绍 Flash分为DFlash和CFlash DFlash一般 ...

  6. 瑞萨RL78系列单片机报内存溢出故障的解决过程。RA78K0R error E3206: Segment ‘@@CODEL‘ can‘t allocate to memory - ignored

    最近开始使用瑞萨的R7F0C908芯片,ROM48K,对于目前的项目肯定是足够了,虽知道代码完成后,编译出现这个故障:RA78K0R error E3206: Segment '@@CODEL' ca ...

  7. 关于瑞萨RL78系列单片机在线升级

    最近在使用瑞萨的RL78FC0907芯片,用这个芯片做了一各在线升级的小程序.芯片基本资料请参考G13,链接如下:https://www2.renesas.cn/cn/zh/doc/products/ ...

  8. 瑞萨RL78系列单片机划分ROM、RAM区域进行合作开发

    一.引言 最近在开发中需要了一些问题,在此记录一下以便日后查看,如果有其他开发者与需要了类似的问题,也可以借鉴一下 二.背景 我们公司有个项目使用的是其他公司开发的PCB板,我们负责流程部分的开发,称 ...

  9. 瑞萨RL78\G13编译出现Segment ‘@@CODEL‘ can‘t allocate to memory

    点击Help->about查看licence,发现是CS+没有激活,呵呵. (小知识:CS+没有激活的状态下只能编译32K\64K的代码量,随芯片型号改变-) 点击开始菜单,选择下图这个东西,输 ...

最新文章

  1. CentOS6.2安装LAMP+DRUPAL网站(2)
  2. 在Makefile中的 .PHONY 是做什么的?
  3. 极路由安全设计架构分析
  4. MFC 窗体样式修改
  5. 在centos6.5中安装reids
  6. Node Introduce
  7. 管理感悟:说说NWT裁员的经历及关键错误
  8. HTML网页设计结课作业——19张精美网页!
  9. 神策分析 1.13 版本用户分群全新升级,为企业打磨­­­­­­­­­精细化运营基石
  10. 新手教程,网站建设第一步:织梦之家Dede程序的下载和安装
  11. RunCat for windows安装教程
  12. eclipse安装教程_eclipse安装教程jdk
  13. 做职场里的“超级英雄”,需要怎样的盔甲与工具?
  14. Visual C++ 2008入门经典 Ivor Horton(书_在线阅读)
  15. 电脑播放视频报错----------无法播放。请确保你的计算机的声卡和视频卡可以使用,并安装了最新的驱动程序----------解决!
  16. 转载:farey(法莱)数列
  17. 智能优化算法之蚁群算法(ACO)
  18. 淘宝app无法抓包问题
  19. 网站中的个性及风格设计
  20. Hyperionics.HyperSnap.v7.19.00.Incl.Keygen-Lz0

热门文章

  1. 示波器合成信号用matlab,用宽带示波器进行雷达信号的矢量分析
  2. 经验分享:Python3离线安装及库更新
  3. 诺基亚结盟微软 称将全球范围大规模裁员
  4. 1365:FBI树(fbi)
  5. 用python自己动手做一个小游戏01
  6. UDP的应用范围、与TCP之比较
  7. 韩国的NAVER和中国的百度
  8. 计算机桌面最小化后找不到,微博桌面最小化后找不到图标了怎么办??
  9. 雅虎通——从怀念我的雅虎说起
  10. 雅虎通可以批量添加MSN用户了