Pegasus开发环境

本文涉及的产品
视频直播,500GB 1个月
简介: Pegasus开发环境


Pegasus开发环境

HUAWEI DevEco Device Tool

以插件的形式部署在Visual Studio Code上

开发环境部署

步骤1 安装 vs code

Visual Studio Code - Code Editing. Redefined

步骤2 DecEco Device Tool 下载安装

华为集成开发环境IDE DevEco Device Tool下载 | HarmonyOS设备开发

  • 解压后安装
  • 选择安装路径

安装完成后打开vs code可以发现扩展图标

步骤3 下载Hi3861 Openharmony SDK

https://gitee.com/wgm2022/hi3861_for_AI_topic

步骤4 下载开发者工具

https://hispark.obs.cn-east-3.myhuaweicloud.com/DevTools_Hi3861V100_v1.0.zip

解压后目录

步骤5 工程管理配置
1. 打开DevEco Device Tool 主页 导入工程

2. 选择Hi3861 Openharmony SDK目录

3. 芯片选型

SOC栏选择Hi3861, 开发板选择hi3861, 框架栏选择Hb

4. 进行后续代码开发、编译、烧录

Pegasus相关代码路径:

hi3861_for_AI_topic-master\src\vendor\hisilicon\hispark_pegasus\demo\

步骤6 编译、烧录
1. 配置开发工具路径

点击工程配置,配置compiler_bin_path选项为下载好的开发工具目录

2. 编译

3. 烧录

连接设备后,选择对应的COM

烧录

测试程序-led闪烁

1. 创建子模块文件夹

在hi3861_for_AI_topic-master\src\applications\sample\wifi-iot\app目录下创建led_demo文件夹

2. 子模块程序编写

led_demo文件夹中的文件结构如下

  • app_demo_led_control.c
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "iot_watchdog.h"
#include "hi_io.h"
#define IOT_GPIO_IDX_10 9 // for hispark_pegasus
static void *LedCntrolDemo(const char *arg)
{
    (void)arg;
    printf("LedTask start\r\n");
    // 配置GPIO引脚号和输出值
    while(1){
        IoTGpioSetOutputVal(IOT_GPIO_IDX_10, IOT_GPIO_VALUE1);
        TaskMsleep(800);
        IoTGpioSetOutputVal(IOT_GPIO_IDX_10, IOT_GPIO_VALUE0);
        TaskMsleep(800);
    }
    return NULL;
}
static void LedControlTask(void)
{
    osThreadAttr_t attr;
    // 初始化GPIO
    IoTGpioInit(IOT_GPIO_IDX_10);
    // 设置GPIO为输出方向
    IoTGpioSetDir(IOT_GPIO_IDX_10, IOT_GPIO_DIR_OUT);
    attr.name = "LedCntrolDemo";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024; /* 堆栈大小为1024 */
    attr.priority = osPriorityNormal;
    // 报错
    if (osThreadNew((osThreadFunc_t)LedCntrolDemo, NULL, &attr) == NULL) {
        printf("[LedExample] Failed to create LedTask!\n");
    }
}
SYS_RUN(LedControlTask);
  • hal_iot_gpio_ex.c
#include "iot_errno.h"
#include "iot_gpio_ex.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_task.h"
#include "hi_types_base.h"
unsigned int IoSetPull(unsigned int id, IotIoPull val)
{
    if (id >= HI_GPIO_IDX_MAX) {
        return IOT_FAILURE;
    }
    return hi_io_set_pull((hi_io_name)id, (hi_io_pull)val);
}
unsigned int IoSetFunc(unsigned int id, unsigned char val)
{
    if (id >= HI_GPIO_IDX_MAX) {
        return IOT_FAILURE;
    }
    return hi_io_set_func((hi_io_name)id, val);
}
unsigned int TaskMsleep(unsigned int ms)
{
    if (ms <= 0) {
        return IOT_FAILURE;
    }
    return hi_sleep((hi_u32)ms);
}
  • iot_gpio_ex.h
