lsp什么意思| 交通运输是干什么的| 孩子为什么不愿意上学| ich是什么意思| 爱生气的人容易得什么病| 身上长红疙瘩很痒是什么原因| 一厢情愿是什么生肖| 女仆是什么意思| 心肾不交是什么意思| 吃什么可以提升白细胞| 口舌麻木吃什么药| 亲临是什么意思| 初一不能做什么| 手掌发红是什么原因| 隐翅虫皮炎用什么药膏| 黄豆什么时候播种| 仙逝是什么意思| 仲字五行属什么| 梦见倒房子是什么预兆| 密度是什么| 头晕冒汗是什么原因| 做爱什么感觉| 鞋底md是什么材质| 什么吃草吞吞吐吐歇后语| 阳萎早谢吃什么药最好| 类固醇是什么东西| 白斑有什么症状图片| 什么才是真正的情人| 不谷是什么意思| 儿童干咳吃什么药效果好| 拈花一笑什么意思| lf是什么牌子| 备胎是什么意思| 梦见自己吐了是什么意思| 雌二醇过高是什么原因| 煞是什么意思| 咽拭子是检查什么的| u型枕有什么作用| 铁面无私是什么生肖| 液金是什么| 阿司匹林主治什么病| 命里有时终须有命里无时莫强求什么意思| 七岁属什么生肖| 发烧时不宜喝什么饮料| 窝是什么结构的字| 阅读有什么好处| skechers是什么牌子| 后半夜咳嗽是什么原因| 昙花什么时间开花| 血小板低有什么症状| 头皮痒掉发严重是什么原因| 健康管理是什么专业| 子宫低回声结节是什么意思| 属牛是什么命| ootd什么意思| pdr是什么意思| 一醉方休下一句是什么| 宫颈糜烂用什么药最好| 张家界地貌属于什么地貌| 杨桃长什么样| yy飞机票是什么| 甜菜根是什么菜| 紫癜有什么危害| 152是什么意思| 靓女是什么意思| 淋巴结稍大是什么意思| 骨质增生的症状是什么| 心衰竭是什么病严重吗| 小孩血压低是什么原因| 什么带不能系| 今天是个什么日子| 什么药治便秘最好最快| 什么的生长| 送男孩子什么礼物比较好| 向日葵是什么| ryan是什么意思| 天蝎座什么星象| 苹果为什么叫苹果| 眉茶属于什么茶| 宫腔粘连是什么意思| 侮辱什么意思| 超声波是什么| 睡眠时间短早醒是什么原因| 走私是什么| 雅戈尔男装什么档次| 吃什么升血小板最快最好| 血压高什么原因| 为什么一吃饭就胃疼| 11点半是什么时辰| 松树像什么| 属狗的幸运色是什么颜色| 饭前吃药和饭后吃药有什么区别| 吃什么减肥效果最好最快| 男生喜欢什么礼物| 排尿困难是什么原因| 9月20日是什么星座| 外婆菜是什么菜做的| 左肺纤维灶什么意思| 便秘缺什么维生素| 什么水果对眼睛好| 颈椎病去医院挂什么科| mlf是什么意思| 后脑勺发麻是什么原因| 咖啡喝多了有什么危害| 什么牛奶最好| 舌面上有裂纹是什么病| 看日出是什么生肖| 吃什么补血| 一个日一个处一个口念什么| 肛裂是什么感觉| 做些什么| 什么时候有胎心胎芽| 更年期失眠吃什么药效果好| 一什么月光| 大腿酸软无力是什么原因| 南辕北辙是什么故事| 螺蛳粉有什么危害| 真性情是什么意思| 茁壮的什么| glenfiddich是什么酒| 胃反流是什么原因| 胎位rsa是什么意思| 爱吐口水是什么原因| 钾低是什么原因造成的| 姓郑的男孩取什么名字好| 金福是什么生肖| 低回声结节是什么意思| 跳蚤是什么样的图片| 塌陷是什么意思| 梦见洗衣服是什么意思| 怒发冲冠是什么意思| 什么人容易得类风湿| 中国的母亲河是什么河| 医调委是什么机构| 肠炎发烧吃什么药| 舒服是什么意思| 手指头抽筋是什么原因| 什么水果维生素含量高| 右脸突然肿了是什么原因| 汗疱疹涂什么药膏| 男性尿路感染吃什么药| 学架子鼓有什么好处| iron什么意思| 七月十号是什么日子| 肾积水是什么意思| 丝光棉是什么材质| 肾炎康复片主要是治疗什么| 老是想拉尿是什么原因| 劳士顿手表什么档次| 孟字五行属什么| 骨质疏松是什么意思| 巡视员什么级别| 眼轴是什么| 榴莲为什么贵| 附件炎用什么药最好| 今年27岁属什么生肖| 克加寸念什么| 板鞋配什么裤子好看| jacquemus是什么牌子| 什么是修行| 海洋里面有什么动物| 45属什么| 荨麻疹是什么病| 龙的五行属性是什么| 做活检前要注意什么| 木危读什么| 疑似是什么意思| 黄瓜为什么苦| 次月是什么意思| 十一点是什么时辰| 女人梦见大蟒蛇是什么征兆| 血糖高喝什么豆浆好| 右眼皮跳什么预兆| 咳嗽有黄痰吃什么消炎药| 薛字五行属什么| 红红火火是什么生肖| 肌酸激酶高吃什么药| 腹主动脉钙化是什么意思| 梦见死人复活什么预兆| 君子兰的寓意是什么| 肝外胆管扩张什么意思| 小孩肺热吃什么好清肺热| 障碍性贫血是什么病| 致意是什么意思| 勾芡用什么粉最好| 你害怕什么| 阴超是检查什么的| 帕斯是什么意思| 脊椎侧弯挂什么科| 结肠多发息肉是什么意思| 阴虚血热什么症状| 右肾肾盂分离什么意思| offer是什么| 肩袖损伤吃什么药效果最好| 硒片什么牌子好| 硫酸是什么| hpv感染是什么意思| 三伏天要注意什么| 阁五行属什么| 三个羊念什么| 站久了腰疼是什么原因| 肾出问题了有什么症状| 胎儿永存左上腔静脉是什么意思| 吃芹菜有什么好处| 真菌感染吃什么药| 宝宝什么时候长牙| 小狗拉稀吃什么药| 防蓝光是什么意思| 高血压需要注意些什么| 高湛为什么帮梅长苏| 手指甲发黑是什么原因| 三焦是什么器官| 1月1日是什么节| 热病是什么病| dpm值是什么意思| 毕业送什么花| 玉是什么结构的字| 胆红素偏高是什么原因| 猴子的尾巴像什么| 痛经是什么感觉| 虚岁24岁属什么生肖| 蓝莓不能和什么一起吃| 肌酐激酶高是什么原因| 玉米是什么植物| 砥砺前行什么意思| 左肺钙化灶是什么意思| 什么的大圆盘| 飞机杯长什么样子| 6月5日是世界什么日| 潜血十一是什么意思| 血管性头痛吃什么药| 左侧卵巢囊肿是什么原因引起的| 闯空门什么意思| 32属什么生肖| 227什么意思| 过敏性鼻炎吃什么中药| 华伦天奴属于什么档次| 很棒是什么意思| 学架子鼓有什么好处| 伤官什么意思| 三八妇女节是什么生肖| img是什么意思| 须发早白吃什么中成药| 干眼症滴什么眼药水好| 利率是什么| 什么是前鼻音和后鼻音| 骨裂什么症状| 1.11是什么星座| 低蛋白血症是什么意思| 一什么笑声| noon是什么意思| 哺乳期可以吃什么水果| 慢性肠炎是什么症状| 32周岁属什么生肖| 40不惑是什么意思| 一什么鼓| 盆腔炎做什么检查| 乳腺增生应该注意些什么| 猪头肉炒什么好吃| 水珠像什么| 广东有什么好玩的地方| 边沿是什么意思| 入肉是什么意思| 窘迫是什么意思| 百度

