LS2K1000LA基础教程

基于LS2K1000LA的基础教程

by 南京工业大学 孙冬梅

于 2024.4.25

文章目录

  • 基于LS2K1000LA的基础教程
    • 一、目的
    • 二、平台
        • 1.硬件平台
        • 2.软件平台
    • 三、测试
      • 0.开发板开机及编译器配置
          • 0.1 开发板控制台
          • 0.2 虚拟机编译器配置
      • 1. 简单应用编程
        • 1.helloworld.c
        • 2. fileio 文件操作
        • 3.processctl 进程控制
        • 4.processcomu 进程间通讯
        • 5. threadapp 线程应用
        • 6. net 网络编程应用
      • 2. 外设编程
        • 1、GPIO 操作
            • 控制台操作
            • 编程操作
        • 2、uart
            • 控制台操作
            • 编程操作
        • 3、I2C
            • 控制台操作
            • 编程操作
      • 3. 驱动编程
        • 1. mqtt 数据上传云
        • 2、modbus数据读取
    • 四、基于qt 编写界面和功能
        • 1.QT下载及编译器配置
        • 2. QT开发
    • 五、开机自启动
    • 六、关机 (不可直接拔电源 )
    • 七、结论
    • 参考文献

一、目的

目的:基于loongarch 架构 龙芯派基本上手 教程

  • GPIO操作:读取与写入

  • UART操作 : 基于modbus协议的数据读取

  • I2C操作: 基于I2C总线光照度传感器数据读取

  • 关键技术:

    • 基于modbus的数据协议采集数据
    • 基于mqtt 的远程数据传输协议
    • linux下的脚本执行

二、平台

1.硬件平台

LS2K1000LA 龙芯派开发板,接口引脚如图 2-1所示。
在这里插入图片描述
​ 图2-1 龙芯派 GPIO外设接口功能图

基于龙芯派 GPIO外设接口, 进行电路 扩展。

  • 电源转换: 12V - 5V ; 5V - 3.3V
  • UART 总线 接口
    • UART3
    • UART4
    • UART5
  • I2C 0总线接口
    • BH1750光照度传感器
  • GPIO 和 LED
2.软件平台

运行环境:loongnix 操作系统

开发环境:x86_64 主机 ,基于linux 5.15 内核的ubuntu20.04 操作系统

三、测试

0.开发板开机及编译器配置

0.1 开发板控制台

使用mobaxterm 与开发板 串口 连接 115200; 用户 root 登录 ,无密码
在这里插入图片描述

在串口控制台配置eth1 IP 地址192.168.1.254; 注意:这里eth1是靠近耳机孔的网口。使用命令:

 ifconfig eth1 192.168.1.254

在这里插入图片描述

将自己本机 IP地址设置为 192.168.1.66,网线连接本机和开发板,在开发板控制台中使用ping测试连通性

在这里插入图片描述

如果使用路由器,以上配置IP步骤可省略,直接将开发板连接到路由器,不用修改任何IP地址;本机PC也连接到路由器;找到自己PC的IP地址,找到连接到路由器开发板的IP地址。

使用mobaxterm 用ssh 连接开发板的IP地址( 192.168.1.254 使用路由器的 不是这个,要用ifconfig查询下) 端口22

在这里插入图片描述

连接成功后,可进行文件查看,复制粘贴等:

在这里插入图片描述

至此,开发板控制台 为 串口控制台(只能有一个)、SSH 远程登录 控制台(可以开很多个,类似 ubantu 中的 terminal)。

0.2 虚拟机编译器配置

QT编译工具安装

资料包提供了编译应用程序的交叉工具链, 主要针对QT应用
下载LoongOS-glibc-x86_64-loongos-desktop-image-loongarch64-ls2k1000-toolchain-v0.1.sh,并执行,具体流程如下:

注意安装目录 : /home/toolchain

loongson@ubuntu:~/Downloads$ sudo sh LoongOS-glibc-x86_64-loongos-desktop-image-loongarch64-ls2k1000-toolchain-v0.1.sh
[sudo] password for loongson: 
LoongOS SDK installer version v0.1
==================================
Enter target directory for SDK (default: /usr/local/oecore-x86_64): /home/toolchain
You are about to install the SDK to "/home/toolchain". Proceed [Y/n]? y
Extracting SDK...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /home/toolchain/environment-setup-loongarch64-Loongson-linux