#ifndef IOT_GPIO_EX_H
#define IOT_GPIO_EX_H
/**
 * @file iot_gpio_ex.h
 *
 * @brief Declares the extended GPIO interface functions.
 *
 * These functions are used for settings GPIO pulls and driver strength. \n
 *
 * @since 1.0
 * @version 1.0
 */
/**
 * @brief Enumerates GPIO pull-up or pull-down settings.
 */
typedef enum {
    /** No pull */
    IOT_IO_PULL_NONE,
    /** Pull-up */
    IOT_IO_PULL_UP,
    /** Pull-down */
    IOT_IO_PULL_DOWN,
    /** Maximum value */
    IOT_IO_PULL_MAX,
} IotIoPull;
/**
 * @ingroup iot_io
 *
 * GPIO pin ID. CNcomment:IO硬件管脚编号。CNend
 */
typedef enum {
    IOT_IO_NAME_GPIO_0, /* <GPIO0 */
    IOT_IO_NAME_GPIO_1, /* <GPIO1 */
    IOT_IO_NAME_GPIO_2, /* <GPIO2 */
    IOT_IO_NAME_GPIO_3, /* <GPIO3 */
    IOT_IO_NAME_GPIO_4, /* <GPIO4 */
    IOT_IO_NAME_GPIO_5, /* <GPIO5 */
    IOT_IO_NAME_GPIO_6, /* <GPIO6 */
    IOT_IO_NAME_GPIO_7, /* <GPIO7 */
    IOT_IO_NAME_GPIO_8, /* <GPIO8 */
    IOT_IO_NAME_GPIO_9, /* <GPIO9 */
    IOT_IO_NAME_GPIO_10, /* <GPIO10 */
    IOT_IO_NAME_GPIO_11, /* <GPIO11 */
    IOT_IO_NAME_GPIO_12, /* <GPIO12 */
    IOT_IO_NAME_GPIO_13, /* <GPIO13 */
    IOT_IO_NAME_GPIO_14, /* <GPIO14 */
    IOT_IO_NAME_SFC_CSN, /* <SFC_CSN */
    IOT_IO_NAME_SFC_IO1, /* <SFC_IO1 */
    IOT_IO_NAME_SFC_IO2, /* <SFC_IO2 */
    IOT_IO_NAME_SFC_IO0, /* <SFC_IO0 */
    IOT_IO_NAME_SFC_CLK, /* <SFC_CLK */
    IOT_IO_NAME_SFC_IO3, /* <SFC_IO3 */
    IOT_IO_NAME_MAX,
} IotIoName;
/**
 * @ingroup iot_io
 *
 * GPIO_0 pin function.CNcomment:GPIO_0管脚功能。CNend
 */
