f1c100s 荔枝派 系统移植
一。交叉编译环境配置
1.1下载交叉工具链:https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/

1.2解压安装
在home目录下新建 工程目录:mkdir f1c100s_project
将windows下的gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz 放置在/home/f1c200s/f1c200s_project目录下
解压:tar -vxf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
其中tar解压缩命令格式如下:
| 选项 | 含义 |
| -x | 对 tar 包做解打包操作。 |
| -f | 指定要解压的 tar 包的包名。 |
| -t | 只查看 tar 包中有哪些文件或目录,不对 tar 包做解打包操作。 |
| -C 目录 | 指定解打包位置。 |
| -v | 显示解打包的具体过程。 |
将解压的文件复制到/usr/local/arm/中
进入目录:cd /usr/local/arm/
拷贝:sudo cp -rf /home/f1c200s/f1c200s_project/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi ./
1.3添加该交叉编译器的环境变量
只有这样编译器才能在任何目录或者任何位置打开的终端中执行,打开~/.bashrc文件 (修改.bashrc文件,只是针对某一个特定的用户;修改/etc/profile文件,它是针对于所有的用户),写入以下内容:
cd /home/f1c200s/
打开文件:sudo vim .bashrc
在文件末尾添加:
export PATH=$PATH:/usr/local/arm/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin
保存退出:wq。

使环境生效:source ~/.bashrc
验证是否成功:arm-linux-gnueabi-gcc -v

二. Uboot移植
bootloader主要的工作就是引导 Linux 内核启动,常见的bootloader有 U-Boot、vivi、RedBoot 等等
2.1 uboot拉取
从gitee上拉取对 Nano 进行了适配的 u-boot:
安装git工具:sudo apt-get install git
拉取代码:git clone https://gitee.com/LicheePiNano/u-boot.git
cd u-boot
# 查看分支
git branch -a
# 切换到 Nano 分支
git checkout nano-lcd800480
u-boot对于新手来说目录层级稍显复杂,您可参考下表进行快速的熟悉和目标文件定位
2.2uboot默认配置

如上图所示,为uboot的configs目录下的两个荔枝派的配置文件,第一个licheepi_nano_defconfig 是针对TF卡的配置文件,第二个licheepi_nano_spiflash_defconfig是针对flash的启动文件,显然我们需要选择第一个配置文件编译uboot,因为我们只有TF卡一种存储介质,没有flash。下面是编译指令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_defconfig
为了避免使用类似于上方的繁琐编译指令,在uboot根目录Makfile中加入如下内容:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
这样我们可以通过以下简洁的代码进行uboot配置:
# 进入u-boot目录
cd u-boot/
# 加载配置文件
make licheepi_nano_defconfig (报错可能没有配置ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-)
经过以上操作,默认配置文件licheepi_nano_deconfig已经写入到,/uboot/.config文件中,这是根据默认配置文件,生成的uboot的最终配置文件,这个配置文件记录了所有配置选项的宏开关,我们可以通过宏开关对其进行修改。
2.3 uboot图形界面配置
2.3.1使用make menuconfig命令进行图形界面配置
ubootEnable boot arguments 选项上点击空格,弹出Boot arguments选项,选中回车输入以下内容后回车保存。用来配置串口,等待5秒,文件系统挂载盘符
console=tty1 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw
setenv bootargs "console=tty1 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw" 使用uboot 命令
2.3.2同样的操作输入bootcmd的值,输入完成后如下图所示。
load mmc 0:1 0x80008000 zImage;load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb;bootz 0x80008000 - 0x80c08000;
setenv bootcmd "load mmc 0:1 0x80008000 zImage;load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb;bootz 0x80008000 -x80c08000;" 在uboot下 使用 命令添加
如果移植在片上flash ,使用如下:bootargs=console=ttyS0,115200 panic=5 rootwait root=/dev/mtdblock3 rw rootfstype=jffs2
bootcmd=sf probe 0 50000000; sf read 0x80C00000 0x100000 0x4000; sf read 0x80008000 0x110000 0x400000; bootz 0x80008000 - 0x80C00000

