云途车规MCU软件开发环境搭建及使用详解

电子说

1.3w人已加入

描述

 

引言

  在MCU的嵌入式软件开发领域,过去很长一段时间都是以基于Eclipse框架开发的IDE为主,典型此类IDE包括:NXP的CodeWarrior 10.x/11.xIDE, S32DS IDE, MCUXpresso IDE, TI的CCStudio IDE,瑞萨的e² studio (Eclipse) IDE和ST的STM32CubeIDESPC5-StudioIDE等,但是近些年,微软推出的开源Visual Studio Code(V简称SCode) IDE框架发展十分迅猛,根据权威数据,VScode在今年已经超过Eclipse成为全球第二大IDE。

嵌入式软件

VScode vs. Eclipse IDE

1.1 VSCode IDE架构

  VSCode是基于Electron框架构建的,使用主进程和渲染进程来管理窗口和用户界面,支持通过扩展来增强功能,并使用Monaco编辑器提供强大的代码编辑和调试功能。它的架构主要包括以下几个主要组件:  

Electron:VSCode使用Electron作为框架,它是一个基于Web技术的桌面应用程序开发框架,可以将Web技术(HTML、CSS和JavaScript)打包成一个本地应用程序。

主进程(Main Process):主进程是VSCode的核心组件,负责管理所有的窗口和应用程序的生命周期。它使用Electron提供的API来创建和管理窗口,处理菜单、对话框等系统级别的操作。

渲染进程(Renderer Process):渲染进程是VSCode的界面组件,负责显示和处理用户界面。每个窗口都有一个独立的渲染进程,它使用Electron的BrowserWindow对象来创建和管理窗口。渲染进程使用HTML、CSS和JavaScript来构建用户界面,并通过与主进程通信来执行各种操作。

扩展(Extensions):VSCode支持通过扩展来增强其功能。扩展是使用JavaScript或TypeScript编写的插件,可以添加新的编辑器功能、语言支持、调试器等。扩展可以在VSCode的运行时环境中与主进程和渲染进程进行通信,以实现各种功能。

编辑器(Editor):编辑器是VSCode的核心功能之一,它提供了强大的代码编辑和调试功能。编辑器使用Monaco编辑器作为其基础,它是一个开源的Web代码编辑器,具有语法高亮、智能代码补全、代码导航、代码重构等功能。

嵌入式软件

1.2 VSCode相对于Eclipse的优势

VSCode相对于Eclipse的优势包括:  

轻量级:VSCode是一个轻量级的编辑器,启动速度快,占用系统资源少,适合于低配置的电脑或者开发环境。

扩展性强:VSCode具有丰富的插件生态系统,可以通过安装各种插件来扩展其功能,满足不同开发需求。

跨平台支持:VSCode支持Windows、macOS和Linux等多个操作系统,开发者可以在不同的平台上使用相同的编辑器进行开发。

内置终端:VSCode内置了终端,可以在编辑器中直接执行命令,无需额外打开终端窗口,提高开发效率。

强大的调试功能:VSCode提供了强大的调试功能,支持多种编程语言的调试,可以方便地设置断点、查看变量值等。

Git集成:VSCode内置了Git集成,可以方便地进行版本控制操作,如提交、拉取、推送等。

用户友好的界面:VSCode的界面简洁、直观,易于上手和使用,同时也支持自定义布局和主题,可以根据个人喜好进行配置。

快捷键和命令:VSCode提供了丰富的快捷键和命令,可以快速执行各种操作,提高开发效率。

  总的来说,VSCode相对于Eclipse更加轻量、灵活、易用,并且具有更强大的扩展性和调试功能,适合于各种类型的开发。目前越来越多的MCU嵌入式软件开发都转向支持VSCode IDE,包括传统的8051内核MCU,基于ARM的STM32等,此外IAR和Keil等传统toolchain也提供了VSCode的扩展支持。  

1.3 VSCode IDE下载和安装

大家可以通过以下链接,免费下载安装最新版本的VSCode: https://code.visualstudio.com/download 嵌入式软件Tips:VSCode提供了三大主流OS--Linux,Windows和macOS的支持,这里我们以Windows为例进行介绍。推荐大家下载使用系统(System Installer)稳定版本(stable)的VScode IDE。   VSCode的User Installer和System Installer是安装VSCode时可选择的两种安装方式,它们的主要差异如下:  