新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > HC(S)08单片机的高效C语言编程

梦见种地是什么意思

——
作者:飞思卡尔半导体 李志坚 杨沛骐 时间:2025-08-05 来源:电子产品世界 收藏
百度 而自2015年末以来,美国产出缺口逐渐缩小并消失,失业率运行至自然率附近甚至以下,此时新增非农就业的均衡水平下移至15万人左右。

摘要: 本文主要讨论在开发环境下如何写出适用于HC(S)08的高效程序。首先介绍编程的特点,然后介绍HC(S)08系列编程方面的优势,并给出各种高效C代码的例子程序和相关注释。

关键词: ;C语言编程;HC(S)08

的C语言编程

C语言最初是为UNIX操作系统的开发与应用而开发设计的,目前已经成为一种非常流行的编程语言。 因为C语言既有高级语言可读性强和易于维护升级的特点,又能很好的支持位运算操作,所以C常常被称为中级语言。另外,C语言数据类型的定义比较自由,所以用它比较容易写出结构化的程序。和汇编语言相比,大多数电子工程师对C语言的代码效率更关注。他们关心的问题主要集中在RAM、ROM和堆栈空间的使用效率以及编译器编译优化效率等方面。要写出一个高效的C语言程序,工程师们必须清楚的了解嵌入式系统中C语言编程的特点,掌握MCU的硬件架构和领会C语句是如何转换成汇编语句的。从台式机转向嵌入式系统编程必须先了解嵌入式系统的特点。