2.3.3若要在套餐中附带的LCD上输出显示
请通过配置 ARM architecture --> Enable graphical uboot console on HDMI, LCD or VGA 为 Y
接着配置同级的 LCD panel timing details 为:
x:480,y:272,depth:18,pclk\khz:10000,le:42,ri:8,up:11,lo:4,hs:1,vs:1,sync:3,vmode:0
注:此块屏为为 480*272规格,如为800*480 请尝试如下配置:
x:800,y:480,depth:18,pclk\khz:33000,le:87,ri:40,up:31,lo:13,hs:1,vs:1,sync:3,vmode:0
并将 LCD panel backlight pwm pin 设为:PE6 (查自 Nano 原理图)

2.4uboot编译
在进行编译之前需要在Ubuntu 中安装 ncurses 库,否则可能编译会报错,安装命令如下:
sudo apt-get install libncurses5-dev
使用make -j8进行编译
其中-j8代表处理器核心数。编译完成,在根目录下找到u-boot-sunxi-with-spl.bin文件,该文件为最终烧录文件。
2.5烧录bin文件
只要将u-boot-sunxi-with-spl.bin烧录到tf卡的8k偏移地址处就可以了,至于为什么,上面的引用已经解释清楚了。将准备号的TF卡插入读卡器,使用如下块搬移命令进行烧写:
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
if 文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of 文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
bs bytes:同时设置读入/输出的块大小为bytes个字节。
seek blocks:从输出文件开头跳过blocks个块后再开始复制。
这里的输出文件(of)为主机电脑的/dev/sdb文件,也就是插入的读卡器代表的TF卡。
烧录完成,如下图所示,然后弹出读卡器之后再拔出,否则可能损坏读卡器。

2.6 uboot启动测试
将开发板使用数据线与电脑相连,打开串口调试工具,根据bootargs参数设置串口通信参数:
选中端口后,波特率设置为115200:
可以看到uboot版本和编译时间:

三 . 内核移植
3.1内核源码获取
1.下载Linux5.7.1源码,下载后完成后,将代码复制到Ubuntu中并解压。
https://mirror.bjtu.edu.cn/kernel/linux/kernel/v5.x/
- 在Ubuntu上创建自己的文件夹,打开终端拉取
git clone https://gitee.com/LicheePiNano/Linux.git
3.2 内核配置与编译
基础配置与编译
解压完成后,首先在顶层Makfile中指定架构和交叉编译工具。注意:arm必须是小写.
在linux源码目录下:sudo vim Makefile

Linux内核也需要进行配置,使用荔枝派的配置文件, 在arch/arm/configs文件夹中,在根目录使用以下命令配置Linux内核:
Make f1c100s_nano_linux_defconfig (针对2拉取的代码)
可能会报错:

使用如下命令安装组件:
sudo apt-get install flex
sudo apt-get install bison -y
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig 配置菜单栏
使用make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8
命令编译,经过漫长的等待后,在 arch/arm/boot目录下生成内核文件:zImage,在arch/arm/boot/dts目录下设备树文件:suniv-f1c100s-licheepi-nano.dtb。
如果出现以下错误,使用sudo apt install libssl-dev命令安装对应缺失库文件即可。

修改屏幕设备树,适配当期使用的屏幕:
~/f1c100s/Linux$ sudo vim arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dts