安装位置:User Installer将VSCode安装在用户的个人目录下,而System Installer将VSCode安装在系统的公共目录下。User Installer的安装位置通常是在用户的主目录下的一个隐藏文件夹中,而System Installer的安装位置通常是在系统的应用程序目录中。

权限:由于安装位置的不同,User Installer只需要用户的权限来安装和更新VSCode,而System Installer可能需要管理员权限来进行安装和更新。

更新:User Installer会自动检测和更新VSCode,而System Installer通常需要管理员权限来进行更新。

多用户支持:User Installer适用于单用户环境,每个用户可以有自己的VSCode安装。而System Installer适用于多用户环境,所有用户共享同一个VSCode安装。

  简而言之,User Installer适用于个人开发环境,安装在用户的个人目录下,而System Installer适用于多用户环境或者需要系统范围内共享的情况,安装在系统的公共目录下。选择哪种安装方式取决于具体的使用场景和需求。   安装包下载到本地后,双击运行即可开始安装。安装步骤十分简单,此处不展开,大家可以参考官方文档。  

VSCode IDE及必要扩展安装

  基于VSCode IDE搭建云途车规MCU的整体思路如下:   使用VScode作为IDE,调用NinjaCMake构建编译环境,调用GNU工具链进行工程代码的编译和链接生成可执行文件elf和Flash下载编程文件-bin/hex/s19, 通过GNU的GDBSever或者第三方调试软件(比如Segger的Ozone, 劳德巴赫和i-System等)完成应用工程编译结果的下载和调试。  

VSCODE: https://code.visualstudio.com/

CMAKE: https://cmake.org/download/  (安装目录添加到系统PATH环境变量里)

Ninja: https://ninja-build.org/ (安装目录添加到系统PATH环境变量里)

GNU for ARM Cortex-M:https://developer.arm.com/downloads/-/gnu-rm(安装目录添加到系统PATH环境变量里)

  在Windows命令行窗口/VSCode terminal中输入查看输出以确认以上CMake和Ninja工具是否安装正确:


cmake --version
ninja --version
arm-none-eabi-gcc --version
  若输入以上命令后输出如下,则安装OK:

嵌入式软件

Tips:若无法提示的识别的命令,则有可能上面的环境变量设置对当前Windows命令行窗口/VSCode terminal没有起作用,将Windows命令行窗口/VSCode IDE 关闭重启再试。  

Tips:Ninja和CMake是与软件构建相关的工具,其功能如下:  

Ninja:Ninja是一个快速、轻量级的构建系统工具。它使用简单的配置文件来描述构建过程,并且能够高效地执行并行构建。Ninja的设计目标是提供一种快速的构建工具,尤其适用于大型项目和复杂的构建过程。Ninja通常与其他构建工具(如CMake)配合使用。

CMake:CMake是一个跨平台的构建工具,用于生成各种不同构建系统(如Makefile、Ninja等)所需的构建文件。CMake通过提供一个简单的跨平台配置语言,使得开发者可以轻松地定义项目的构建规则。CMake可以自动生成适用于不同操作系统和编译器的构建文件,简化了跨平台项目的构建过程。

  CMake用于定义项目的构建规则和依赖关系,并生成相应的构建文件(如Makefile或Ninja文件)。然后,使用Ninja等构建工具来实际执行构建过程,编译源代码、链接库文件等。CMake和Ninja的配合使用可以提供灵活、高效的项目构建解决方案,并且支持跨平台开发。   在云途配置工具(YCT)的安装包中已经包含了Ninjia、CMake和GNU for ARM toolchain,大家参考之前的文章《云途配置工具(YCT)快速上手指南(QSG)》(点击文章标题即可直接跳转阅读)安装YCT时选择一起安装,相应的工具链的安装路径也会自动设置到Windows的环境变量中,从而方便VSCode调用。   在完成YCT和VScode安装之后,为了更好的开发云途车规MCU的应用软件,还需要安装以下VScode扩展(extension):  

2.1 C/C++语言支持扩展插件--C/C++ Extension Pack