* 存储空间有限:尽管有些MCU有外部总线可以外扩存储器,但大多数情况下,程序越小系统成本就越低,所以要尽可能优化系统缩减代码,经济地使用RAM(包括堆栈)和ROM存储空间。

* 硬件导向:在台式机上常常需要一个美观的人机交互界面,但是在嵌入式系统中更关注的是对器件的控制。这就需要我们不仅要掌握这些器件的特性,还要了解与MCU时钟有关的操作(比如中断响应),在精准的时间点上对通用I/O口(GPIO)操作等。某些情况下,还需要根据生成的汇编语句去计算精确的运行时间,甚至直接用汇编语句编写代码。

* 特殊的处理:与台式机系统不同,MCU系统的编程常会用到一些非标准的语法来帮助编译器根据不同的MCU内核编译生成不同的代码。例如,在HC(S)08单片机中,有一种直接页(或者叫零页,地址从0x00到0xFF的页面)的寻址模式。这种寻址模式比其他寻址模式的效率要高,所以我们常常会用一些编译器指令来告诉编译器把常用的变量放置在零页地址内。另外,不同的MCU内核有不同的中断处理方式、不同的存储模式和不同的硬件语法结构。要充分利用MCU内核的优点,我们就必须灵活的使用一些关键字和特定的语法。

通常来说,在嵌入式系统中,一个优秀的程序员用汇编写出的代码的效率要比C语言写出的代码高。但是,用C语言更容易写出一个集效率、可读性和可移植性于一身的好代码。要写出高效的C代码,除了程序员有丰富的经验外,MCU内核对于C语言支持的好坏也起了很重要的作用。飞思卡尔公司的HC(S)08系列单片机的内核在这方面是比较优秀的,它可以很高效的支持C语言的编程。

HC(S)08系列单片机的嵌入式C语言

HC08和系列单片机都是采用CPU08内核,该内核能很好的支持C语言编程(更准确的说,用的是增强型内核,对C的支持更好)。CPU08内核中有几种寻址模式对C的支持非常好,第一种是变址后自加一寻址模式,这种寻址模式对于查表的操作十分有效。举例来说,采用这种寻址模式的4字节指令加上CBEQ和BRA指令可以快速的从H:X寄存器所指向的表格中找到和累加寄存器A中相同值的字节。第二种是存储器到存储器的寻址,这种寻址方式能有效的支持变量的赋值。在零页内(地址从0x00 到 0xFF)数据拷贝,只需用一句MOV指令就可以了。最后一种但也很有用的寻址模式就是堆栈指针寻址。堆栈指针寻址使得函数参数的传递以及函数内局部变量的访问变得十分容易。另外,当中断屏蔽不用时,堆栈指针可以用作第二个变址寄存器,这对多重表格的访问很有用。堆栈在C中的作用主要有三点:子程序参数的传递、局部变量的存放和递归函数的调用。CPU寄存器中如果没法存放子程序的参数(包括地址),可以把它们存放在堆栈中。CPU08内核在硬件上不仅提供了堆栈指针,还提供了堆栈指针寻址模式,这样可以在不通过出栈入栈操作的情况下直接提取参数值。有了这种寻址模式,也就不需要给局部变量专门开辟一段存储空间了。

高效C代码的编写

在讨论代码优化之前,我们先要了解以下内容。

