全志F1C100s使用记录:u-boot linux rootfs 编译与烧录测试(基于SD卡)

article/2025/9/22 4:01:23

文章目录

  • 目的
  • 基础准备
    • 硬件准备
    • 开发环境
  • 制作toolchain和rootfs
    • 设置编译工具链
  • u-boot & linux编译
    • u-boot
    • boot.scr
    • linux
  • 测试程序
  • 文件烧录
    • 分区设置
    • 分块烧录
  • 上电测试
  • 系统镜像
    • 制作镜像文件
    • 使用镜像文件
  • 可能会遇到的问题
  • SDK数据包
  • 总结

目的

这篇文章中将测试在 F1C100s 中运行Linux系统( 基于SD卡 / TF卡),一些背景资料请查看 《全志F1C100s使用记录:资料索引与基础说明》 这篇文章。

基础准备

硬件准备

测试用开发板可以参考上面文章中电路绘制,或者也可以直接购买荔枝派Nano进行测试。
在这里插入图片描述

开发环境

下载安装Ubuntu Desktop(使用版本为20.04):
https://ubuntu.com/download/desktop

安装完成后进行基础环境安装与设置:

sudo apt updatesudo apt install -y build-essential
sudo apt install -y libusb-1.0-0-dev zlib1g-dev
sudo apt install -y pkg-config
sudo apt install -y python python3 python-dev python3-dev
sudo apt install -y swig
sudo apt install -y libncurses-dev libncurses5-dev
sudo apt install -y libssl-dev
sudo apt install -y kpartx
sudo apt install -y mtd-utils

因为需要从GitHub下载项目所以还要安装git:

sudo apt install -y git
# git使用时可能需要设置用户名和邮箱
# git config --global user.name "naisu"
# git config --global user.email naisu@example.com

建立工作目录并进入:

# 本文将工作目录设置在用户目录($HOME)下的f1c100s-sdk文件夹中
# cd ~
mkdir f1c100s-sdk
cd f1c100s-sdk/ 

制作toolchain和rootfs

为了方便这里使用buildroot来制作rootfs,这里有个坑。这里如果使用linaro等组织提供的现成的交叉编译工具链来编译buildroot项目生成rootfs,在使用时系统启动过程中可能会出现 Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b ,而使用buildroot自己生成的编译工具链就不会出现这个问题了。所以我们这里统一使用buildroot生成的编译工具链。

下载、解压与配置:

# cd ~/f1c100s-sdk/
wget https://buildroot.org/downloads/buildroot-2022.02.tar.xz
tar -xJf buildroot-2022.02.tar.xz# 进入buildroot-2022.02目录
cd buildroot-2022.02/# 进行配置
# 这里做测试使用,只要配置下目标和工具链即可,详见后面截图
make menuconfig# 编译
make

在这里插入图片描述
在这里插入图片描述

编译完成后 output 目录下的 host 目录中就是交叉编译工具链(toolchain); output 目录下的 images 目录中的 rootfs.tar 就是生成的根文件系统。

设置编译工具链

注意PATH使用自己的路径,每次打开终端都需要重新设置:

export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabi-
export PATH=$PATH:/home/nx/f1c100s-sdk/buildroot-2022.02/output/host/bin

u-boot & linux编译

u-boot

下载、配置、编译:

# cd ~/f1c100s-sdk/
git clone -b nano-lcd800480 --depth=1 https://github.com/Lichee-Pi/u-boot.git# 进入u-boot目录
cd u-boot/# 加载配置文件
make licheepi_nano_defconfig# 修改默认bootcmd
gedit include/configs/suniv.h

需要修改为:

#define CONFIG_BOOTCOMMAND "run distro_bootcmd"

然后就可以编译了:

# 根据电脑配置使用make -jx等加快编译速度
make

编译后当前目录下的 u-boot-sunxi-with-spl.bin 文件就是我们需要的。

boot.scr