在VSCode的扩展插件(extension,快捷键Ctrl + Shift + P打开),搜索C/C++在线安装C/C++ Extension Pack插件: 嵌入式软件

2.2 CMake及CMake Tools支持扩展插件

  在VSCode的扩展插件(extension,快捷键Ctrl + Shift + P打开),搜索CMake在线安装CMake和CMake Tools插件: 嵌入式软件嵌入式软件

2.3 ARM Cortex调试扩展插件--Cortex-Debug

在VSCode的扩展插件(extension,快捷键Ctrl + Shift + P打开),搜索Cortex-Debug在线安装调试插件:

嵌入式软件

YCT创建基于云途SDK/MCAL的车规MCU VSCode应用工程

3.1 基于YCT创建云途车规MCU的SDK/MCAL的配置工程

3.1.1 通过MCU选择界面创建一个新的SDK/MCAL配置YCT工程

  通过New Project -> Start My project from MCU -> "ACCESS TOMCUSELECTOR"打开MCU选择界面, 嵌入式软件

可以查看所有支持的MCU芯片型号(part number)、封装(Package)、存储器大小、I/O及外设资源和工作主频等信息,选择使用的SDK/MCAL版本等。
嵌入式软件

Tips:由于YCT支持的MCU型号比较多,可以通过Family过滤来筛选,从而只显示勾选的MCU family,快速找到所使用的的目标MCU型号。

3.1.2 通过MCAL样例工程选择界面创建一个MCAL配置YCT工程

  通过New Project -> Start McalFromExample,Easy to Start-> "Choose Mcal Example"打开MCAL样例工程选择界面:

嵌入式软件

MCAL样例工程选择界,选择想要评估的MCU系列的MCAL版本,找到相应的MCAL模块样例工程,选择保存路径,最后点击“Create”,即可打开该MCAL样例工程:

嵌入式软件

Tips:通过这种方式打开的MCAL样例工程是将MCAL安装目录下的样例工程拷贝到用户指定目录的,可以任意修改,不必影响原有样例工程。  

3.2 YCT配置工程的工程配置(Project Setting)

  通过以上3.1.1小节介绍的方法和步骤新创建的云途SDK和MCAL 配置YCT工程,将在LOG的Porblem窗口提示项目管理(PM--Project Manager)错误:

嵌入式软件

此时需要通过YCT主页界面的“Settings”,打开YCT工程的工程设置(Project Setting)界面进行工程名、保存地址,使用工具链及调试等配置:

嵌入式软件

工程配置界面用于配置整个工程的基本属性,目前有以下配置。 嵌入式软件

3.2.1 Project配置

Project用于配置工程的基本信息,包括:  

A. 工程名(Project Name)和工程保存地址(Project Location)

嵌入式软件Tips: 工程名一旦选择好后,不能直接更改, 设置好以上配置后保存YCT工程将在选择Project Location目录下创建一个Project Name同名的文件夹保存相关工程信息。  

B. 链接文件确认(link file)

YCT工具会生成对应的链接文件,当然你也可以选择自己链接文件的位置。建议直接用默认的链接文件即可。 点击最右边的按钮,会自动填充默认的链接文件。 嵌入式软件

C. IDE选择(Toolchain/IDE)与Toolchain Path

YCT工程支持创建以下工具链的云途车规MCU SDK/MCAL应用工程:  

EWARM:IAR工程,工程属性通过IAR IDE软件界面配置;

KEIL:将创建ARM的Keil v5/MDK IDE工程,工程属性通过Keil/MDK软件界面配置;

CMake + VSCode(GCC): 使用CMake + GNU/GCC工具链的VSCode IDE工程,工程属性通过YCT的CMake GCC界面或者CMake的CMakelist.txt配置;

CMake + VSCode(IAR): 使用CMake + GNU/GCC工具链的VSCode IDE工程,工程属性通过CMake的CMakelist.txt配置;

CMake + VSCode(KEIL): 使用CMake + GNU/GCC工具链的VSCode IDE工程,工程属性通过CMake的CMakelist.txt配置;

  这些toolchain/IDE配置可以方便地通过Toolchain/IDE的下拉菜单选择:

嵌入式软件