3.3 TF卡分区方式1:
1.初见licheepi-zero-CSDN博客
uboot移植的时候bootcmd变量记录了内核文件(zImage)和设备树(.dtb文件)的存放位置,那么现在我们就要准备好TF卡的分区,一旦编译出内核文件和设备树文件,就可以放到TF卡的指定位置,启动Linux内核。
打开终端 sudo apt-get install gparted
打开软件sudo gparted
我们需要将TF卡分区如下,其中uboot只能识别FAT16格式,EXT4格式为Linux内核识别格式。注意:一定要把上面图片中的分区删除,否则无法识别到启动文件(zImage、.dtb)。
分区 分区一 分区二
名称 kernel rootfs
分区格式 FAT16 EXT4
大小 32M(可以随意填写) 剩余空间
注意需要给uboot预留1M的空间,在【之前的空余空间】选择1M即可,在上面的可视化分区中无法看到这个预留空间。
3.4 TF卡分区 方式2:
分区【系统移植】SD卡 分区_sd卡分区-CSDN博客
先将SD 卡进行格式化。然后与虚拟机连接。
sudo fdisk -l # 首先查看电脑上已插入的TF卡的设备号
sudo umount /dev/sdb1 # 若自动挂载了TF设备,请先卸载
sudo fdisk /dev/sdb # 进行分区操作
# 若已存分区即按 d 删除各个分区
# 通过 n 新建分区,第一分区暂且申请为32M(足够大了...),剩下的空间都给第二分区
# w 保存写入并退出
sudo mkfs.vfat /dev/sdb1 # 将第一分区格式化成FAT
sudo mkfs.ext4 /dev/sdb2 # 将第一分区格式化成EXT4
3.5 内核烧录
将上面编译产生的zImage、suniv-f1c100s-licheepi-nano.dtb两个文件拷贝到KERNEL分区。将TF卡插好之后上电,打开串口调试,按下复位按键,等待uboot启动,5秒倒计时结束,读取两个文件,启动Linux内核。至此,Linux内核移植完成,下一步是Linux根文件系统(rootfs)。
- 根文件系统
文件系统是对一个存储设备上的数据和元数据进行组织的机制,这种机制有利于用户和操作系统的交互。
4.1、buildroot下载
1. 方式一:
使用buildroot制作根文件系统,首先进入官网,下载根文件系统buildroot2018.2.11版本
Buildroot - Making Embedded Linux Easy
2.方式二:
首先安装一些依赖,比如linux头文件:
apt-get install linux-headers-$(uname -r)
下载:wget https://buildroot.org/downloads/buildroot-2021.02.4.tar.gz
解压:tar xvf buildroot-2021.02.4.tar.gz
进入目录:cd buildroot-2021.02.4/
4.2、根文件系统制作
解压完成后进入文件系统根目录,清理工程后,进入图形界面配置:
make clean
make menuconfig
图形配置界面如下图所示,使用方向键选择不同选项,空格进行选中,回车进行确认。

Target options选项的配置如下图所示

第一个选项为架构选择,这里选择ARM架构小端模式,
第二个为输出的二进制文件格式,这里选择EFL格式,
第三个为架构体系,这里选择arm926t,因为F1C200S/F1C100S的架构就是这个架构,
第四个为矢量浮点处理器,这里不勾选,因为对于F1C200S/F1C100S而言,其内部没有浮点运算单元,只能进行软浮点运算,也就是模拟浮点预运算。
第五个为应用程序二进制接口,这里选择EABI,原因是该格式支持软件浮点和硬件实现浮点功能混用。
第六个为浮点运算规则,这里使用软件浮点
第七个选择指令集,这里选择ARM指令集,因为thumb主要针对Cortex M系列而言的,对于运行操作系统的A系列以及ARM9和ARM11而言,使用的都是32位的ARM指令集。
Toolchain按照下方配置(打开了一些功能)可以在开发板上直接编译程序。
C library (musl) # 使用musl减小最终体积。

登录的时候会显示 “Welcome to f1c200s linux system.” ,并且我们设置了root用户密码为“root”。

