Rockchip芯片单板适配OpenHarmony的方法

news2024/11/25 22:50:13

Rockchip芯片单板适配OpenHarmony的方法

1 整体思路

OpenHarmony是一个上层用户操作系统,在设计上希望兼容不同的底层系统。针对于L2的Linux标准设备,OpenHarmony对Linux、Uboot等底层系统没有太多的依赖,并且在驱动方面,HDF也兼容Linux标准驱动。

所以,底层系统基本上可以直接使用芯片厂家或者oem厂家原有的,上层系统使用OpenHarmony编译出来的。

整体思路上,可以采用分区image拼接的方式来移植适配:

  • 底层系统,即内核及之前的image:uboot、boot(含dtb 、kenel、驱动)等,使用芯片厂家或者oem厂家原有的;

  • 上层系统,即内核之上的image:rootfs、vendor(或者叫oem)、userdata,使用OpenHarmony的。

如果单板SDK的编译工具链和OpenHarmony的编译工具链是兼容的,底层系统的boot(含dtb 、kenel、驱动)部分,用单板SDK编译出来的image就可以。

如果不是兼容的,底层系统的boot部分需要用OpenHarmony的编译工具链重新编译出image。可以参考zh-cn/device-dev/porting/porting-linux-kernel.md · OpenHarmony/docs - Gitee.com

2 版本选择

1.1 OpenHarmony版本选择

建议选择比较新比较稳定的版本,暂不选择开发分支master,当前选择的是OpenHarmony-v3.1-Beta,该版本上已经有Rockchip芯片的产品"润和DAYU200",所以移植起来更加简单。

1.2 SDK版本选择

建议选择纯净的Linux SDK。

基于RK芯片的一些单板支持多种操作系统,比如Android、Ubuntu、Buildroot(纯Linux),对应有不同的SDK,建议选择纯Linux的SDK,不要用Android和Ubuntu的,一是因为Android和Ubuntu对内核机制有修改,增加了移植的难度和工作量,比如Android的AVB、动态分区等机制都影响我们移植;二是目前RK主要芯片的纯Linux SDK的编译工具链和OpenHarmony的工具链是兼容的。

3 适配方法

以Firefly的RK系列为例,适配方法如下步骤。

本方法已验证适配以下Firefly产品,验证OpenHarmony系统都可以正确起来、亮屏显示Launcher。

  • ROC-RK3568-PC,芯片为rk3568
  • AIO-3568J,芯片为rk3568
  • AIO-3399J,芯片为rk3399

步骤1 准备基础环境

选择使用纯Linux SDK的Buildroot固件,从Firefly官网下载对应产品的Buildroot固件进行烧录。

例如,

ROC-RK3568-PC的下载链接:https://www.t-firefly.com/doc/download/107.html

ROC-RK3568-PC的烧录方法:https://wiki.t-firefly.com/zh_CN/ROC-RK3568-PC/03-upgrade_firmware.html

步骤2 修改编译内核

OpenHarmony需要使用IPC binder通信,纯净Linux SDK中没有开启,需要开启IPC binder后重新编译内核。

需要获取到源码后,修改内核配置打开CONFIG_ANDROID_BINDER_IPC宏,重新编译内核。

比如,Firefly系列的操作方法:

首先,在Firefly官网下载对应产品的Linux_SDK源码包,注意Kernel需要选择4.19版本。

然后,修改产品对应的config文件,增加CONFIG_ANDROID_BINDER_IPC=y。比如

在kernel/arch/arm64/configs/firefly_linux_defconfig增加CONFIG_ANDROID_BINDER_IPC=y。

然后,按照官网指导配置好编译环境,编译内核./build.sh kernel,拿到boot.img。

最后,使用按分区烧录的方式,单独烧录编译后的boot.img。烧录成功单板起来后,确保单板基本功能仍然正常,确保有/sys/module/binder/目录。

# ls /sys/module/binder/ -l
total 0
drwxr-xr-x 2 root root    0 2022-01-25 07:20 parameters
--w------- 1 root root 4096 2022-01-25 07:18 uevent