* 编程经验—随着程序员编程经验的增长,优化代码的技术也会相应提高。
* 对指令集映射的理解—单片机的内核不同其架构和特性也不相同。必须清楚C语言和汇编语句之间的映射关系,即这句C语句生成了哪几句汇编语句。
* 对编译器/连接器特性的了解—单片机不同其编译器也不同,即使是同一内核的单片机,不同编译器的代码效率和优化方法也是不同的。
* 清楚地认识系统—除了要了解与系统成本相关的内存,也要了解系统中其他重要的部分,比如对系统运行时间和运行速度的控制、哪些存储资源有限(RAM、ROM/Flash 和堆栈等) 以及系统的可读性等等。

从减少ROM、RAM和堆栈空间的消耗以及提高系统执行速度的角度来说,优化代码的方法有许多种。这里不可能给出所有的方法,只是将一些能显著提高代码效率的方法罗列出来。

变量的定义

要写出好的程序,变量起了很重要的作用,因为大部分的代码都是和数据有关的操作。即使是在以硬件控制为主的系统中,变量也起了很大的作用,MCU的大部分工作是在把外部硬件(如传感器,按钮等)的数值读进来,进行运算处理(和存储)之后输出相应的结果,用以驱动外围硬件。在使用变量的时候,以下几点需要注意:

(1)变量的大小
不同架构的MCU中,数据类型的长度是不同的,这对于代码效率有很大的影响。在8位机中,例如HC(S)08系列单片机,8bit数据的执行效率是最高的,因为大部分的指令都以字节为运算单位。在台式机环境下,我们通常用int(整型)作为数据类型,但是int数据的长度在不同的机器和编译器中是不同的。所以,要得到高效的C语言程序,我们应该使用类型定义(typedef)的方式规定各种数据类型的长度,尽可能的采用8位数据长度。例如,用uint8_t表示一个无符号8位整型数据(一个字节),用uint16_t表示一个无符号16位整型数据。在运算表达式中,采用类型转换方式把表达式结果值的数据长度缩减到最低所需。表1给出了零页地址内不同数据长度的两个变量相加得到不同数据长度结果所需代码的多少。从中我们可以看出,数据类型长度的选择对于代码效率的影响是很大的。

(2)无符号数和定点数
除了数据长度,数据是否是有符号数也会影响代码效率。比如两个8位长度的有符号数相加,得到一个16位长度的有符号数,这需要31个字节的代码,有符号数与无符号数进行比较运算所需的代码也比两个都是无符号数运算所需的代码要多。对于运算复杂、精度要求较高的场合,常常需要用到浮点运算。如果控制器硬件上带有浮点运算单元的话,执行起来效率会比较高。但是,大多数8位MCU只支持整数运算。对于浮点运算,既要得到精确的计算结果又不降低代码效率的话,我们可以先把数据按比例放大,运算结束后再按相同比例缩小。例如,要进行十进制小数的运算,可以用101表示10.1,待运算结束后,再用除法得到我们所需的浮点值。因为HC(S)08系列单片机的乘除运算效率很高,把浮点数转成定点数运算,能提高代码效率。此外,还可以用移位的方法来替代乘除运算,Codewarrior支持用移位来替代2的倍数的乘除运算。当然,是否采用移位方式由程序员自己决定。当然,在这个过程中需要考虑是否有溢出、取整是否合理等问题,否则不但可能得到错误的结果,还有可能需要大的数据长度(比如32位的数据)来存储中间值,反而降低了代码效率。

(3)全局变量、静态变量和局部变量
在嵌入式系统中,全局变量的使用可以有效地提高代码效率。全局变量一般会有一个固定的存储位置,如果把它放在零页地址中,代码效率将大大提高。给零页地址中的全局变量赋值可以采用MOV指令,只有3个字节的代码。而给非零页地址中的全局变量赋值就需要用LDA和STA指令,这需要5个字节的代码。如果用局部变量,因为它是存放在堆栈中的,所以在某些情况下需要用到H:X寄存器,而把堆栈指针放到H:X寄存器中去需要4到6个字节的代码(如果堆栈是在零页地址内)。在全局资源有限的情况下,使用局部变量反而代码效率更高。这里的建议是把那些要频繁使用的或者有位操作的变量定义为全局变量放置在零页地址内,这样能极大的提高代码效率。使用静态变量也是一种非常有用的方法,可以在把变量存储在全局地址范围的同时保持代码的可移植性和再使用性。但是,用来存放静态变量的RAM空间不能释放出来给其他子程序使用。