根据上面对bootcmd的修改,u-boot启动时会从第一分区读取 boot.scr 文件,并执行其中的脚本。我们可以通过这个来设置要传递给linux内核的参数、来加载内核和设备树、来启动内核。

在uboot目录下新建boot.cmd文件,向其中写入u-boot要执行的脚本:

# cd ~/f1c100s-sdk/u-boot/
touch boot.cmd
gedit boot.cmd

写入以下内容:

# 设置传递给内核的bootargs参数
# 读取内核镜像和设备树到内存中指定位置
# 启动内核程序
setenv bootargs console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 rw
load mmc 0:1 0x80008000 zImage
load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb
bootz 0x80008000 - 0x80C00000

使用u-boot编译后tools目录下的 mkimage 工具可以将boot.cmd文件生成为 boot.scr 文件,通过下面命令:

# arm架构;不压缩;script文件;输入boot.cmd文件;输出boot.scr文件
tools/mkimage -A arm -C none -T script -d boot.cmd boot.scr

生成的 boot.scr 文件就在当前目录下。

linux

# cd ~/f1c100s-sdk/
git clone -b nano-4.14-exp --depth=1 https://github.com/Lichee-Pi/linux.git# 进入linux目录
cd linux/# 下载使用荔枝派Nano的linux配置文件
wget https://dl.sipeed.com/fileList/LICHEE/Nano/SDK/config
cp config .config# 根据需要配置,没有需要的话直接按两下Esc保存退出
make menuconfig# 编译
# 根据电脑配置使用make -jx等加快编译速度
# 过程中如果出现需要设置的选项全部选n
make

编译后在 arch/arm/boot/ 目录下的 zImage 文件就是压缩后的内核程序;在 arch/arm/boot/dts/ 目录下的 suniv-f1c100s-licheepi-nano.dtbsuniv-f1c100s-licheepi-nano-with-lcd.dtb 文件就是编译后的设备树文件。

测试程序

嵌入式linux开发最终是需要在系统上运行应用程序来实现特定的功能需求,这里编写个基础的应用程序用于测试:

# cd ~/f1c100s-sdk/
# 建立程序文件夹并进入
mkdir helloworld
cd helloworld/# 建立程序文件并编写程序
touch helloworld.c
gedit helloworld.c

写入以下内容:

#include <stdio.h>int main(void)
{printf("Hello, world!\n");
}

编译生成可执行文件:

arm-buildroot-linux-gnueabi-gcc helloworld.c -o helloworld

生成的 helloworld 就是我们需要的可执行文件了。

文件烧录

前面编译生成的内容可以分块分别烧录进SD卡进行测试,也可以将 u-boot & linux & rootfs 整块打包烧录进SD卡进行测试,其实本质上是一样的,这里先进行分块测试的介绍,打包烧录介绍将在后面的章节说明。

# 先将SD卡插入Ubuntu中
# 使用 lsblk 查看SD卡设备号sdX
# 我这里显示为sdb,下面均以此进行说明

分区设置

准备SD卡并按要求分区,空间划分参考本文开头的给出的文章,下面是在Ubuntu终端中进行分区划分示例:

# 如果已经分过区了那么Ubuntu可能会自动挂载
# 逐条使用 sudo umount /dev/sdbn 进行卸载# 对SD(TF)卡进行分区
sudo fdisk /dev/sdb
# 如果有分区的话可以输入 d 回车依次删除
# 输入 n 新建分区,分区大小根据需要设置即可
# 下面是我新建的两个分区的输入情况
# n回车  回车(p)  回车(1)  回车(2048)  +32M回车  (如果有额外提示则Y回车)
# n回车  回车(p)  回车(2)  回车(67584) +200M回车  (如果有额外提示则Y回车)
# 输入 w 回车保存退出,输入使用 lsblk 查看分区情况# 格式化分区建立文件系统
sudo mkfs.vfat /dev/sdb1
sudo mkfs.ext4 /dev/sdb2

分块烧录