烧录时的分区表文件parameter.txt,可以从步骤2下载的源码中拿到,也可以从步骤1中的Buildroot固件解包拿到。解包的方法,可以参考https://blog.csdn.net/Neutionwei/article/details/121886647

步骤3 修改编译OH

需要有OpenHarmony-v3.1-Beta标准系统的image,下载OpenHarmony-v3.1-Beta的代码,编译hihope rk3568产品。

代码下载路径:zh-cn/release-notes/OpenHarmony-v3.1-beta.md · OpenHarmony/docs - Gitee.com

修改代码:rk3399需要删除zpos相关代码,下面列出的代码需要删除。rk3568不需要这个代码修改。

// 代码路径:./device/hihope/hardware/display/src/display_device/drm_plane.cpp 
// 所在函数:int32_t DrmPlane::Init(DrmDevice &drmDevice)
// 删除如下代码:
    ret = drmDevice.GetPlaneProperty(*this, PROP_ZPOS_ID, prop);
    DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc prop id"));

// 代码路径:./device/hihope/hardware/display/src/display_device/hdi_drm_composition.cpp
// 所在函数:int32_t HdiDrmComposition::ApplyPlane(HdiDrmLayer &layer,
//                                       HdiLayer &hlayer,
//                                       DrmPlane &drmPlane,
//                                       drmModeAtomicReqPtr pset)
// 删除如下代码:
    ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropZposId(), layer.GetZorder());
    DISPLAY_LOGI("set the fb planeid %{public}d, GetPropZposId %{public}d, zpos %{public}d", drmPlane.GetId(), drmPlane.GetPropZposId(), layer.GetZorder());
    DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the zpos fialed errno : %{public}d", errno));

编译方法:编译润和DAYU200产品,详细编译指导见OpenHarmony/device_hihope

bash build/prebuilts_download.sh
./build.sh --product-name rk3568 --ccache

编译后,拿到system.img,vendor.img,userdata.img

步骤4 调整分区表

因OH的image较大,需要调整分区表。

在分区表文件parameter.txt中修改CMDLINE的内容,根据vendor.img、system.img和userdata.img的大小,调整oem、rootfs、userdata的分区大小,并相应调整后续分区的位置。

比如,Firefly ROC-RK3568-PC产品调整后的分区表。

mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),0x00020000@0x00028000(recovery),0x00010000@0x00048000(backup),0x00150000@0x00058000(oem),0x30ce00@0x001A8000(rootfs),-@0x4B4e00(userdata:grow)

步骤5 烧录修改后分区表和image

使用升级工具,先导入步骤4修改的分区表文件parameter.txt(右键-->导入配置-->选择文件类型为txt),然后选择各文件进行烧录。

  • Parameter,选择步骤4修改后分区表文件parameter.txt

  • oem,选择步骤3编译的vendor.img

  • rootfs,选择步骤3编译的system.img

  • userdata,选择把步骤3编译的userdata.img

    这一步完成后,rk3568系列产品,OpenHarmony已经可以起来了,HDMI屏幕可以显示OpenHarmony的桌面。

步骤6 修改挂载路径

挂载路径说明

不同产品的分区挂载路径不一样,在分区挂载时,需要指定自己产品实际的分区挂载路径。

我们使用的是OpenHarmony hihope rk3568编译出的image,这些image中的分区挂载路径配置是hihope rk3568的,需要修改成自己产品的实际分区挂载路径。

对于OpenHarmony上的hihope rk3568,有两个文件指定了挂载路径,需要修改这两个文件。

第一个文件是/system/etc/init.without_two_stages.cfg(这是在单板上的路径),打包在system.img中,代码文件路径是device/hihope/rk3568/build/rootfs/init.without_two_stages.cfg

"mount ext4 /dev/block/platform/fe310000.sdhci/by-name/vendor /vendor wait rdonly barrier=1",
"mount ext4 /dev/block/platform/fe310000.sdhci/by-name/userdata  /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc"