typedef enum {
    IOT_IO_FUNC_GPIO_0_GPIO,
    IOT_IO_FUNC_GPIO_0_UART1_TXD = 2,
    IOT_IO_FUNC_GPIO_0_SPI1_CK,
    IOT_IO_FUNC_GPIO_0_JTAG_TDO,
    IOT_IO_FUNC_GPIO_0_PWM3_OUT,
    IOT_IO_FUNC_GPIO_0_I2C1_SDA,
} IotIoFuncGpio0;
/**
* @ingroup iot_io
*
* GPIO_1 pin function.CNcomment:GPIO_1管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_1_GPIO,
    IOT_IO_FUNC_GPIO_1_UART1_RXD = 2,
    IOT_IO_FUNC_GPIO_1_SPI1_RXD,
    IOT_IO_FUNC_GPIO_1_JTAG_TCK,
    IOT_IO_FUNC_GPIO_1_PWM4_OUT,
    IOT_IO_FUNC_GPIO_1_I2C1_SCL,
    IOT_IO_FUNC_GPIO_1_BT_FREQ,
} IotIoFuncGpio1;
/**
* @ingroup iot_io
*
* GPIO_2 pin function.CNcomment:GPIO_2管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_2_GPIO,
    IOT_IO_FUNC_GPIO_2_UART1_RTS_N = 2,
    IOT_IO_FUNC_GPIO_2_SPI1_TXD,
    IOT_IO_FUNC_GPIO_2_JTAG_TRSTN,
    IOT_IO_FUNC_GPIO_2_PWM2_OUT,
    IOT_IO_FUNC_GPIO_2_SSI_CLK = 7,
} IotIoFuncGpio2;
/**
* @ingroup iot_io
*
* GPIO_3 pin function.CNcomment:GPIO_3管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_3_GPIO,
    IOT_IO_FUNC_GPIO_3_UART0_TXD,
    IOT_IO_FUNC_GPIO_3_UART1_CTS_N,
    IOT_IO_FUNC_GPIO_3_SPI1_CSN,
    IOT_IO_FUNC_GPIO_3_JTAG_TDI,
    IOT_IO_FUNC_GPIO_3_PWM5_OUT,
    IOT_IO_FUNC_GPIO_3_I2C1_SDA,
    IOT_IO_FUNC_GPIO_3_SSI_DATA,
} IotIoFuncGpio3;
/**
* @ingroup iot_io
*
* GPIO_4 pin function.CNcomment:GPIO_4管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_4_GPIO,
    IOT_IO_FUNC_GPIO_4_UART0_RXD = 2,
    IOT_IO_FUNC_GPIO_4_JTAG_TMS = 4,
    IOT_IO_FUNC_GPIO_4_PWM1_OUT,
    IOT_IO_FUNC_GPIO_4_I2C1_SCL,
} IotIoFuncGpio4;
/**
* @ingroup iot_io
*
* GPIO_5 pin function.CNcomment:GPIO_5管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_5_GPIO,
    IOT_IO_FUNC_GPIO_5_UART1_RXD = 2,
    IOT_IO_FUNC_GPIO_5_SPI0_CSN,
    IOT_IO_FUNC_GPIO_5_PWM2_OUT = 5,
    IOT_IO_FUNC_GPIO_5_I2S0_MCLK,
    IOT_IO_FUNC_GPIO_5_BT_STATUS,
} IotIoFuncGpio5;
/**
* @ingroup iot_io
*
* GPIO_6 pin function.CNcomment:GPIO_6管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_6_GPIO,
    IOT_IO_FUNC_GPIO_6_UART1_TXD = 2,
    IOT_IO_FUNC_GPIO_6_SPI0_CK,
    IOT_IO_FUNC_GPIO_6_PWM3_OUT = 5,
    IOT_IO_FUNC_GPIO_6_I2S0_TX,
    IOT_IO_FUNC_GPIO_6_COEX_SWITCH,
} IotIoFuncGpio6;
/**
* @ingroup iot_io
*
* GPIO_7 pin function.CNcomment:GPIO_7管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_7_GPIO,
    IOT_IO_FUNC_GPIO_7_UART1_CTS_N = 2,
    IOT_IO_FUNC_GPIO_7_SPI0_RXD,
    IOT_IO_FUNC_GPIO_7_PWM0_OUT = 5,
    IOT_IO_FUNC_GPIO_7_I2S0_BCLK,
    IOT_IO_FUNC_GPIO_7_BT_ACTIVE,
} IotIoFuncGpio7;
/**
* @ingroup iot_io
*
* GPIO_8 pin function.CNcomment:GPIO_8管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_8_GPIO,
    IOT_IO_FUNC_GPIO_8_UART1_RTS_N = 2,
    IOT_IO_FUNC_GPIO_8_SPI0_TXD,
    IOT_IO_FUNC_GPIO_8_PWM1_OUT = 5,
    IOT_IO_FUNC_GPIO_8_I2S0_WS,
    IOT_IO_FUNC_GPIO_8_WLAN_ACTIVE,
} IotIoFuncGpio8;
/**
* @ingroup iot_io
*
* GPIO_9 pin function.CNcomment:GPIO_9管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_9_GPIO,
    IOT_IO_FUNC_GPIO_9_I2C0_SCL,
    IOT_IO_FUNC_GPIO_9_UART2_RTS_N,
    IOT_IO_FUNC_GPIO_9_SDIO_D2,
    IOT_IO_FUNC_GPIO_9_SPI0_TXD,
    IOT_IO_FUNC_GPIO_9_PWM0_OUT,
    IOT_IO_FUNC_GPIO_9_I2S0_MCLK = 7,
} IotIoFuncGpio9;
/**
* @ingroup iot_io
*
* GPIO_10 pin function.CNcomment:GPIO_10管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_10_GPIO,
    IOT_IO_FUNC_GPIO_10_I2C0_SDA,
    IOT_IO_FUNC_GPIO_10_UART2_CTS_N,
    IOT_IO_FUNC_GPIO_10_SDIO_D3,
    IOT_IO_FUNC_GPIO_10_SPI0_CK,
    IOT_IO_FUNC_GPIO_10_PWM1_OUT,
    IOT_IO_FUNC_GPIO_10_I2S0_TX = 7,
} IotIoFuncGpio10;
/**
* @ingroup iot_io
*
* GPIO_11 pin function.CNcomment:GPIO_11管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_11_GPIO,
    IOT_IO_FUNC_GPIO_11_UART2_TXD = 2,
    IOT_IO_FUNC_GPIO_11_SDIO_CMD,
    IOT_IO_FUNC_GPIO_11_SPI0_RXD,
    IOT_IO_FUNC_GPIO_11_PWM2_OUT,
    IOT_IO_FUNC_GPIO_11_RF_TX_EN_EXT,
    IOT_IO_FUNC_GPIO_11_I2S0_RX,
} IotIoFuncGpio11;
/**
* @ingroup iot_io
*
* GPIO_12 pin function.CNcomment:GPIO_12管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_12_GPIO,
    IOT_IO_FUNC_GPIO_12_UART2_RXD = 2,
    IOT_IO_FUNC_GPIO_12_SDIO_CLK,
    IOT_IO_FUNC_GPIO_12_SPI0_CSN,
    IOT_IO_FUNC_GPIO_12_PWM3_OUT,
    IOT_IO_FUNC_GPIO_12_RF_RX_EN_EXT,
    IOT_IO_FUNC_GPIO_12_I2S0_BCLK,
} IotIoFuncGpio12;
/**
* @ingroup iot_io
*
* GPIO_13 pin function.CNcomment:GPIO_13管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_13_SSI_DATA,
    IOT_IO_FUNC_GPIO_13_UART0_TXD,
    IOT_IO_FUNC_GPIO_13_UART2_RTS_N,
    IOT_IO_FUNC_GPIO_13_SDIO_D0,
    IOT_IO_FUNC_GPIO_13_GPIO,
    IOT_IO_FUNC_GPIO_13_PWM4_OUT,
    IOT_IO_FUNC_GPIO_13_I2C0_SDA,
    IOT_IO_FUNC_GPIO_13_I2S0_WS,
} IotIoFuncGpio13;
/**
* @ingroup iot_io
*
* GPIO_14 pin function.CNcomment:GPIO_14管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_GPIO_14_SSI_CLK,
    IOT_IO_FUNC_GPIO_14_UART0_RXD,
    IOT_IO_FUNC_GPIO_14_UART2_CTS_N,
    IOT_IO_FUNC_GPIO_14_SDIO_D1,
    IOT_IO_FUNC_GPIO_14_GPIO,
    IOT_IO_FUNC_GPIO_14_PWM5_OUT,
    IOT_IO_FUNC_GPIO_14_I2C0_SCL,
} IotIoFuncGpio14;
/**
* @ingroup iot_io
*
* SFC_CSN pin function.CNcomment:SFC_CSN管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_SFC_CSN_SFC_CSN,
    IOT_IO_FUNC_SFC_CSN_SDIO_D2,
    IOT_IO_FUNC_SFC_CSN_GPIO9,
    IOT_IO_FUNC_SFC_CSN_SPI0_TXD = 4,
} IotIoFuncSfcCsn;
/**
* @ingroup iot_io
*
* SFC_DO pin function.CNcomment:SFC_DO管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_SFC_IO_1_SFC_DO,
    IOT_IO_FUNC_SFC_IO_1_SDIO_D3,
    IOT_IO_FUNC_SFC_IO_1_GPIO10,
    IOT_IO_FUNC_SFC_IO_1_SPI0_CK = 4,
} IotIoFuncSfcIo1;
/**
* @ingroup iot_io
*
* SFC_WPN pin function.CNcomment:SFC_WPN管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_SFC_IO_2_SFC_WPN,
    IOT_IO_FUNC_SFC_IO_2_SDIO_CMD,
    IOT_IO_FUNC_SFC_IO_2_GPIO11,
    IOT_IO_FUNC_SFC_IO_2_RF_TX_EN_EXT,
    IOT_IO_FUNC_SFC_IO_2_SPI0_RXD,
} IotIoFuncSfcIo2;
/**
* @ingroup iot_io
*
* SFC_DI pin function.CNcomment:SFC_DI管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_SFC_IO_0_SFC_DI,
    IOT_IO_FUNC_SFC_IO_0_SDIO_CLK,
    IOT_IO_FUNC_SFC_IO_0_GPIO12,
    IOT_IO_FUNC_SFC_IO_0_RF_RX_EN_EXT,
    IOT_IO_FUNC_SFC_IO_0_SPI0_CSN,
} IotIoFuncSfcIo0;
/**
* @ingroup iot_io
*
* SFC_CLK pin function.CNcomment:SFC_CLK管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_SFC_CLK_SFC_CLK,
    IOT_IO_FUNC_SFC_CLK_SDIO_D0,
    IOT_IO_FUNC_SFC_CLK_GPIO13,
    IOT_IO_FUNC_SFC_CLK_SSI_DATA = 4,
} IotIoFuncSfcClk;
/**
* @ingroup iot_io
*
* SFC_HOLDN pin function.CNcomment:SFC_HOLDN管脚功能。CNend
*/
typedef enum {
    IOT_IO_FUNC_SFC_IO_3_SFC_HOLDN,
    IOT_IO_FUNC_SFC_IO_3_SDIO_D1,
    IOT_IO_FUNC_SFC_IO_3_GPIO14,
    IOT_IO_FUNC_SFC_IO_3_SSI_CLK = 4,
} IotIoFuncSfcIo3;
/**
* @ingroup iot_io
*
* I/O drive capability.CNcomment:IO驱动能力。CNend
* Note: The HI_IO_NAME_GPIO_0~HI_IO_NAME_GPIO_11 and HI_IO_NAME_GPIO_13~HI_IO_NAME_GPIO_14 driver capabilities are
*       optional.The value range is HI_IO_DRIVER_STRENGTH_0~HI_IO_DRIVER_STRENGTH_3, and the other I/O ranges are
*       HI_IO_DRIVER_STRENGTH_0~HI_IO_DRIVER_STRENGTH_7.CNcomment:注意:HI_IO_NAME_GPIO_0~HI_IO_NAME_GPIO_11、
*       HI_IO_NAME_GPIO_13~HI_IO_NAME_GPIO_14驱动能力可选范围是HI_IO_DRIVER_STRENGTH_0~HI_IO_DRIVER_STRENGTH_3,
*       其余IO范围是HI_IO_DRIVER_STRENGTH_0~HI_IO_DRIVER_STRENGTH_7。CNend
*/
typedef enum {
    IOT_IO_DRIVER_STRENGTH_0 = 0,   /* <Drive strength level 0 (highest).CNcomment:驱动能力0级,驱动能力最高CNend */
    IOT_IO_DRIVER_STRENGTH_1,   /* <Drive strength level 1.CNcomment:驱动能力1级CNend */
    IOT_IO_DRIVER_STRENGTH_2,   /* <Drive strength level 2.CNcomment:驱动能力2级CNend */
    IOT_IO_DRIVER_STRENGTH_3,   /* <Drive strength level 3.CNcomment:驱动能力3级CNend */
    IOT_IO_DRIVER_STRENGTH_4,   /* <Drive strength level 4.CNcomment:驱动能力4级CNend */
    IOT_IO_DRIVER_STRENGTH_5,   /* <Drive strength level 5.CNcomment:驱动能力5级CNend */
    IOT_IO_DRIVER_STRENGTH_6,   /* <Drive strength level 6.CNcomment:驱动能力6级CNend */
    IOT_IO_DRIVER_STRENGTH_7,   /* <Drive strength level 7 (lowest).CNcomment:驱动能力7级,驱动能力最低CNend */
    IOT_IO_DRIVER_STRENGTH_MAX,
} IotIoDriverStrength;
unsigned int IoSetPull(unsigned int id, IotIoPull val);
unsigned int IoSetFunc(unsigned int id, unsigned char val);
unsigned int TaskMsleep(unsigned int ms);
#endif
/** @} */
  • BUILD.gn