u-boot
u-boot-sunxi-with-spl.bin 文件需要放置在SD卡8k开始的位置上:

# cd ~/f1c100s-sdk/u-boot/
sudo dd if=u-boot-sunxi-with-spl.bin  of=/dev/sdb bs=1024 seek=8

linux & dtb & boot.scr
这三个放在刚才新建的第一个分区里(sdb1):

# 如果分区已挂载到别的地方先进行卸载
# sudo umount /dev/sdb1
# 将分区挂载到 /mnt
sudo mount /dev/sdb1 /mnt# 拷贝linux和dtb
# cd ~/f1c100s-sdk/linux/
sudo cp arch/arm/boot/zImage /mnt/
sudo cp arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb /mnt/# 拷贝boot.scr
# cd ~/f1c100s-sdk/u-boot/
sudo cp boot.scr /mnt/# 保存退出
# sync
# sudo umount /dev/sdb1

rootfs
这个放在刚才新建的第二个分区里(sdb2):

# 如果分区已挂载到别的地方先进行卸载
# sudo umount /dev/sdb2
# 将分区挂载到 /mnt
sudo mount /dev/sdb2 /mnt# 解压并拷贝rootfs
# cd ~/f1c100s-sdk/buildroot-2022.02/
sudo tar -xf output/images/rootfs.tar -C /mnt/# 保存退出
# sync
# sudo umount /dev/sdb2

测试程序

# 如果分区已挂载到别的地方先进行卸载
# sudo umount /dev/sdb2
# 将分区挂载到 /mnt
sudo mount /dev/sdb2 /mnt# 拷贝helloworld
# cd ~/f1c100s-sdk/helloworld/
sudo cp helloworld /mnt/root/# 保存退出
# sync
# sudo umount /dev/sdb2

上电测试

上电打印信息与应用程序测试结果与关键日志如下:
默认通过UART0 PE0-RX PE1-TX 波特率115200
我这里使用的是F1C200s,所以内存显示为 64 MiB
前面生成的rootfs登陆用户名为root,无密码
在这里插入图片描述

U-Boot SPL 2018.01-gd83b2fe-dirty (Mar 15 2022 - 15:52:58)
DRAM: 64 MiB
Trying to boot from MMC1U-Boot 2018.01-gd83b2fe-dirty (Mar 15 2022 - 15:52:58 +0800) Allwinner TechnologyCPU:   Allwinner F Series (SUNIV)
Model: Lichee Pi Nano
DRAM:  64 MiB
MMC:   SUNXI SD/MMC: 0省略若干内容……mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr
reading /boot.scr
279 bytes read in 14 ms (18.6 KiB/s)
## Executing script at 80c50000
reading zImage
3841152 bytes read in 200 ms (18.3 MiB/s)
reading suniv-f1c100s-licheepi-nano.dtb
7464 bytes read in 25 ms (291 KiB/s)
## Flattened Device Tree blob at 80c00000Booting using the fdt blob at 0x80c00000Loading Device Tree to 816fb000, end 816ffd27 ... OKStarting kernel ...[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.14.0-licheepi-nano+ (nx@nx-ubuntu) (gcc version 10.3.0 (Buildroot 2022.02)) #1 Tue Mar 15 16:07:52 CST 2022
[    0.000000] CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=0005317f省略若干内容……[    1.331930] Waiting for root device /dev/mmcblk0p2...
[    1.375977] mmc0: host does not support reading read-only switch, assuming write-enable
[    1.390277] mmc0: new high speed SDHC card at address aaaa
[    1.396880] mmcblk0: mmc0:aaaa SC16G 14.8 GiB 
[    1.407742]  mmcblk0: p1 p2省略若干内容……Starting syslogd: OK
Starting klogd: OK
Running sysctl: OK省略若干内容……Welcome to Buildroot
buildroot login: root
# ls
helloworld
# ./helloworld 
Hello, world!
# 

系统镜像