说明:没开启ramdisk的产品使用/system/etc/init.without_two_stages.cfg,开启ramdisk的产品使用/system/etc/init.cfg。目前测试的几个Firefly产品没有开启ramdisk,如果你不清楚是否开启了ramdisk,建议这两个cfg文件都修改。

第二个文件/vendor/etc/fstab.rk3568(这是在单板上的路径),打包在vendor.img中,代码文件路径是./device/hihope/rk3568/build/rootfs/fstab.rk3568。

# fstab file.
# <src>    <mnt_point>    <type>    <mnt_flags and options>    <fs_mgr_flags>
/dev/block/platform/fe310000.sdhci/by-name/system               /usr       ext4     ro,barrier=1  wait,required
/dev/block/platform/fe310000.sdhci/by-name/vendor              /vendor        ext4     ro,barrier=1  wait,required
/dev/block/platform/fe310000.sdhci/by-name/userdata               /data       ext4     nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc wait,reservedsize=104857600

修改方法

先查看分区挂载路径,不同产品的分区路径的前缀,可以用如下命令查看。查到的前缀加上分区名称,就是完整的挂载路径。

# find /dev/ -name "by-name"
/dev/block/platform/fe310000.sdhci/by-name

然后修改配置文件。可以在代码中修改后再编译,也可以把busybox打包到system image中通过vi修改,还可以直接基于image文件修改,方法如下。

  1. 在Linux服务器上,拿到vendor.img和system.img

  2. 新建空文件夹,比如temp

  3. 将system.img mount到temp目录

  4. 修改temp/system/etc/init.without_two_stages.cfg文件中的挂载路径,并保存。不同产品怎么修改列在后面。

  5. umout temp

  6. 将vendor.img mount到temp目录

  7. 修改temp/etc/fstab.rk3568文件中的挂载路径,并保存。不同产品怎么修改列在后面。

  8. umout temp

    执行命令可参考:

tanpengju@OpenHarmony:~/firefly/hihope$ ls
system.img  userdata.img  vendor.img
tanpengju@OpenHarmony:~/firefly/hihope$ mkdir temp
tanpengju@OpenHarmony:~/firefly/hihope$ sudo mount system.img temp
tanpengju@OpenHarmony:~/firefly/hihope$ ls temp
bin  config  data  dev  etc  init  lib  lost+found  proc  sys  system  updater  vendor
tanpengju@OpenHarmony:~/firefly/hihope$ sudo vi temp/system/etc/init.without_two_stages.cfg
tanpengju@OpenHarmony:~/firefly/hihope$ sudo umount temp
tanpengju@OpenHarmony:~/firefly/hihope$ ls temp/
tanpengju@OpenHarmony:~/firefly/hihope$ sudo mount vendor.img temp
tanpengju@OpenHarmony:~/firefly/hihope$ ls temp/
etc  lost+found
tanpengju@OpenHarmony:~/firefly/hihope$ sudo vi temp/etc/fstab.rk3568
tanpengju@OpenHarmony:~/firefly/hihope$ sudo umount temp

完成修改后,烧录修改后的system.img和vendor.img。

烧录后在单板串口通过mount命令查看分区挂载情况,确认oem、userdata分区成功挂载到/vendor和/data目录。

不同产品修改点

Firefly ROC-RK3568-PC和Firefly AIO-3568J ,主要修改了分区名称。

# /system/etc/init.without_two_stages.cfg文件
"mount ext4 /dev/block/platform/fe310000.sdhci/by-name/oem /vendor wait rdonly barrier=1",
"mount ext4 /dev/block/platform/fe310000.sdhci/by-name/userdata /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc"
# /vendor/etc/fstab.rk3568文件
# fstab file.
# <src>    <mnt_point>    <type>    <mnt_flags and options>    <fs_mgr_flags>
/dev/block/platform/fe310000.sdhci/by-name/rootfs               /usr       ext4     ro,barrier=1  wait,required
/dev/block/platform/fe310000.sdhci/by-name/oem              /vendor        ext4     ro,barrier=1  wait,required
/dev/block/platform/fe310000.sdhci/by-name/userdata               /data       ext4     nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc wait,reservedsize=104857600