使用之前 先添加环境变量,查看版本 :

loongson@ubuntu:~/Downloads$ source /home/toolchain/environment-setup-loongarch64-Loongson-linux
loongson@ubuntu:~/Downloads$ qmake -v   #查看qmake版本
QMake version 3.1
Using Qt version 5.15.3 in /home/toolchain/sysroots/loongarch64-Loongson-linux/usr/lib64

在这里插入图片描述

编写helloworld.c 文件

/*helloworld.c*/
#include <stdio.h>
void main()
{
char *str ="Hello World";
printf("%s\n",str);
}

用新安装的编译工具进行编译

loongson@ubuntu:~/test$ $CC -o helloworld helloworld.c 

将helloworld 从开发板控制台下载下开发板运行,运行 命令为:

./helloworld

在这里插入图片描述

1。将在虚拟中编译好的 可执行文件拖拽到 mobaxterm(已经通过ssh连接到龙芯2K开发板)的资源管理器
2。修改可执行文件的属性为 可读写 chmod 777 gpio_write
3。运行可执行文件 ./gpio_write

下面进行编程,分为简单应用编译和外设接口编程2部分

例程全部参考《嵌入式Linux系统设计及应用-基于国产龙芯SOC(智龙开发板)3.1.0》

1. 简单应用编程

1.helloworld.c

功能: 打印出 helloworld

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

编译命令:

 $CC -o helloworld helloworld.c  

将helloworld下载开发板运行,正常运行

2. fileio 文件操作

功能: 调用open函数 读写方式打开文件 写入"hello,I’m Loongson,This is file io test!" 后读出并打印

/*fileio.c  */

命令:

运行 make 生成 fileio , 下载到开发板运行。
运行 make clean ,清除当前目标文件。

将fileio下载开发板运行,正常运行

3.processctl 进程控制

功能:

getpid 获取 当前进程的ID

fork 创建新进程

getpid.c
$CC getpid.c -o  getpid 

fork.c
$CC fork.c -o fork

/*Linux_进程替换(execl、execlp、execv、execle)  替换函数(unistd.h)*/
execl.c ececlp.c ececv.c execve.c 这4个是进程替换函数不进行测试了

替换函数总结

函数名参数传递形式路径是否导入环境变量
execl列表需要可执行程序路径不导入 使用当前环境变量
execlp列表默认在环境变量中找不导入 使用当前环境变量
execle列表需要可执行程序路径导入 使用导入的环境变量
execv数组需要可执行程序路径不导入 使用当前环境变量
execvp数组默认在环境变量中找不导入 使用当前环境变量
execve数组需要可执行程序路径导入 使用导入的环境变量

进程替换注意事项
1.进程替换不会创建新进程,因为进程替换只是将该进程的数据替换为指定的可执行程序。而进程PCB没有改变,所以不是新的进程,进程替换后不会发生进程pid改变。

2.进程替换后,如果替换成功后则替换函数下的代码不会执行,因为进程替换是覆盖式的替换,替换成功后进程原来的代码就消失了。同理在进程替换失败后会执行替换函数后的代码

3.进程替换函数在进程替换成功后不返回,函数的返回值表示替换失败

4.进程替换成功后,退出码为替换后的进程的退出码

4.processcomu 进程间通讯

功能:

pipe 创建无名管道,如果成功则打开两个文件描述符

pipe_rw 无名管道读写

fifo_read 读取管道数据;要将读进程在后台运行。首先启动读管道, ./fifo_read &

fifo_write 写数据到管道 与fifo_read组合运行

msg 使用消息队列进行进程间通信

shadd 创建一个共享内存区,将其映射到本进程中,最后再解除映射

pipe.c
$CC  pipe.c -o  pipe 

pipe_rw.c
$CC pipe_rw.c -o  pipe_rw 

fifo_read.c
$CC fifo_read.c-o fifo_read

fifo_write.c
$CC fifo_write.c -o fifo_write

msg.c
$CC msg.c -o msg

shmadd.c
$CC shmadd.c -o shmadd

5. threadapp 线程应用

thread 创建两个线程,第一个线程是在程序运行到中途时调用pthread_exit 主动退出,然后睡眠 2s;第二个线程正常运行退出。