Tips: 默认建议使用CMake+Vscode(GCC)的配置,更加高效和强大,本文介绍也以CMake+Vscode(GCC)为例进行。   当选择CMake + Vscode(GCC/IAR/KEIL)的方式时,用户需要将相应的工具链安装路径添加到操作系统的全局PATH变量或者手动选择 嵌入式软件 若已经将工具链添加到PATH变量(通过YCT安装包选择默认安装),那么这里可以不用选择。  

D. Debug in Vscode(VSCode Debug Settings)

若选择CMake+Vscode(GCC)的作为Toolchain,用户可以勾选“VSCodeDebugger”开启VSCODE 的Debug功能,目前只支持JLINK+VSCODE的方式,相关配置选项说明如下:

嵌入式软件

Debugger: JLINK, 保持默认即可;

Interface type:配置调试接口类型,推荐使用默认单线调试“SWD”,当然YTM32B1Mx系列车规MCU使用CM33内核也是可以支持标准的边界扫描JTAG接口的,只需要将此配置改为“JTAG”即可。

  Tips:① YTM32B1LD/Ex系列车规MCU使用CM0+内核,只支持SWD接口,此处不能设置为“JTAG”;② 云途MCAL中Port模块默认的调试接口功能复用也是使用SWD接口,若要使用JTAG接口,必须修改Port模块配置,否则会出现调试连接问题。

Entry point:进入调试后默认的断点,可以是任意有效的C/汇编函数名,比如应用程序主函数main或者复位函数Reset_Handler,推荐使用默认的main即可;

GDB Server path:设置JLINK GDB Server命令行(JlinkGDBServerCL.exe)的路径,默认为:C:Program Files (x86)SEGGERJLinkJLinkGDBServerCL.exe,若用户自己电脑上JLINK的安装目录与此不同,则需要手动设置一下。

  Tips:可以通过全局搜索工具,比如everyting搜索“JLinkGDBServerCL.exe”确定:

嵌入式软件

SVD file path:设置调试时内核和外设寄存器信息文件,保持默认配置即可;

  以上配置信息,将被生成保存到应用工程的./vscode/launch.json配置文件中: 嵌入式软件

3.2.2 YCT代码生成选项(Code Generate)配置

  Code Generate用于控制YCT的代码生成行为,主要配置选项包括: 嵌入式软件

Target Folder:YCT生成的配置代码保存文件夹/目录,默认为“board”,将在生成SDK/MCAL应用工程根目录下创建一个名为“board”的文件夹用于保存所有的生成文件,包括.h/.c文件和链接文件:

嵌入式软件

Keep User Code When re-generating: 配置重新生成代码时是否保存main.c中添加的用户代码,若勾选则添加在关键词保护的指定区域中的用户应用代码将不被覆盖,推荐保持默认勾选配置即可;

Generate board init function:配置是否生成系统和外设初始化函数,推荐默认的勾选配置,生成系统和外设的初始化调用API函数;

Board function name:设置Board初始化函数名字,默认为Board_Init,用户可以设置为其他名字,推荐使用默认配置即可。该函数将在生产的main()函数中调用,可将系统时钟初始化、外设模块初始化以及引脚初始化等API放到Board_Init()中,

  Tips:用户可以通过YCT的API界面图形化添加SDK和MCAL的驱动模块初始化函数: 嵌入式软件

3.2.3 工程属性(CMake GCC)配置

若3.2.1小节的IDE配置选择为“CMake+Vscode(GCC)”,则可以通过YCT提供的CMake GCC界面配置所使用的GNU GCC编译器和链接器选项,主要包括: 嵌入式软件

A. Target Config

Arm family: ARM内核,根据新建yct工程时选择的云途车规MCU型号自动选择,这里不可配置;

Library support:选择使用的C语言库,包括GNU GCC的轻量版newlib_nano no I/O、newlib_nano Debugger Console和完整版newlib no I/O、newlib Debugger Console,用户可根据自己应用的实际需求来选择:newlib_nano是newlib的一个变种,它进一步减小了库的大小,并提供了一些额外的优化。newlib_nano通过去除一些不常用的功能和减小库的大小来降低内存占用和存储需求。比如,newlib_nano库不支持浮点数。

嵌入式软件