前面分块烧录在测试的时候用用还行,但是如果是要批量生产或是交给他人使用就不方便了,这个时候可以制作系统成单个系统镜像文件来处理。

前面讲了对SD卡分区等操作,其实不管是分区还是数据拷贝等,最终在SD卡上无非就是一片按照一定顺序存储的数据。把这段数据原模原样的拷贝成一个文件,这就是系统镜像文件,使用的时候只要把这个文件内容拷贝到SD卡上就可以了。

制作镜像文件

从已有SD卡制作镜像文件
如果有已经烧录完成所有内容的SD卡的话直接使用 dd 命令将SD卡内容复制到一个文件即可得到系统镜像文件。比如针对前面流程下的SD卡可以使用下面方式:

# cd ~/f1c100s-sdk/# 如果分区已挂载到别的地方先进行卸载
# sudo umount /dev/sdb1
# sudo umount /dev/sdb2# 创建系统镜像文件
touch f1c100s-system-image.bin
# 将SD卡中有用的数据保存镜像文件中
# 大小为 1M(uboot) + 32M(bootfs) + 200M(rootfs) + 2M(多拷贝点,防止不明意外)
# 数据比较大会花点时间
dd if=/dev/sdb of=f1c100s-system-image.bin bs=1M count=235

从编译生成的文件制作
如果还没有烧录好的SD卡也可以直接从编译生成的文件制作

# cd ~/f1c100s-sdk/
# rm f1c100s-system-image.bin# 创建系统镜像文件
touch f1c100s-system-image.bin
# 向镜像文件写入空数据固定大小
dd if=/dev/zero of=f1c100s-system-image.bin bs=1M count=235# 查看可用的设备挂载点
sudo losetup -f
# 我这里显示 /dev/loop13,接下来都以此进行说明
# 将镜像文件挂载到 /dev/loop13
sudo losetup /dev/loop13 f1c100s-system-image.bin# 对挂载的设备进行分区
sudo fdisk /dev/loop13
# 下面是我新建的两个分区的输入情况
# n回车  回车(p)  回车(1)  回车(2048)  +32M回车  (如果有额外提示则Y回车)
# n回车  回车(p)  回车(2)  回车(67584) +200M回车  (如果有额外提示则Y回车)
# 接着 a回车 1回车 (将分区1设置为可启动)
# 输入 w 回车保存退出,会有点问题提示不用管# 更新分区表
sudo kpartx -av /dev/loop13# 格式化分区建立文件系统
sudo mkfs.vfat /dev/mapper/loop13p1
sudo mkfs.ext4 /dev/mapper/loop13p2# 挂载第一个分区向里拷贝linux、dtb、boot.scr
sudo mount /dev/mapper/loop13p1 /mnt
sudo cp linux/arch/arm/boot/zImage /mnt/
sudo cp linux/arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb /mnt/
sudo cp u-boot/boot.scr /mnt/
sync
sudo umount /dev/mapper/loop13p1# 挂载第二个分区向里解压并拷贝rootfs
sudo mount /dev/mapper/loop13p2 /mnt
sudo tar -xf buildroot-2022.02/output/images/rootfs.tar -C /mnt/
# 根据需求也可以拷贝应用程序进去
# sudo cp helloworld/helloworld /mnt/root/
sync
sudo umount /dev/mapper/loop13p2# 卸载设备
sudo kpartx -d /dev/loop13
sudo losetup -d /dev/loop13# 向头部写入uboot,注意conv=notrunc选项参数一定不能漏
sudo dd if=u-boot/u-boot-sunxi-with-spl.bin  of=f1c100s-system-image.bin bs=1024 seek=8 conv=notrunc

压缩系统镜像
前面生成的系统镜像比较大,不适合存储,可以对镜像镜像压缩:

# cd ~/f1c100s-sdk/
# 将系统镜像以zip方式镜像压缩
zip f1c100s-system-image.zip f1c100s-system-image.bin

使用镜像文件