pthread 创建两个线程,第一个线程的线程属性设置为绑定、分离属性;
第二个线程设置为默认的属性,即非绑定、非分离属性。

sem 使用信号量的机制来对计数变量 lock_var 操作

mutex 快速互斥锁来实现对计数变量 lock_var 操作

thread.c
$CC thread.c -o thread -pthread //要加上 -pthread 因为 Linux 系统中本身并不包含线程库

pthread.c
$CC pthread.c -o pthread -pthread //要加上 -pthread 因为 Linux 系统中本身并不包含线程库

sem.c
$CC sem.c -o sem -pthread 

mutex.c
$CC mutex.c -o mutex -pthread 

6. net 网络编程应用

功能:

client 先PC机运行TCPUDPdebug程序 开启tcp服务器 再开启开发板tcp连接服务器, 命令: ./client 目的IP 目的端口号

server 先开启开发板tcp服务器 命令: ./server 源IP ,PC机运行TCPUDPdebug程序 开启tcp客户端,连接开发板的服务器

client.c
$CC client.c -o client

server  
$CC client.c -o client

2. 外设编程

1、GPIO 操作
控制台操作
# echo 50 > /sys/class/gpio/export     //将50引脚导出
# echo 46 > /sys/class/gpio/export     //将46引脚导出
# echo out > /sys/class/gpio/gpio50/direction   //设置50为输出
# echo in > /sys/class/gpio/gpio46/direction    // 设置46 为输入
# echo 0 > /sys/class/gpio/gpio5/value //输出低电平 
# echo 1 > /sys/class/gpio/gpio5/value //输出高电平 
#cat /sys/class/gpio/gpio46/value   //查看 GPIO 排列序号为 46的 GPIO 电平
1
编程操作

功能:

gpio_read.c 读取GPIO40 命令 gpio_read 46

gpio_write.c 输出到 GPIO41 gpio_write 50 0 ./gpio_write 50 1 GPIO50 输出0 1

gpip_poll.c 外部(poll方式) gpio_poll 46 50 读取GPIO46 输出到 GPIO50

gpio_read.c
$CC gpio_read.c -o gpio_read

gpio_write.c  
$CC gpio_write.c -o gpio_write

gpip_poll.c
$CC gpip_poll.c -o gpip_poll
2、uart

sttyS1, 对应图中的UART3

sttyS2, 对应图中的UART4

sttyS3, 对应图中的UART5

控制台操作
root@ls3a5000:~# stty -F /dev/ttyS1 speed 115200 cs8
115200
root@ls3a5000:~# echo 123 > /dev/ttyS1
root@ls3a5000:~#cat /dev/ttyS1  //等待接收字符串

一个个的测试下来, UART3 4 5没有问题 ttYS1/2/3 可以用 , ttYS1/2/3对应UART3 4 5 ,测试UART5 OK

编程操作
uart.c serial.c serial.h

运行 make 生成 uart, 下载到开发板运行。
运行 make clean ,清除当前目标文件。

将uart下载开发板运行,正常运行

PC 通过串口硬件连接 开发板 ttyS1 ,运行 uart 打印如下信息“Hello! I am Loongson!”,在 PC机串口助手中输入“Hello,I am Sundm75”,则此字符通过 uart1 传入开发板

3、I2C
控制台操作

将24C02 连接到 i2c1, 地址0x50,进行探测 i2cdetect -r -r 1

在这里插入图片描述

读取所有数据 i2cdump -y 1 0x50

在这里插入图片描述

数据设置 i2cset -y 1 0x50 0x01 0x5A

在这里插入图片描述

DS3231 连接到 i2c0, 地址0x68,进行探测 i2cdetect -r -r 1

在这里插入图片描述

读取所有数据 i2cdump -y 0 0x68

在这里插入图片描述

编程操作

测试bh1750

BH1750是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。BH1750的内部由光敏二极管、运算放大器、ADC采集、晶振等组成。对应广泛的输入光范围(相当于1-65535lx),最小误差变动在土20%,而且受红外线影响很小。

1、采用ROHM原装BH1750FVI芯片
 2、光照度范围: 0-655351x,传感器内置16bitAD转换器直接数字输出,省略复杂计算)省略标定
 3、内部包含通信电平转换,与5V单片机I0连接,支持STM32/51/ardunio
 4、XH2.54接口连接线,方便客户DIY
 5、小体积,广泛应用于室内光照检测、蔬菜、苗圃、温室大棚