配置完成后保存,使用make命令进行编译,从下面可以看出,buildroot的编译需要网络支持,以通过网络配置我们选择的内容。 当然如果你的虚拟机无法连接网络,请看虚拟机ubuntu桥接怎么联网,或者是虚拟机net模式访问互联网。
终于编译完成了!编译完成后,在buildroot根目录的output/images目录下生成一个rootfs.rar文件,这个就是我们心心念念的根文件系统。
输出文件全部在output/目录下:
images/ — 存放编译后产生的所有镜像文件( 内核镜像 , 加载引导镜像 和 根文件系统镜像)
build/ — 存放所有的组件除了构建交叉编译工具链的组件 , 在这个目录里面每一个功能对应一个子目录存放他们各自的组件.
staging/ — 包含一个类似于根文件系统等级层次的层级 . 这个目录包含了 安装的交叉编译工具链 和 所有被选择用于目标板的所有用户空间包.
target/ — 包含了根文件系统,但不能用于你的开发板的
host/ — 包含了我们需要的交叉编译工具集

3、根文件系统移植
将上面得到的rootfs.rar解压到TF卡的第二个分区,也就是rootfs分区,不要解压完成在复制过去,因为解压出来好多文件夹。两种选择,要么把压缩包复制到rootfs分区,解压后删除压缩包,要么直接解压到第二分区。使用如下命令将压缩包解压到rootfs分区后如下图所示:
sudo tar -vxf rootfs.tar -C /media/sd 卡分区二/
4、根文件系统加载
TF卡第二个分区内已经放置了我们制作好的根文件系统,将TF卡插到开发板上并上电启动,打开串口调试助手,设置波特率115200,可以看到下面的内容,uboot和内核启动成功。
root为管理员用户名,密码为前面设置的root