静态函数

把函数定义成静态函数对于提高代码效率是很有必要的。因为模块内的静态函数只能被模块中的函数所调用,不能被模块以外的函数调用。因此,编译器会有意识的把静态函数放置在靠近其调用者的地方,这样就可以用代码少且执行速度快的指令去访问静态函数。比如用BSR(短调用指令)而不是JSR(长调用指令)。BSR是双字节指令,花费4个总线周期;JSR指令一般占用1~3个字节(跳转到H:X寄存器所指的地址占用一字节,但把地址移入H:X寄存器需要几个字节的代码)和4~6个总线周期。

数组和指针

当需要访问一系列数据的时候,在C语言中通常使用数组或者指针的方式。用固定序号的访问方式(如Array[0])生成的代码最少,执行速度也比递增索引方式(如Array[i++])快。在有些应用场合,数组指针(*(Array++))比数组具有更好的灵活性,因为它可以间接的存取数据。但是,采用数组指针的话会占用较多的ROM(额外的代码用于指针的初始化和使用过程中)和RAM(可能需要其他指针指向数组)。数组和指针除了用于数据的存取也可用于对函数的访问。在嵌入式系统中,不同情况下经常需要调用不同的函数。例如,在通讯中要根据不同的输入数据给出相对应的处理和应答。在C中一般有三种方式来处理这类情形:嵌套if语句、"Switch-case"语句、函数指针。下面是这三种方法的例子,根据状态寄存器中不同的状态值调用相应的响应函数。

i) 嵌套的if语句:
if (STATUS = = A) React_A();
else if (STATUS = = B) React_B();
else if ....
ii) switch-case语句:
switch (STATUS)
 case (A): React_A(); break;
 case (B): React_B(); break;
 ...
iii) 函数指针: (假定状态A, B, ... 是顺序编号的值,或是枚举类型值)
void React_Func[] = {React_A, React_B, ...};
...
React_Func[STATUS]();

具体采用哪种方式,依据反复次数而定。表2给出了不同方法对ROM和RAM空间的占用情况。从中可看出“switch”方式的可读性最强,但在反复次数少(函数个数少)的情况下,占用的空间最大。

“if”方式的可读性较好,占用的空间也比较小。而“pointer”方式占用ROM的空间相对变化不大,但占用许多RAM空间。

存储模式和零页的使用

不同的MCU有不同的存储模式。在 for HC(S)08 (V3.1)中,建立工程的时候有small和tiny两种模式可供选择:SMALL模式,如果没有特殊的说明,所有的指针和函数地址都被假定为16位的地址,此模式中代码和数据都被存储在64k的地址空间内;TINY 模式,所有的数据包括堆栈都分配在零页地址空间内,如果没用关键字_far作特殊说明,所有数据指针都被假定为8位地址,但是代码的地址空间仍然是64k,函数指针也仍是16位的长度。

前面讨论中说过,变量放在零页地址内生成的代码较少,而且能有效的支持位运算。在HC(S)08系列单片机中,外围寄存器一般占用$00-$3F的地址空间,所以留给RAM的零页地址空间是有限的。为了缩减生成的代码,就要把频繁使用的变量放在零页内。要根据子程序、函数参数和局部变量使用的情况,确定堆栈的使用频率,如果频率高就把堆栈放置在零页地址内。减少生成的代码,我们也要减少子程序中的参数(因为要用到A和HX寄存器),把经常使用的临时变量定义成全局变量放在零页地址中。当然,全局变量是共享的,所以用的时候我们要格外小心。下面的例程中,在Calc()函数中,可以改变全局变量gTemp2和gTemp3的值,但不能改变变量gTemp1的值,因为一开始就对子程序进行了这个设定。通常,好的变量名可以帮我们清楚的区分变量的作用范围。比如分别以1、2、3结尾的变量,可以设定等级1的子程序只能用1结尾的变量,等级2的子程序只能用2、3结尾的变量。

uint8_t gTemp1, gTemp2, gTemp3;     // 存放临时数据的全局变量,所有函数都可以访问
void_t Calc( uint8_t in) {
   gTemp3 = 0 ;
   for (gTemp2 = 5 ; gTemp2 !=0 ; gTemp2--) gTemp3 += ADCR * t_in;
}