Firefly AIO-3399J ,主要修改分区路径和名称。

# /system/etc/init.without_two_stages.cfg文件
"mount ext4 /dev/block/platform/fe330000.sdhci/by-name/oem /vendor wait rdonly barrier=1",
"mount ext4 /dev/block/platform/fe330000.sdhci/by-name/userdata /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc"
# /vendor/etc/fstab.rk3568文件
# fstab file.
# <src>    <mnt_point>    <type>    <mnt_flags and options>    <fs_mgr_flags>
/dev/block/platform/fe330000.sdhci/by-name/rootfs               /usr       ext4     ro,barrier=1  wait,required
/dev/block/platform/fe330000.sdhci/by-name/oem              /vendor        ext4     ro,barrier=1  wait,required
/dev/block/platform/fe330000.sdhci/by-name/userdata               /data       ext4     nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc wait,reservedsize=104857600

步骤7 触摸屏的适配

首先,查找触摸屏对应的设备。使用 cat /proc/bus/input/devices找到触摸屏对应的设备。比如,这里触摸屏是第4个设备,记录Name为"himax-touchscreen"。

# cat /proc/bus/input/devices
I: Bus=0019 Vendor=524b Product=0006 Version=0100
N: Name="fe6e0030.pwm"
P: Phys=gpio-keys/remotectl
S: Sysfs=/devices/platform/fe6e0030.pwm/input/input0
U: Uniq=
H: Handlers=kbd event0 cpufreq
B: PROP=0
B: EV=3
B: KEY=100 0 0 40408800 1c16c0 0 0 0

I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="rk805 pwrkey"
P: Phys=rk805_pwrkey/input0
S: Sysfs=/devices/platform/fdd40000.i2c/i2c-0/0-0020/rk805-pwrkey/input/input1
U: Uniq=
H: Handlers=kbd event1 cpufreq
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="Typec_Headphone"
P: Phys=fusb302/typec
S: Sysfs=/devices/platform/fdd40000.i2c/i2c-0/0-0022/input/input2
U: Uniq=
H: Handlers=event2
B: PROP=0
B: EV=21
B: SW=4

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="himax-touchscreen"
P: Phys=
S: Sysfs=/devices/virtual/input/input3
U: Uniq=
H: Handlers=kbd event3 cpufreq
B: PROP=2
B: EV=b
B: KEY=10 0 0 0 0 0 0 0 400 0 0 0 2000000 0 40000800 40 0 0 0
B: ABS=6658000 0

I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="adc-keys"
P: Phys=adc-keys/input0
S: Sysfs=/devices/platform/adc-keys/input/input4
U: Uniq=
H: Handlers=kbd event4 cpufreq
B: PROP=0
B: EV=3
B: KEY=40000800 40000 1000000 0 0

然后,将触摸屏设备的Name配置到udev的rule中,让udev自动识别该名称的设备为触摸屏设备。在/etc/udev/rules.d/touchscreen.rules文件末尾中,添加下面这句话,其中"himax-touchscreen"是上一步查询到的名称,不同硬件环境下不一样。

ATTR{name}=="himax-touchscreen", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"

修改后的touchscreen.rules文件,示意如下:

# cat /etc/udev/rules.d/touchscreen.rules
ATTRS{name}=="VSoC touchscreen", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
ATTRS{name}=="VSoC keyboard", ENV{ID_INPUT}="1", ENV{ID_INPUT_KEYBOARD}="1"
DRIVERS=="hid-multitouch", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
ATTR{name}=="himax-touchscreen", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
#

修改touchscreen.rules后,需要重启设备生效。

4 适配效果

Firefly ROC-RK3568-PC:

Firefly AIO-3568J :

Firefly AIO-3399J:

适配后,显示和触摸可用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯省一经验+考试流程+技巧分享