连接到 i2c0

BH1750_Addr (7位地址) 0x23 先探测: i2cdetect -r -y 0

在这里插入图片描述

发送 0x01 power on

发送 0x10 启动连续测量 精度 1lx resolution 测量时间 120ms

然后读取

读取光照度 代码:

/*test_bh1750.c*/

命令:

运行 make 生成 test_bh1750, 下载到开发板运行。
运行 make clean ,清除当前目标文件。

将 test_bh1750下载开发板运行,正常运行

在这里插入图片描述

3. 驱动编程

1. mqtt 数据上传云

参考 一套极简的MQTT使用接口EasyMqttClient

在Linux环境下使用本项目:

  • 克隆本项目
 git clone https://github.com/Yangyuanxin/EasyMqttClient
  • 修改编译参数

CPPFLAGS : 预处理器需要的选项 如:-I (大写i指定头文件路径)
CFLAGS:编译的时候使用的参数 –Wall –g -c
LDFLAGS :链接库使用的选项 –L -l (大写L指定动态库的路径,小写L指定动态库的名称)

  • 修改makefile :注释前面14行

  • 运行 make all

生成 a.out ,下载到开发板可运行

2、modbus数据读取

1.首先在github上获取源代码

git clone https://github.com/stephane/libmodbus

2.创建安装目录

开发板/home/loongson/libmodbus/install ,要创建这个新目录

cd ~
mkdir libmodbus
chmod 777 libmodbus
mkdir install
chmod 777 install

3.配置编译选项

运行 ./autogen.sh 生成 configure 脚本

安装automake工具,执行下面命令安装

sudo apt install autoconf automake libtool

配置工具链: ./configure --host=[交叉编译工具链前缀] --enable-static --prefix=[安装路径] /install/

./configure --host=loongarch64-Loongson-linux --enable-static --prefix=./configure --prefix=/home/loongson/libmodbus/install 

编译

make
make install

4.打包复制

成功后 将 libmodbus/install 文件打包

tar cvf libmodbus.tar install

libmodbus.tar 复制到开发板上解压

tar xvf libmodbus.tar

将install/lib文件夹下的libmodbus.so、libmodbus.so.5、libmodbus.so.5.1.0复制到开发板的/usr/lib 和/usr/lib64目录下。

cd /home/loongson/libmodbus/install/lib/
cp libmodbus.so* /usr/lib
cp libmodbus.so* /usr/lib64

5、测试程序

1.创建一个modbusrtu_test.c文件

2.将install/include/modbus/中的头文件复制到与ModbusRTU_Test.c文件一个目录中

3.编译

$CC -o modbusrtu_test modbusrtu_test.c  -L /home/loongson/libmodbus/install/lib/ -lmodbus 

4.将可执行文件复制到ARM板下,运行测试

1)复制赋权限

2)UART ttyS3使用Modbus Slave模拟个设备 设置  slaveID=1  通讯参数: 115200 8 N 1

3)运行

四、基于qt 编写界面和功能

1.QT下载及编译器配置

1、下载 Qt5: 5.12 LTS 长期支持版本

2、开始安装qt

3、安装完成后 编译器配置

添加 C 编译器 和 C++编译器

/home/toolchain/sysroots/x86_64-loongsonsdk-linux/usr/bin/loongarch64-Loongson-linux-gcc

/home/toolchain/sysroots/x86_64-loongsonsdk-linux/usr/bin/loongarch64-Loongson-linux-g++

在 tools 菜单下,选择 options , 如下图添加

在这里插入图片描述

再修改 qmake

在这里插入图片描述

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

2. QT开发

打开例程 analogclock, 选择LA 工具,编译后生成 analogclock
在这里插入图片描述

下载到开发板上,修改权限后运行正常。

在这里插入图片描述

五、开机自启动

自己写一个shell脚本
将写好的脚本(.sh文件)放到目录 /etc/profile.d/ 下,系统启动root登录后就会自动执行该目录下的所有shell脚本。本脚本自启动 /home/loongson/loongsonapp/目录下的 analogclock 可执行文件。

loongsonapp.sh 文件,

#!/bin/bash
echo "loongson_gateway==================================================================!"
/home/loongson/loongsonapp/analogclock