Float ABI:浮点数应用二进制接口标准,支持纯硬件FPU(FP(hard),使用硬件浮点数指令)、纯软件库(Library(soft))和软硬件混合(Library(softfp)),对于CM33内核支持硬件FPU,推荐使用纯硬件FPU(FP(hard))或者软硬件混合(Library(softfp)),以减少代码size,提高CPU的浮点数处理性能。

嵌入式软件

FPU Type:CM33内核的FPU只支持单精度(Single-Point)浮点数指令:fpv4-sp-d16

嵌入式软件

B. Debugging Options

嵌入式软件 调试选项配置包括:

Debug Level:调试等级配置,-g/1/3,数字越大,包含的调试信息越多,推荐使用默认配置即可。PS:若此选项配置为“None”,则生成的elf文件不包含任何调试信息,下载后将无法调试,包括断点都不能打。

嵌入式软件

Debug format:生成elf文件包含的调试文件格式支持配置,用户可根据实际需求进行配置,一般情况推荐使用默认配置即可。

嵌入式软件

Generate gcov information(-ftest-coverage -fprofile-arcs): 勾选将生成GNU的代码测试覆盖度和profile信息。  

C. Compiler Options

GCC编译的配置选项如下:

嵌入式软件

其中,需要关注的配置选项如下:

Optimization Level:优化等级设置,-O0/1/2/s/fast,-O0就是没有任何优化,编译的代码size最大,-O1是比较推荐的优化设置,-Os的优化目标是代码大小size,编译结果最小,但是运行速度比较差,-Ofast优化目标为速度speed,运行速度快,但是代码size可能比较大,用户可根据实际需求进行配置,云途推荐使用-O1,因为云途SDK和MCAL都是基于-O1进行测试验证的。

嵌入式软件

Function Sections(-ffunction-section):勾选将在工程编译结果的map文件中生成应用工程中所有函数的段(.text section)信息,推荐使用默认勾选配置即可;

Data sections(-fdata-sections):勾选将在工程编译结果的map文件中生成应用工程中所数据的段(.data/.bss section)信息,推荐使用默认勾选配置即可;

Other flags:用户可在此输入自定义的编译选项,比如添加一个全局有效的宏定义符号MCAL_ENABLE_USER_MODE_SUPPORT:

嵌入式软件

D. Link Options

Link Options可以用于配置应用工程链接选项,主要配置选项如下: 嵌入式软件

Remove unused sections(-Xlinker --gc-section):勾选此选项链接生成成的elf文件将删除未使用的代码段和数据段,从而减小代码大小,且不影响应用功能和程序运行结果,因此推荐使用默认使能选项;

Printf removed sections(-Xlinker --printf-gc-section):勾选此选项,则在链接过程中将在DE的输出控制台打印被删除/移除的段信息;若有需要,可以勾选使能此选项。

Other flags:用户可在此输入自定义的链接配置选项;

  Tips:关于GNU GCC toolchain的编译链接配置选项细节,可以参考如下文章或者链接:

S32DS GNU GCC编译优化选项与配置方法详解及S32 SDK代码编译优化选项设置建议》(点击文章标题即可直接跳转阅读);

GNU官网在线帮助手册:https://www.gnu.org/doc/doc.html

3.3 生成MCAL/SDK配置代码及应用工程

在完成以上工程配置之后,点击“Ctrl+S”保存工程,则会在指定的工程目录下创建一个工程名命名的yct文件,其中保存了当前工程的所有配置信息:
嵌入式软件嵌入式软件

然后,添加应用所需的SDK或者MCAL驱动模块,完成配置并解决/fix所有错误之后(LOG界面中Problem的Errors为0),即可点击“Generate”开始配置代码和应用工程生成了:

嵌入式软件

在弹出的Generate Code窗口,可以预览查看(View)配置结果生成代码,点击“Generate”即可开始生成代码:

嵌入式软件

完成配置代码和应用工程生成后,会弹窗提示是否打开当前工程?选择“OK”,YCT就会自动调用VScode IDE打开当前工程:

嵌入式软件

YCT生成的云途车规MCU MCAL应用工程完整目录如下:

嵌入式软件

调试云途车规MCU的VSCode应用工程

  默认YCT配置生成的VSCode IDE应用工程,在确保本文第2章节介绍的工具链软件(CMake + Ninja + GCC for ARM)和VSCode扩展插件安装正确的情况下,是可以被成功编译链接生成elf文件并下载调试的。  