在Linux上可以直接使用 dd 命令将镜像文件写入SD卡中

# cd ~/f1c100s-sdk/
# rm f1c100s-system-image.bin
# 如果分区已挂载到别的地方先进行卸载
# sudo umount /dev/sdb1
# sudo umount /dev/sdb2# 解压镜像文件压缩包
unzip f1c100s-system-image.zip
# 将镜像文件写入SD卡,写入可能较慢
sudo dd if=f1c100s-system-image.bin of=/dev/sdb bs=1M

当然我更加推荐使用工具来烧录,这里推荐使用 BalenaEtcher 工具 ,这个工具支持windos、macos、linux,其官方页面和项目地址分别如下:
https://www.balena.io/etcher/
https://github.com/balena-io/etcher
下面是用这个工具进行烧录的演示:
在这里插入图片描述
上面演示了使用BalenaEtcher工具进行烧录和启动测试,其中有两点值得注意的:

  • 原始的.bin后缀名的系统进行经过压缩后变得非常小(235MB > 5.98MB),可见压缩非常有用;
  • BalenaEtcher可以直接使用压缩包进行烧录(比如我上面演示中);

可能会遇到的问题

  • buildroot编译过程中下载文件慢
    buildroot编译过程中会下载很多文件,有可能会下着下着就不动了,或是下载缓慢。首先可以尝试使用 ctrl + c 终止当前工作后再 make ,会从终止的步骤重新开始;
    如果上面的方式不行,那自行查看编译输出信息,其中有文件下载地址的,手动用下载工具进行下载,把下载的内容压缩包或解压后内容放到buildroot的 dl 目录下,然后重复前面步骤;
  • 编译过程中因为缺少文件报错
    百度、必应等查找Ubuntu下安装这些文件的方法;
  • 编译或使用中其它不明的问题
    使用 make clean 或者 make distclean 后重复配置编译过程;

SDK数据包

鉴于整个过程中有很多东西需要下载,部分内容可能下载缓慢,所以将本文中出现的主要的几个项目内容进行了打包,方便将来使用。下载链接如下:
链接:https://pan.baidu.com/s/1BJPKuZJQmczxh82JJOGG_g
提取码:ezrw

下载下来是个zip格式压缩包,解压后得到下面内容(Ubuntu上可以使用 unzip 进行解压):
在这里插入图片描述

各个文件说明如下:

文件说明
helloworld内部含有helloworld.c文件
buildroot-2022.02.tar.xz使用 wget https://buildroot.org/downloads/buildroot-2022.02.tar.xz 下载得到的压缩包
buildroot-2022.02-with-dl.tar.xz根据上面项目 make menuconfig > make > make clean 后的文件夹进行重新打包压缩
其dl文件夹中包含了所有make时需要下载的东西
linux.tar.xz使用 git clone -b nano-4.14-exp --depth=1 https://github.com/Lichee-Pi/linux.git 下载
得到的linux文件夹中放入使用 wget https://dl.sipeed.com/fileList/LICHEE/Nano/SDK/config 下载的config文件
然后对linux文件夹重新打包
sunxi-tools.tar.xz使用 git clone -b f1c100s-spiflash --depth=1 https://github.com/Icenowy/sunxi-tools.git 下载
得到的sunxi-tools文件夹重新打包
u-boot.tar.xz使用 git clone -b nano-lcd800480 --depth=1 https://github.com/Lichee-Pi/u-boot.git 下载
到的u-boot文件夹重新打包

总结

本文基于现有的一些项目,详细记录 u-boot & linux & rootfs 编译与烧录测试( 基于SD卡) 整个流程内容,可以作为进一步的移植、开发与使用的基础。


http://chatgpt.dhexx.cn/article/De86PC7E.shtml

相关文章

【f1c200s/f1c100s】RGB接口 LCD驱动适配