相关文章:
f1c100s 荔枝派 系统移植
一。交叉编译环境配置 1.1下载交叉工具链:https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/ 1.2解压安装 在home目录下新建 工程目录:mkdir f1c100s_project 将windows下的gcc-linaro-7.2.1-2017.11-x86…...
EtherCAT 和 UDP 通讯的实时性 区别
EtherCAT 和 UDP 是两种不同的通信协议,它们在实时性方面有着本质的区别,主要体现在以下几个方面: 实时性设计目的: EtherCAT 是专为工业自动化设计的实时以太网协议,它通过独特的数据通信机制实现了极高的实时性能。E…...
山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十八)- 微服务(8)
目录 11.4 SpringAMQP 11.4.2 Work Queue工作队列 11.4.3 发布订阅模型 11.4.4 FanoutExchange(广播交换机) 11.4.5 DirectExchange(路由模式交换机) 11.4.6 TopicExchange 11.5 消息转换器 11.4 SpringAMQP 父工程引入AMQP依赖 <!--AMQP依赖,包含RabbitMQ…...
如何将 MySQL 数据库共享给他人?
文章目录 共享所有数据库给他人1. 连接到 MySQL 数据库2. 选择要使用的数据库3. 修改连接所需的 host4. 刷新权限 共享部分数据库给他人1. 创建用户2. 授权3. 刷新权限 结语 🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是I…...
netty-学习
Netty Netty 的核心概念Netty 的主要特性Netty 的应用场景Netty 的基本使用服务器端处理器 总结 代码分析1.心跳检测代码解析类和成员变量userEventTriggered方法总结 4.参数详解ChannelHandlerContext ctxObject evt 事件来源示例:配置 IdleStateHandler事件处理示…...
无线和移动网络
背景 两个重要的挑战 无线:通过无线链路通信移动:需要网络处理移动(不同变换所接入的网络)用户 无线网络中的组件 无线主机(无线并不总是意味着移动的)基站(base station 或者叫AP࿰…...
快团团账号被封,大团长帮卖团长如何避免违规操作
去年末到现在有部分小伙伴反馈,自己的快团团账号资金提现受到限制,也有个别的快团团大团长账号直接被查封了,有些团长是明知是违规行为还抱有侥幸的心理,比如有个做房产中间的小伙,知道套现违规还频频套现,…...
Github Copilot登录账号,完美支持chat
Github Copilot 代码补全等功能,提高写代码的效率 https://web.52shizhan.cn/activity/copilot 登录授权后,已经可以使用,完美。如图...
Ubuntu系统中Apache Web服务器的配置与实战
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
如何在路由器上安装代理服务:详细教程
如何在路由器上安装代理服务:详细教程 步骤一:通过漏洞进入路由器系统开启Telnet服务使用Telnet登录路由器系统查看系统信息和CPU信息步骤二:交叉编译MIPS程序 Go对MIPS的支持 安装TFTP Server使用BusyBox tftp传输文件在路由器系统中下载编译…...
JavaScript html css前端 日期对象 date对象 日期格式化 时间戳
日期对象 Date对象 Date 对象和 Math 对象不一样,他是一个构造函数,所以我们需要实例化后才能使用 Date 实例用来处理日期和时间 Date()使用方法 示例:获取当前时间 let now new Date() console.log(now) 示例:获取指定时间…...
【再探】设计模式—备忘录模式与解释器模式
备忘录模式是用于保存对象在某个时刻的状态,来实现撤销操作。而解释器模式则是将文本按照定义的文法规则解析成对应的命令。 1 备忘录模式 需求:保存对象在某个时刻的状态,后面可以对该对象实行撤销操作。 1.1 备忘录模式介绍 提供一种状…...
SpringCloud网关-gateway
一 什么是网关?为什么选择 Gateway? 网关功能如下: 身份认证和权限校验服务路由、负载均衡请求限流 在 Spring Cloud 中网关的实现包含两种: Gateway(推荐):是基于 Spring5 中提供的 WebFlux ÿ…...
LiveData是如何感知Room数据变化的
一 Room数据变化LiveData如何收到onChanged回调的? 1.1 LiveData是如何创建的 这里讨论的LiveData的创建是特指Dao定义的方法的返回类型,而不是所有的LiveData。 以NoteDao 举例: Dao public interface NoteDao {Query("select * fr…...
【自动化】WebUI自动化通过读取用户数据的方式启动浏览器实现绕过相关登录验证的方法。
背景说明 我相信做自动化测试或者实现UI自动化相关功能的同学肯定碰到过,每次写好脚本执行时都是默认打开一个 “新”的浏览器,我的意思是就跟刚下载的浏览器一样。而不是平时日常使用着的浏览器的状态,日常使用浏览器时只要近期登录过&…...
信号:干扰类别及特征提取
目录 第一部分:干扰类别 1.压制干扰 1.1噪声调幅瞄准式干扰(单音干扰) 1.2噪声调频阻塞式干扰(宽带噪声干扰) 1.3噪声调频扫频式干扰(线性调频) 2.欺骗干扰 2.1距离欺骗干扰(幅度调制干扰࿰…...
【推荐】用scss循环zoom缩放比例,解决可视化大屏在不同分辨率屏幕下的适配问题
方法1: 指定几种常规屏幕宽度(用这种方式就必须要强制用户全屏查看页面,在固定的宽度下才能达到比较不错的显示效果) // 适配不同分辨率的页面---------------------------------------- html {overflow: hidden;width: 1920px;…...
23中设计模式之一— — — —命令模式的详细介绍
命令模式 Command Pattern讲解 概念描述模式结构主要角色模式的UIM类图模式优点模式缺点应用场景实例演示类图代码演示运行结果 概念 命令模式(别名:动作,事务) 命令模式是一种行为设计模式,将一个请求封装为一个对象…...
解决 Mac Django 连接Mysql 出现 image not found 问题
最近在使用 Django 框架,因为升级到4.2版本了,对应的本机 Mysql 5.7 就不适用了,于是升级到了 Mysql 8.0,写好代码之后出现如下错误: 仔细分析一下错误的描述: ImportError: dlopen(/Library/Frameworks/P…...
EitbaseEX香港业务开展,提升用户友好交易体验
在全球范围内备受瞩目的加密货币交易平台Coinbase,宣布正式入驻香港市场,并命名为EitbaseEX。这一战略性扩展举措,旨在为香港提供先进的加密货币交易技术和服务,同时将香港打造为其在亚太地区的重要枢纽。 作为国际金融中心&#…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