今年拿了省一&#xff0c;开心&#xff0c;我渡梦酒也可以拿奖奖啦。 我对整体参赛流程还是比较熟悉了&#xff0c;给大家留下一点值得参考的东西~。 这篇纯纯经验和技巧分享&#xff0c;请放心食用~ 目录 考试流程 考试代码怎么提交 考完结束需要做什么 做题小技巧&#xf…

适合学生党的蓝牙耳机品牌有哪些?性价比高的无线耳机推荐

相较于有线耳机&#xff0c;蓝牙耳机的受欢迎程度可谓是越来越高&#xff0c;当然&#xff0c;这也离不开部分手机取消耳机孔的设计。最近看到很多网友问&#xff0c;适合学生党的蓝牙耳机品牌有哪些&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款性价比高的无线耳机…

VR全景摄影,全景VR展示模式

目前&#xff0c;全景概念已经被大众熟知&#xff0c;很多行业尤其是房产、汽车等已经开始大批量使用全景展示的方式提高获客率和推广率。VR全景摄影以全景摄影技术为基础&#xff0c;结合虚拟现实技术&#xff0c;可以让用户身临其境&#xff0c;沉浸式地感受虚拟环境。 一、V…

【 Spring AOP 】

文章目录 一、什么是 Spring AOP&#xff1f;二、为什要⽤ AOP&#xff1f;三、AOP 的组成四、Spring AOP 的实现五、Spring AOP 实现原理 一、什么是 Spring AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;⾯向切⾯编程&#xff0c;它…

【Linux常见指令以及权限理解】基本指令(2)

写在前面 今天我们继续学习Linux的基本指令&#xff0c; 这里是上一篇博客的链接&#xff1a;http://t.csdn.cn/9AgHP 接下来我会继续讲解Linux指令相关内容。 目录 写在前面 1. man 描述&#xff1a; 用法&#xff1a; 例子&#xff1a; 例1&#xff1a; 例2&#…

MC9S12G128开发板—实现按键发送CAN报文指示小车移动功能

实验环境&#xff1a;MC9S12G128开发板 基本功能&#xff1a;控制开发板上的按键&#xff0c;模拟车辆移动的上下左右四个方位&#xff0c;通过can通信告诉上位机界面&#xff0c;车辆轨迹的移动方位。 1. 1939报文发送的示例代码 MC9S12G128开发板1939协议发送can报文数据的…

redmine问题跟踪系统4.1版本一键安装包下载

很好用的项目管理&#xff0c;缺陷跟踪系统&#xff0c;开源免费使用 Version 4.1.1-4 2020-08-31 由 redmineplugins.cn Admin 在 超过 2 年 之前添加 Version 4.1.1-4 2020-08-31 Maintenance releaseUpdated Apache to 2.4.46Updated Git to 2.28.0Updated PHP to 7.3.21U…

初识uniapp

创建小程序 依次点击HBuilderx 左上方的按钮&#xff1a;文件->新建->项目 然后打开该界面&#xff0c;输入项目名称&#xff0c;点击 浏览 按钮&#xff0c;可以选择项目保存的目录&#xff0c;这些完成后点击 创建 按钮就好了 比如小颖的项目名叫 &#xff1a;test-y…

基于一致性的半监督学习用于诊断x线片分类

文章目录 Consistency-Based Semi-supervised Evidential Active Learning for Diagnostic Radiograph Classification摘要方法Evidential-based Semi-supervised LearningEvidential-based Active Learning Consistency-Based Semi-supervised Evidential Active Learning for…

Java+Angular开发的医院信息管理系统源码,系统部署于云端,支持多租户

云HIS系统源码&#xff0c;采用云端SaaS服务的方式提供 基于云计算技术的B/S架构的云HIS系统源码&#xff0c;采用云端SaaS服务的方式提供&#xff0c;使用用户通过浏览器即能访问&#xff0c;无需关注系统的部署、维护、升级等问题&#xff0c;系统充分考虑了模板化、配置化、…