注意修改文件名加 zz ,因为该目录下的所有shell脚本是按照文件名顺序执行,将文件放到最后从而保证当 QT插件运行完后再执行

六、关机 (不可直接拔电源 )

在开发板控制台中输入命令: poweroff, 等命令显示完毕,就能拔电源 了

在这里插入图片描述

七、结论

本文首先描述了基于LS2K1000LA开发板安装编译器进行交叉编译出可执行文件的过程;讲解了GPIO操作、UART操作、I2C三种外设操作的基本方法;说明了QT和相关编译器进行界面开发流程;最后基于开源库libmodbus和mqttclient实现了在LS2K1000LA开发板的移植,从而实现modbus协议数据读取和向云端传数。

源码下载

参考文献

  1. 孙冬梅. 嵌入式Linux系统设计及应用-基于国产龙芯SOC(LS1C300).[M] .北京:清华大学出版社.
  2. 孙冬梅.龙芯嵌入式系统原理与应用开发(LS1B300) . [M]. 北京:人民邮电出版社 .

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Scrapy 爬虫教程:从原理到实战

Scrapy 爬虫教程&#xff1a;从原理到实战 一、Scrapy框架简介 Scrapy是一个由Python开发的高效网络爬虫框架&#xff0c;用于从网站上抓取数据并提取结构化信息。它采用异步IO处理请求&#xff0c;能够同时发送多个请求&#xff0c;极大地提高了爬虫效率。 二、Scrapy运行原…

入坑 Java

原文&#xff1a;https://blog.iyatt.com/?p11305 前言 今天&#xff08;2023.8.31&#xff09;有个学长问我接不接一个单子&#xff0c;奈何没学过 Java&#xff0c;本来不打算接的。只是报酬感觉还不错&#xff0c;就接了。 要求的完成时间是在10月初&#xff0c;总共有一…

Spring Boost + Elasticsearch 实现检索查询

需求&#xff1a;对“昵称”进行“全文检索查询”&#xff0c;对“账号”进行“精确查询”。 认识 Elasticsearch 1. ES 的倒排索引 正向索引 对 id 进行检索速度很快。对其他字段即使加了索引&#xff0c;只能满足精确查询。模糊查询时&#xff0c;逐条数据扫描&#xff0c…

编译原理实验课

本人没咋学编译原理&#xff0c;能力有限&#xff0c;写的不好轻点喷&#xff0c;大佬路过的话&#xff0c;那你就路过就好 东大编译原理实验课原题&#xff0c;22年 1. 基本题&#xff1a;简单的扫描器设计 【问题描述】 熟悉并实现一个简单的扫描器&#xff0c;设计扫描器…