void main( ) {
...
for (gTemp1 = 0; gTemp1 < 3; gTemp1++)
  Calc(array[gTemp1]) ; 
...
}

初始化的优化

在CodeWarrior中,每个工程都有一个模板,Start-up启动函数已经预先写好,我们可以在建工程的时候选择是否采用ANSI标准初始化程序。通常,标准初始化程序的代码效率并不高(可以参看start08.c文件中的源程序)。为了减少生成的代码,我们应该采用非ANSI标准的初始化程序,由用户自行编写。比如,仅做堆栈指针初始化、RAM清空和跳转到main函数三项工作,用如下汇编代码实现。
asm {
        clra                           ; 得到清零数据
        ldhx    #MAP_RAM_last         ; 指向RAM的尾部
        stx     MAP_RAM_first         ; 使得RAM起始地址内的数值非零
        txs                            ; 初始化堆栈指针
ClearRAM:
        psha                           ; 清空当前RAM地址
        tst     MAP_RAM_first         ; 检测是否完成RAM的清空
        bne     ClearRAM              ; 没有完成就继续

        txs                            ; 初始化堆栈指针
        jmp     main                  ; 跳转到main()函数
 }

除了这些通用的起始程序,还需要对硬件和变量进行初始化。尽管寄存器都有默认值,但仍要培养用软件对硬件初始化的好习惯。对于变量,最好初始值为零,因为清空RAM代码已经完成了这个工作。为了防止代码臃肿,建议把相同初始值的变量归为一组,这样可以用循环的方式对它们进行初始化。在优化代码的时候,要特别注意那些可变型volatile变量(比如寄存器),因为编译器是不会对这些变量进行优化的。

结语

本文简述了一些优化代码的方法,包括变量的选择、使用静态类型、数组和指针的挑选、如何使用存储模式和如何进行初始化等。但是,这仅是所有方法的一部分。一个高效的C语言程序,不仅要代码少、执行速度快,而且要清楚、简洁、准确和易注释。此外,程序要有一个好的架构,便于移植和维护。代码的再使用性(reuse)也是一个关键因素,这不在于代码本身,而在于它能减少开发调试时间。所以说,高效的C语言程序是各种因素的综合体,需要我们全面考量。

c语言相关文章:c语言教程


单片机相关文章:单片机教程


单片机相关文章:单片机视频教程


单片机相关文章:单片机工作原理




评论


相关推荐

技术专区

关闭
过劳肥是什么意思 感冒咳嗽挂什么科 曹仁和曹操什么关系 改朝换代是什么意思 溶栓治疗是什么意思
严重失眠吃什么药管用 胃食管反流吃什么中成药 阑尾炎吃什么食物好 脸上长痣是什么原因造成的 日柱将星是什么意思
芒硝是什么东西 乏力是什么原因 翠玉是什么玉 雷人是什么意思 区块链技术是什么
孕早期吃什么好 高铁为什么没有e NT是检查什么的 萎缩性胃炎能吃什么水果 妊娠反应什么时候开始
舌苔厚白吃什么食物好hcv8jop3ns4r.cn 什么眼霜去皱效果好hcv8jop2ns7r.cn 处女座上升星座是什么fenrenren.com 08年属什么生肖hcv8jop5ns6r.cn 喝断片了是什么意思hcv8jop7ns0r.cn
为什么相爱的人却不能在一起hcv9jop8ns2r.cn 胡子长得快是什么原因hcv8jop3ns4r.cn 出汗多吃什么jinxinzhichuang.com 今非昔比是什么意思hcv8jop1ns7r.cn 女人梦见老鼠什么征兆hcv8jop0ns0r.cn
睑腺炎是什么原因造成hcv8jop2ns3r.cn 妈咪是什么意思hcv8jop4ns7r.cn 仙人掌什么时候开花hcv8jop2ns3r.cn 铁剂什么时候吃最好hanqikai.com 大腿根部痒是什么原因hcv7jop6ns7r.cn
慢性咽炎挂什么科hcv8jop5ns3r.cn 流苏是什么意思gangsutong.com 孩子记忆力差吃什么好520myf.com 口腔白斑是什么病zhongyiyatai.com 7月1号是什么节hcv8jop6ns2r.cn
百度