【f1c200s/f1c100s】RGB接口 LCD驱动适配 RGB模式介绍F1C200s/F1C100s RGB LCD驱动适配设备树修改源码修改结果 RGB模式介绍 RGB 模式就是我们通过说的 RGB 屏&#xff0c;以 RGB&#xff08;TTL 信号&#xff09;并行数据线传输&#xff0c;广泛的应用于 5 寸及以上的 TFT-LC…

全志F1C100s入坑与填坑 uboot Linux Kernel 与buildroot

全志F1C100s 入手了几块全志的板子准备玩一玩随便记录一下&#xff01;&#xff01; 如图 是一块荔枝派 Nano 从sipeed官网可得如下介绍 官网传送门-----》 sipeed Nano 硬件参数# 硬件参数 CPU&#xff1a; 全志 F1C100s&#xff0c; ARM 926EJS , 最高 900MHz 内存&#xf…

全志F1C100S声卡驱动探究

如果有问题&#xff0c;请加QQ群 891339868 进行交流 最近刚上手全志的F1C100S这个片子&#xff0c;听一下音乐&#xff0c;本来想着挺简单&#xff0c;内核配置一下驱动就OK&#xff0c;谁知道上来就一闷棍&#xff0c;主线内核不支持内置声卡&#xff0c;经过多方面的研究&am…

【f1c200s/f1c100s】全志f1c200s开发板设计(含原理图和PCB)

f1c200s开发板设计 芯片特征开发板包含资源 开发板如图所示&#xff0c;模仿树莓派取了一个mango-pi的名字&#xff0c;haha~。 硬件主要参考了荔枝派nano和正点原子开发板。经过测试&#xff0c;全部功能正常。 芯片特征 全志F1C200s与F1C100s的区别为F1C200s含有64M SIP RA…

全志F1C100s使用记录:资料索引与基础说明

文章目录 前言资料来源u-boot & linux基础特性启动过程FEL模式电路设计 前言 最早接触到F1C100s是前两年的一个文章&#xff0c;里面使用F1C100s制作了一张可以运行Linux的名片&#xff0c;就是下图这个。下图上实际电路部分就占用角落一点点面积&#xff0c;当时觉得蛮有…

MySql 内连接与外连接 作用和 区别

内连接&#xff1a;指连接结果仅包含符合连接条件的行&#xff0c;参与连接的两个表都应该符合连接条件。 外连接&#xff1a;连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。 左外连接&#xff1a;左边表数据行全部保留…

php左内连接,内连接和外连接的区别是什么

内连接和外连接的区别&#xff1a;1、连接结果不同&#xff0c;内连接的连接结果仅包含符合连接条件的行&#xff0c;而外连接的连接结果包含了符合连接条件的行&#xff1b;2、注意事项不同&#xff0c;内连接需要注意区分在嵌套查询时使用的any以及all的区别&#xff0c;外连…

Mysql内连接和外连接的区别

内连接 简单来说&#xff1a;就是根据交集的部分来链接到一条完整的数据&#xff0c;以此来完成查询 以两张表相同的部分来链接上两张表的数据&#xff0c;而不是说&#xff0c;内连接查询的就是交集的部分&#xff0c;那样查询出来的不就是表的id信息了或者仅仅是关联的信息 …

mysql内连接和左连接的区别_MySQL连接查询 内连接和外连接的区别

展开全部 内连接&#xff1a;指连接结果仅包含符合连接条件的行&#xff0c;参与连接的两个表都应该符合连接条件。 外连62616964757a686964616fe78988e69d8331333363393638接&#xff1a;连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连…

mysql内外三种连接,mysql内连接和外连接的区别

以下面两张表为例来看一下内连接与外连接的区别&#xff1a; 一、内连接( 最常用 ) 定义&#xff1a;仅将两个表中满足连接条件的行组合起来作为结果集。 关键词&#xff1a;INNER JOINselect * from employees e inner join department d on e.employee_id d.department_id …

Sql 中内连接、外连接、全连接、交叉连接的区别