C++ | Leetcode C++题解之第49题字母异位词分组

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 自定义对 array<int, 26> 类型的哈希函数auto arrayHash [fn hash<int>{}] (const array<int, 26>&…

黑马点评(十二) -- UV统计

一 . UV统计-HyperLogLog 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站&#xff0c;只记录1次。 PV&#xff1a;全称Page View&…

linux权限维持(四)

6.inetd服务后门 inetd 是一个监听外部网络请求 ( 就是一个 socket) 的系统守护进程&#xff0c;默认情况下为 13 端口。当 inetd 接收到 一个外部请求后&#xff0c;它会根据这个请求到自己的配置文件中去找到实际处理它的程序&#xff0c;然后再把接收到的 这个socket 交给那…

机器学习 -- 分类问题

场景 探讨了一个回归任务——预测住房价格&#xff0c;用到了线性回归、决策树以及随机森林等各种算法。本次中我们将把注意力转向分类系统。我们曾经对MNIST进行了分类任务&#xff0c;这次我们重新回到这里&#xff0c;细致的再来一次。 开始 获取数据 Scikit-Learn提供了…

力扣爆刷第127天之动态规划五连刷(整数拆分、一和零、背包)

力扣爆刷第127天之动态规划五连刷&#xff08;整数拆分、一和零、背包&#xff09; 文章目录 力扣爆刷第127天之动态规划五连刷&#xff08;整数拆分、一和零、背包&#xff09;关于0 1 背包问题的总结01背包遍历顺序&#xff1a;完全背包遍历顺序&#xff1a; 一、343. 整数拆…

Lock-It for Mac(应用程序加密工具)

OSXBytes Lock-It for Mac是一款功能强大的应用程序加密工具&#xff0c;专为Mac用户设计。该软件具有多种功能&#xff0c;旨在保护用户的隐私和数据安全。 Lock-It for Mac v1.3.0激活版下载 首先&#xff0c;Lock-It for Mac能够完全隐藏应用程序&#xff0c;使其不易被他人…

【Pytorch】(十四)C++ 加载TorchScript 模型

文章目录 &#xff08;十四&#xff09;C 加载TorchScript 模型Step 1: 将PyTorch模型转换为TorchScriptStep 2: 将TorchScript序列化为文件Step 3: C程序中加载TorchScript模型Step 4: C程序中运行TorchScript模型 【Pytorch】&#xff08;十三&#xff09;PyTorch模型部署: T…

平衡二叉树、红黑树、B树、B+树

Tree 1、前言2、平衡二叉树和红黑树3、B树和B树3.1、B树的构建3.2、B树和B树的区别3.3、数据的存储方式 1、前言 本文侧重在理论方面对平衡二叉树、红黑树、B树和B树的各方面性能进行比较。不涉及编程方面的实现。而关于于平衡二叉树在C中的实现&#xff0c;我的上一篇文章平衡…

Nginx基本使用 反向代理与负载均衡

什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。 其特点是占有内存少&#xff0c;并发能力强&#xff0c;nginx的并发能力在同类型的网页服务器中表现较好&#xff0c;而且几乎可以做到7*24不间断运行&#xff0c;即使运行数个月也不需要重新启动。 …

操作系统安全:Linux安全审计,Linux日志详解

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

【树莓派】yolov5 Lite,目标检测,树莓派4B,推理v5lite-e_end2end.onnx,摄像头实时目标检测

文章目录 YOLOv5 Lite: 在树莓派上轻松运行目标检测1. 环境配置2. 克隆项目3. 安装依赖项4. 下载模型权重5. 理解end2end的含义6. 示例推理7. 文件介绍8. 把文件弄到树莓派4B执行9. 进一步尝试fp16的onnx&#xff08;行不通&#xff09;10. 视频流检测 这里有大概的环境配置&am…

80个在线小游戏源码

源码简介 搭建80个在线小游戏网站源码&#xff0c;解压即可食用&#xff0c;支持在本地浏览器打开。 安装教程 纯HTML&#xff0c;直接将压缩包上传网站目录解压即可 首页截图 源码下载 80个在线小游戏源码-小8源码屋

Mac虚拟机装Windows Mac环境安装Win虚拟机教程 macbookpro安装windows虚拟机

在如今多元的数字时代&#xff0c;我们经常需要在不同的操作系统环境下进行工作和学习。而对于Mac用户来说&#xff0c;有时候需要在自己的电脑上安装Windows操作系统&#xff0c;以体验更多软件及功能&#xff0c;而在Mac安装Windows虚拟机是常用的一种操作。下面就来看看Mac虚…

前端框架EXT.NET Dotnet 3.5开发的实验室信息管理系统(LIMS)成品源码 B/S架构

前端框架EXT.NET Dotnet 3.5开发的实验室信息管理系统&#xff08;LIMS&#xff09;成品源码 B/S架构 LIMS实验室管理系统 发展历史 实验室信息管理系统(LIMS)&#xff0c;就是指通过计算机网络技术对实验的各种信息进行管理的计算机软、硬件系统。也就是将计算机网络技术与现…

新手答疑 | 零基础该怎么学习嵌入式?嵌入式Linux学习路线是什么?嵌入式开发板推荐?

很多初学者想要涉足嵌入式Linux开发领域&#xff0c;但往往在刚入门阶段&#xff0c;会因为初次接触到大量复杂的概念术语和深奥的技术文档感到压力重重&#xff0c;面对这些内容不知从何下手&#xff0c;感到十分迷茫&#xff0c;网上的内容也纷繁复杂&#xff0c;没有清晰的学…

《前端面试题》- React - 如何区分函数组件和类组件

问题 如何区分函数组件和类组件&#xff1f; 答案 可以使用instanceof 或者Component.prototype.isReactComponent。 示例 函数组件 export default function FunctionComonent() {if(FunctionComonent.prototype.isReactComponent){console.log(FunctionComonent是类组件…