第四届CECC中国计算机教育大会召开,飞桨持续加码产教融合教育新生态

‍‍大模型作为人工智能发展的新方向&#xff0c;对人才的需求和培养带来了新挑战。4月21日至22日&#xff0c;以“新时代 新挑战 新任务”为主题的第四届中国计算机教育大会&#xff08;CECC&#xff09;在厦门召开&#xff0c;飞桨承办“人工智能与大模型”论坛同期举办。立足…

【Python安卓开发】BeeWare框架:环境准备

&#x1f4ad; 写在前面&#xff1a;我们假定读者已经安装好了 3.8 版本后的 Python&#xff0c;并且安装好了依赖项&#xff0c;在 Windows 上构建 BeeWare 应用程序需要 Git&#xff0c;你可以可以从 git-scm.org 网站下载。安装完毕后重新启动 cmd&#xff0c;然后就可以准备…

Compiler- 循环展开

循环展开不仅在编译原理中有涉及到&#xff0c;笔者记得在CSAPP里面也提到了这种优化方法。 话不多说&#xff0c;我们先来看个例子。 int loop(int a) {int result 0;for(int i 0; i < a; i){result i;}return result; }int loop1(int a) {int result 0;int len a/2…

虚拟化、容器与Docker基本介绍以及安装部署镜像加速

目录 一.虚拟化概述 1.虚拟化是什么&#xff1f; 2.虚拟化两大组件 3.虚拟化类型 4.虚拟化功能 二.容器概述 1.容器是什么&#xff1f; 2.容器的优点 3.容器的缺点 三.Docker概述 1.Docker是什么&#xff1f; 2.Docker容器与虚拟机的区别 3.容器在内核中支持两种重…

从0开始学习docker-1.mysql安装

从0开始学习docker 环境安装安装mysql备份镜像删除镜像镜像恢复 环境安装 yum update yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install docker-ce systemc…

IOS工程:NSThread sleepForTimeInterval的使用,游戏中途中断(接电话或者点击Home按钮),重新回到游戏音频音效失效问题

IOS工程&#xff1a;NSThread sleepForTimeInterval的使用&#xff0c;游戏中途中断&#xff08;接电话或者点击Home按钮&#xff09;&#xff0c;重新回到游戏音频音效失效问题 设备/引擎&#xff1a;Mac&#xff08;11.7&#xff09;/cocos 开发工具&#xff1a;Xcode 开发…

composer 安装gitlab私有库

开发PHP项目&#xff0c;免不了用composer。最近做一个项目&#xff0c;需要到公司内部开发的核心包&#xff0c;核心包放在内网搭建的gitlab仓库中&#xff0c;于是我用composer进行下载&#xff0c;报错&#xff1a; Cloning into bare repository C:/Users/Administrator/A…

Mac电脑系统管家CleanMyMac X4.13安装下载使用教程

当我们刚刚拿到那闪亮的新Mac时&#xff0c;是多么令人愉悦的一种感觉&#xff01;随着时间的推移&#xff0c;你可能已经注意到它的速度减慢&#xff0c;磁盘空间逐渐减少。不用担心&#xff0c;CleanMyMac会为你的电脑带来焕然一新的体验。这篇文章将向你介绍CleanMyMac的奇妙…

企业oa管理系统是什么

办公自动化&#xff08;Office Automation&#xff0c;简称OA&#xff09;&#xff0c;是将计算机、通信等现代化技术运用到传统办公方式&#xff0c;进而形成的一种新型办公方式。 办公自动化利用现代化设备和信息化技术&#xff0c;代替办公人员传统的部分手动或重复性业务活…

史上最全Python14张思维导图+字节跳动出品《Python背记手册》,高清PDF限时开放!

前言 Python是一种语法简单、功能强大的编程语言&#xff0c;它既适用于传统编程语言擅长的Web开发、移动开发、游戏开发、桌面应用&#xff0c;又适用于当前流行的人工智能、大数据、科学计算、金融分析…… 如果你想要学习一门编程语言Python肯定是一个不错的选择&#xff…