4.1 编译应用工程

打开上文生成的VSCode IDE应用工程,点击下方的“Build”命令,在上方弹出的编译工具链栏提示,选择“[unspecfied] Unspecified(Let CMake guess what compiler and environment to use)”即可开始工程编译和链接:

嵌入式软件

整个编译和链接过程会在VSCode IDE的OUTPUT窗口输出提示信息,编译完成后,在工程目录下将生成一个“build”文件夹,用于存放编译结果,比如map文件和elf文件:

嵌入式软件  

Tips:安装了CMake Tools VSCode扩展并且应用程序项目构建完成,生成elf文件后,打开CMake工具实用程序,用户可以选择不同的CMake目标来生成所需的Flash编程文件和工程列表文件:  

gembin-Utility:生成二进制文件,仅包含以二进制格式存储的程序数据,文件大小与Flash大小相同。

gemhex-Utility:生成Intel指定的十六进制文件,包含程序数据和Flash地址,以人类可读的ASCII文本格式表示。

gems19-Utility:生成Motorola指定的十六进制文件,包含程序数据和Flash地址,以人类可读的ASCII文本格式表示。

gemlist-Utility:生成列表文件,包含从elf文件中提取的所有汇编代码和符号信息。对于调试和问题分析很有帮助。

嵌入式软件  

生成的Flash编程文件和列表文件存放在“build”目录下:

嵌入式软件

4.2 下载调试应用工程

完成以上编译链接生成elf文件之后,就可以开始下载调试了。具体方法步骤如下:  

首先,需要确认YCT自动生成的debug配置脚本launch.json中MCU芯片的“device” name是否JLINK能够识别的目标板使用MCU对应的完整part number:

嵌入式软件

若不是(v1.1.8及之前的老版本YCT工具),则参考下表修改:

嵌入式软件

上表为J-Flash软件目标设备配置(Target Device Settings)界面截图,需要提前安装云途车规MCU的patch补丁包才能让JLINK(推荐JLINK V9以上版本硬件 + v6.96版本驱动)支持/识别。 云途车规MCU的patch补丁包的安装方法有如下两种: 方法①:使用SDK Config Tool集成的Patch Tool(从“YTMicro Devices”下拉菜单选择需要打补丁的MCU系列,在“JLink Install Path”选择JLINK软件安装根目录)
嵌入式软件

方法②:使用SDK Release Package集成的Patch Tool(配置界面和patch方法同上)
 

嵌入式软件

连接硬件:通过USB或者12V DV电源给目标EVB供电,然后提供USB将JLINK调试器与电脑主机和目标MCU EVB连接:

嵌入式软件

在VScode中,切换到debug界面,选择launch Debug jlink:,点击左侧的“▷”开始调试器连接,elf下载和调试:

嵌入式软件

进入调试界面后,默认停在main()函数最开始的默认断点:

嵌入式软件

VSCode IDE的Cortex Debug调试扩展支持自动变量(VARIABLES)手动变量(WATCH)、断点(BREAKPOINTS)外设寄存器(CORTEX PERPHERALS)和内核寄存器(CORTEX REFISTERS)查看以及复位/运行/单步/进入/退出函数/关闭调试器等便捷高效的调试控制、源代码自动跳转,断点快捷设置(单击源代码行号前红点)以及调试控制台显示下载调试命令执行log等,功能十分强大好用:

嵌入式软件

Tips:当然,用户也可以选择使用调试器(比如劳德巴赫、iSystem等)其他第三方调试软件(比如Segger的OZone, 劳德巴赫的Trace32等)下载调试本文生成的elf文件,后续专门写篇文件进行介绍。  

总结

本文详细介绍了基于YCT和VSCode(CMake + GCC)工具链的云途车规MCU应用软件开发环境的搭建和使用方法及步骤。此工具链搭建简单、功能强大、使用方便,从SDK/MCAL底层驱动图形化配置、代码和应用工程生成、到应用程序编译链接和下载调试等步骤“一气呵成”,是云途车规MCU软件开发的一站式解决方案,强烈推荐正在或者计划使用云途车规MCU芯片开发汽车ECU应用软件的用户评估使用。 

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分