static_library("ledDemo") {
  sources = [
    "app_demo_led_control.c",
    "hal_iot_gpio_ex.c",
  ]
  include_dirs = [
    "./",
    "//commonlibrary/utils_lite/include",
    "//kernel/liteos_m/kal/cmsis",
    "//base/iot_hardware/peripheral/interfaces/kits",
  ]
}
3. 修改工程配置文件

修改hi3861_for_AI_topic-master\src\applications\sample\wifi-iot\app目录下的BUILD.gn文件

import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
    features = [
        "led_demo:ledDemo",
    ]
}
4. 编译、烧录

烧录、重启后即可看到板载led灯闪烁

相关文章
|
4月前
|
Ubuntu Shell Linux
开发环境的安装
开发环境的安装
48 1
|
7月前
|
缓存 监控 JavaScript
环境搭建:Vue项目的开发环境和生产环境配置
【4月更文挑战第23天】本文指导Vue开发者配置开发和生产环境,强调了两者目的和特点。开发环境用于编写、测试和调试,侧重快速反馈和调试工具;生产环境注重稳定性、效率和安全性,需进行代码优化、错误处理和日志监控。配置步骤包括安装Node.js和npm,使用Vue CLI,配置Webpack、热重载和源码映射。生产环境要实现代码分割、压缩、最小化,启用CSP、HTTPS,优化静态资源和缓存策略。环境配置应随项目发展和技术进步持续优化。
787 0
|
7月前
|
Rust 数据可视化 开发工具
rustlings本地开发环境配置
rustlings本地开发环境配置
73 0
|
Java
[BlocklyNukkit入门]#1配置开发环境
这里用PowerNukkit举例
102 0
|
JavaScript API
vite配置开发环境和生产环境
vite配置开发环境和生产环境
vite配置开发环境和生产环境
|
移动开发 Java Linux
ReactNative开发环境的搭建与开发前准备(一)
ReactNative开发环境的搭建与开发前准备
144 0
ReactNative开发环境的搭建与开发前准备(一)
|
移动开发 前端开发 网络协议
ReactNative开发环境的搭建与开发前准备(二)
ReactNative开发环境的搭建与开发前准备
159 0
ReactNative开发环境的搭建与开发前准备(二)
|
移动开发 JavaScript 前端开发
ReactNative开发环境的搭建与开发前准备(三)
ReactNative开发环境的搭建与开发前准备
110 0
ReactNative开发环境的搭建与开发前准备(三)
|
Web App开发 SQL Ubuntu
我的开发环境
- 搜索: 好记性不如会搜索 - 模糊匹配: 几乎所有搜索的地方都支持模糊匹配, 只要顺序正确就可以搜索到 - 工具化: 在重复执行不出错上, 机器绝对可以轻蔑地说「愚蠢的人类」, 我通常会回应「所以你是机器」 - 自动保存: 都 9102 了, 还不用自动保存 - vim: learn once, use everywhere
225 0
下一篇
DataWorks