外连接(out join) 外连接分为外左连接(left outer join)和外右连接(right outer join) 注释&#xff1a;left outer join 与 left join 等价&#xff0c; 一般写成left join right outer join 与 right join等价&#xff0c;一般写成right join 左连接&#xf…

谈谈你对计算机的发展,结合您目前对计算机的认识,请您谈谈对计算机发展趋势的看法。...

计算机从出现至今&#xff0c;经历了机器语言、程序语言、简单操作系统和Linux、Macos、BSD、Windows等现代操作系统四代&#xff0c;运行速度也得到了极大的提升&#xff0c;第四代计算机的运算速度已经达到几十亿次每秒。 计算机也由原来的仅供军事科研使用发展到人人拥有&am…

对计算机科学与技术专业课程的认识,计算机科学与技术专业课程

计算机科学与技术专业课程计算机科学与技术专业课程 二、课程简介 TOP 1.数字逻辑电路: “数字逻辑”是计算机专业本科生的一门主要课程,具有自身的理论体系和很强的实践性。它是计算机组成原理的主要先导课程之一,是计算机应用专业关于计算机系统结构方面的主干课程之一。…

计算机网络技术的专业认识,计算机网络技术课程学习后的自我认识

计算机网络技术课程学习后的自我认识 随着计算机、多媒体、现代通讯网络为代表的信息技术的迅猛发展&#xff0c;信息技术已经渗透到了教育领域&#xff0c;在教育领域中引起了一场深刻的变化。小编是YJBYS小编整理的计算机网络技术课程学习后的自我认识&#xff0c;欢迎阅读 信…

计算机专业认识和规划,计算机科学与技术专业认识与规划

计算机科学与技术专业认识与规划 专业认识与规划专业认识与规划对于这个专业的学生&#xff0c;它要求学生的英语水平&#xff0c;数学水平很高。最主要的是&#xff0c;它的专业课程很多&#xff0c;很复杂&#xff0c;很累人&#xff0c;它需要你付出很多的努力&#xff0c;…

对计算机网络的认识论文800,对计算机的认识论文

为毕业生写对计算机的认识论文提供对计算机的认识论文范文参考,涵盖硕士、大学本科毕业论文范文和职称论文范文&#xff0c;包括论文选题、开题报告、文献综述、任务书、参考文献等&#xff0c;是优秀免费对计算机的认识论文网站。 对计算机软件属性和保护方式的认识 摘要&…

JS取整,取余

1、取整 // 丢弃小数部分,保留整数部分 parseInt(5/2)  // 2 2.向上取整 // 向上取整,有小数就整数部分加1 Math.ceil(5/2)  // 3 3.向下取整 // 向下取整,丢弃小数部分 Math.floor(5/2)  // 2 4四舍五入 // 四舍五入 Math.round(5/2)  // 3 5 取余 // 取余 6…

JS中的求余和求模

在JS中有两个操作符&#xff0c;求余和求模&#xff0c;它们本质上并没有区别&#xff0c;但仍有一些差异&#xff0c;今天就给大家区分一下它们 求余 符号&#xff1a;% 写法&#xff1a;a % b 求余&#xff1a;a % b &#xff0c;表示为a rem b&#xff0c;相当于 a - n * …

js数据取整,取余,保留小数,数据脱敏等的一些处理方式

一个经典的解决四舍五入问题后js保留两位小数的方法&#xff1a; 1.四舍五入保留2位小数&#xff08;若第二位小数为0&#xff0c;则保留一位小数&#xff09; function keepTwoDecimal(num) {var result parseFloat(num);if (isNaN(result)) {alert(传递参数错误&#xff0…

js中小数计算时精度问题

js中的number为双精度浮点型&#xff0c;计算时需要先进行进制转换&#xff0c;将十进制换成二进制&#xff0c;而进制转换时&#xff0c;小数就有可能出现精度问题了&#xff0c;原因如下 整数转二进制&#xff1a;除二取余法&#xff08;没有问题&#xff09; 4 除以 2 取余…