嵌入式Linux编译系统的设计——Bootloader, 内核,驱动,文件系统,升级镜像等自动化编译打包

2023-11-17

项目简介

嵌入式系统的开发过程较为复杂,编译,裁剪,定制等如果没有一套规范的流程将会难于管理和控制。本项目的目的是设计一个嵌入式Linux编译系统,实现代码的编译,定制和裁剪。Bootloader, 内核,驱动,文件系统,升级镜像等都可以自动化编译,打包。

本项目github:https://github.com/huangbin0709/easyLinux.git

EasyLinux平台编译系统架构

Buildroot

Buildroot是一个非常优秀的开源嵌入式编译系统,其本身已经非常完善。但其默认是在线编译的,即从网上下载源码包进行编译。对企业而言,本地编译可方便进行版本控制。EasyLinux平台除了工具软件之外,其他的软件包如内核,bootloader,app等都是采用本地编译的方式。此外,嵌入式系统模块之间的耦合还是比较大,如头文件,库文件的引用等,需要设计一个目录结构编译时方便地对这些文件进行引用。

EasyLinux平台目录结构

顶级目录结构

easyLinux

├── archive

│   └── gt2440

├── boot

│   └── u-boot-2015.01

├── buildroot

│   ├── arch

│   ├── board

│   ├── boot

│   ├── build

│   ├── CHANGES

│   ├── Config.in

│   ├── Config.in.legacy

│   ├── configs

│   ├── COPYING

│   ├── dl

│   ├── docs

│   ├── easylinux

│   ├── easylinux_patch_clean.sh

│   ├── easylinux_patch.sh

│   ├── ext

│   ├── fs

│   ├── linux

│   ├── Makefile

│   ├── Makefile.legacy

│   ├── package

│   ├── README

│   ├── support

│   ├── system

│   └── toolchain

├── kernel

│   └── linux-3.18.6

├── LICENSE

├── README.md

└── src

    ├──application

└── platform

EasyLinux平台有archive、boot、buildroot、kernel、src五个顶级目录,每个目录的设计如下:

Archive:存放src目录下编译生成的库文件,以机型为子目录存放,如archive/gt2440.

Boot:这个目录下存放bootloader源码,如uboot。

Buildroot:这个目录下添加了我们自己的目录easylinux,用于编译easylinux平台特有的软件包。

Kernel:存放内核。

Src:存放项目源代码

编译目录

easylinux

├── Config.in

├── core

│   ├── Config.in

│   └── core.mk

├── easylinux.mk

├── procmgr

│   ├── Config.in

│   └── procmgr.mk

└── watcher

    ├── Config.in

   └── watcher.mk

EasyLinux编译目录中定义src目录下的源码包的编译规则。

EasyLinux/src目录结构

src

├── application

│   ├── adapter

│   ├── app

│   ├── drivers

│   ├── include

│   └── lib

└── platform

    ├── adapter

    ├── app

    │  ├── core

    │  │   ├── CMakeLists.txt

    │  │   ├── include

    │  │   └── src

    │  ├── procmgr

    │  └── watcher

    ├── drivers

    ├── include

└── lib

Src目录下存放我们自己开发的软件包源码,包括应用层App和内核驱动,所有软件包都以cmake组织。

库和头文件的引用

Buildroot中的package编译时会把源码拷贝到$(BUILD_DIR)目录下进行编译,为了便于管理,我们把easylinux的package拷贝到$(BUILD_DIR)/easylinux目录下进行编译。编译产生的库文件存放到easylinux/archive中。通过在$(BUILD_DIR)/easylinux目录下创建软连接arvhive,plat分别指向easylinux/arvhive中的库文件目录和src/application/include下的头文件目录。则编译软件包时可通过../arvhive和../plat目录引用头文件和库文件。

板级适配

为了使不同的开发板和芯片可以共用一套编译系统,需要进行一定的适配。

配置适配

buildroot/board/samsung

├── common

│   ├── busybox.config

│   ├── linux.config

│   ├── uboot.config

│   ├── uboot.mk

│   └── uClibc-0.9.33.config

└── yoka

└── uboot.mk

在vendor/board目录下存放各自的配置文件。

Xxx_defconfig文件中通过BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE等变量可以指定配置文件的路径,可以为不同的板指定不同的配置文件。

编译适配

1.      mk文件中引入板级定制mk,以uboot为例:

#include board common mk files if any

-include $(BR2_BOARD_COMMON_DIR)/uboot.mk

#include board specify mk files if any

-include $(BR2_BOARD_CUSTOM_DIR)/uboot.mk

#include the mk file to fix the pkgdir in package/pkg-utils.mk

include $(TOPDIR)/boot/uboot/uboot-last.mk

$(eval $(generic-package))

在$(eval $(generic-package))之前插入上面的规则,则可以在板级的uboot.mk中重新设置一些环境变量,达到不同的板可以有不同的编译参数,编译路径的目的。

2.      使用全局编译参数

BR2_EASYLINUX_CFLAGS "-Werror -D_LITTLE_EDIAN=0x1234 -D_BIG_EDIAN=0x3412 -DBYTE_ORDER=0x1234  -D_MIPS_=2  -D_ARM_=1  -DCPU_ARCH=1"

Easylinux/Config.in中添加全局编译参数配置项,在所有package的mk文件中添加进他们的CFLAGS中。如在core.mk中

CORE_CFLAGS += $(BR2_EASYLINUX_CFLAGS)

#CORE_CFLAGS +=

CORE_CONF_OPTS += -DCMAKE_C_FLAGS="$(CORE_CFLAGS)"

在core_main.c中

#if CPU_ARCH == _ARM_

 Do something

#else

 Do something

#endif

3.      在模块的编译中定义宏

如在core.mk中

#如果是yoka

Ifeq ($(BR2_EASYLINUX_PROJECT_NAME),yoka)

CORE_CFLAGS += -DEASYLINUX_YOKA

endif

 

EasyLinux平台编译方法

编译所有的操作都在easylinux/buildroot目录下

2.4.1打入配置和编译

make O=build_dir  xxx_defconfig

其中build_dir为想要输出到的目录

Xxx_defconfig为configs目录下的机型配置文件

make O=build_dir  {target}

target是可选的,如果输入了target则只编译这个目标,否则编译配置的所有软件包。

make O=build_dir target-dirclean

target是目标,清理特定的软件包

make O=build_dir easylinux-clean

这个命令是easylinux平台的,用于清理easylinux平台的所有软件包。Buildroot全部编译需要较长的时间,这个命令可用于只编译easylinux软件包。

2.4.2定制

make O=build_dir menuconfig

make O=build_dir savedefconfig

定制package,保存到xxx_defconfig文件中

make O=build_dir linux-menuconfig

make O=build_dir linux-update-config

定制linux内核并保存

make O=build_dir busybox-menuconfig

make O=build_dir busybox-update-config

定制busybox并保存

make O=build_dir uboot-menuconfig

make O=build_dir uboot-update-config

定制uboot并保存

添加一个Package

2.5.1添加app

以添加应用程序procmgr为例

1.       在src/app相应目录下添加源代码,在源码下添加CMakeLists.txt文件

cmake_minimum_required(VERSION 3.0)

#project name

PROJECT(procmgr)

#head file path

#module目录下的头文件

#$(BUILD_DIR)/easylinux目录下的platform链接到$(TOPDIR)/../src/platform/include目录

#CMakeLists.txt编译时会拷贝到$(BUILD_DIR)/easylinux/{module}目录下,则../platform指向这个头文件目录

INCLUDE_DIRECTORIES(

include

../platform

)

#source directory

AUX_SOURCE_DIRECTORY(src DIR_SRCS)

#set environment variable

SET(TEST_MATH

${DIR_SRCS}

)

SET(CMAKE_INSTALL_PREFIX /easylinux)

#add executable file

ADD_EXECUTABLE(core ${TEST_MATH})

#

install(TARGETS  procmgr RUNTIME DESTINATION app/bin)

2.在buildroot/easylinux/procmgr目录下添加Config.in

config BR2_EASYLINUX_PROCMGR

         bool "easylinux app procmgr"

         default n

3.在buildroot/easylinux/procmgr目录下添加procmgr.mk

################################################################################

#

# procmgr

#

################################################################################

PROCMGR_VERSION = 1.0

PROCMGR_SITE = $(TOPDIR)/../src/platform/app/procmgr

PROCMGR_SITE_METHOD = local

PROCMGR_INSTALL_STAGING = NO

PROCMGR_INSTALL_TARGET = YES

#PROCMGR_CONF_OPTS +=

#PROCMGR_DEPENDENCIES +=

 

PROCMGR_CFLAGS += $(BR2_EASYLINUX_CFLAGS)

#PROCMGR_CFLAGS +=

PROCMGR_CONF_OPTS += -DCMAKE_C_FLAGS="$(PROCMGR_CFLAGS)"

$(eval $(cmake-package))

 

2.5.2添加内核驱动

1.在src/app相应目录下添加源代码,在源码下添加Makefile文件

obj-m = demodriver.o

2.在buildroot/easylinux/demodriver目录下添加Config.in

3.在buildroot/easylinux/demodriver目录下添加demodriver.mk

################################################################################

#

# demodriver

#

################################################################################

DEMODRIVER_VERSION = 1.0

DEMODRIVER_SITE = $(TOPDIR)/../src/application/drivers/demodriver

DEMODRIVER_SITE_METHOD = local

DEMODRIVER_INSTALL_STAGING = NO

DEMODRIVER_INSTALL_TARGET = YES

#DEMODRIVER_CONFIG_SCRIPTS = DEMODRIVER-config

#DEMODRIVER_DEPENDENCIES = host-libaaa libbbb

 

define DEMODRIVER_BUILD_CMDS

         $(TARGET_MAKE_ENV) $(MAKE) $(LINUX_MAKE_FLAGS) -C $(LINUX_DIR) M=$(@D) modules

Endef

 

define DEMODRIVER_INSTALL_TARGET_CMDS

         cp $(@D)/*.ko $(TARGET_DIR)/easylinux/lib/modules

endef

$(eval $(generic-package))

 

2.5.3添加动态库

1.在src/app相应目录下添加源代码,在源码下添加CMakeLists.txt文件

cmake_minimum_required(VERSION 3.0)

#project name

PROJECT(platform)

#head file path

INCLUDE_DIRECTORIES(

../platform

)

#source directory

AUX_SOURCE_DIRECTORY(demo DEMO_FILES)

#set environment variable

#SET(CMAKE_INSTALL_PREFIX /easylinux)

#add executable file

ADD_LIBRARY(platform SHARED ${DEMO_FILES})

#add link library

#TARGET_LINK_LIBRARIES(core m)

install(TARGETS platform LIBRARY DESTINATION lib)

2.在buildroot/easylinux/platform目录下添加Config.in

3.在buildroot/easylinux/platform目录下添加platform.mk

################################################################################

#

# PLATFORM

#

################################################################################

PLATFORM_VERSION = 1.0

PLATFORM_SITE = $(TOPDIR)/../src/platform/lib

PLATFORM_SITE_METHOD = local

PLATFORM_INSTALL_STAGING = NO

PLATFORM_INSTALL_TARGET = YES

PLATFORM_INSTALL_TARGET_OPTS = DESTDIR=$(BR2_EASYLINUX_ARCHIVE_DIR) install

#PLATFORM_CONF_OPTS +=

#PLATFORM_DEPENDENCIES +=

 

PLATFORM_CFLAGS += $(BR2_EASYLINUX_CFLAGS)

#PLATFORM_CFLAGS +=

PLATFORM_CONF_OPTS += -DCMAKE_C_FLAGS="$(PLATFORM_CFLAGS)"

$(eval $(cmake-package))

 

文件系统编译和定制

目前easylinux平台设计为3个文件系统,根文件系统initramfs,用户镜像文件系统usrimage.jffs2和用户配置文件系统usrconf.jffs2。initramfs是最小根文件系统,和内核编译到一起挂载到内存。Usrimage.jffs2用来存放我们自己的可执行文件和库以及一些相应的数据。Usrconf.jffs用来保存配置,升级的时候可以保留这个分区,从而保存用户配置。

Initramfs基于cpio制作,我们在cpio.mk中对根文件系统进行定制

define ROOTFS_CPIO_CMD

#删掉不需要的文件

         rm -rf $(TARGET_DIR)/usr/bin/top && \

         rm -rf $(TARGET_DIR)/usr/bin/unzip && \

         rm -rf $(TARGET_DIR)/usr/bin/wget && \

#先拷出easylinux文件夹,这些数据放入usrimage.jffs2中

         cp -arf $(BR2_EASYLINUX_ARCHIVE_DIR)/usr/lib/* $(TARGET_DIR)/easylinux/lib && \

         mkdir -p $(TARGET_DIR)/../tmptarget && \

         cp -rf $(TARGET_DIR)/easylinux $(TARGET_DIR)/../tmptarget && \

         rm -rf $(TARGET_DIR)/easylinux && \

#制作cpio镜像

         cd $(TARGET_DIR) && find . | cpio --quiet -o -H newc > $@ && \

         cp -rf $(TARGET_DIR)/../tmptarget/easylinux $(TARGET_DIR)

endef

制作usrimage.jffs2和usrconf.jffs2

define ROOTFS_JFFS2_CMD

    mkdir -p $(TARGET_DIR)/../tmptarget/usrconf && \

    mkdir -p $(TARGET_DIR)/../tmptarget/usrconf/conf && \

    mkdir -p $(TARGET_DIR)/../tmptarget/usrconf/log && \

    mkdir -p $(TARGET_DIR)/../tmptarget/usrconf/key && \

    $(MKFS_JFFS2) $(JFFS2_OPTS) –d \

    $(TARGET_DIR)/../tmptarget/usrconf \

$(BINARIES_DIR)/usrconf.jffs2 && \

    $(MKFS_JFFS2) $(JFFS2_OPTS) –d\

    $(TARGET_DIR)/../tmptarget/easylinux –o\

 $(BINARIES_DIR)/usrimage.jffs2

endef

编译系统后即可得到3个文件系统镜像

启动脚本start_system.sh制作

#!/bin/sh

echo "start system,please wait..."

#更改printk打印级别

echo 4 > /proc/sys/kernel/printk

mkdir -p /mnt/easylinux

mkdir -p /mnt/usrconf

#挂载usrimage.jffs2

mount -t jffs2 /dev/mtdblock3 /mnt/easylinux

#挂载usrconf.jffs2

mount -t jffs2 /dev/mtdblock4 /mnt/usrconf

mkdir -p /easylinux

#将usrimage.jffs2也挂载到ramfs中

mount -t ramfs none /easylinux

cp -rf /mnt/easylinux/* /easylinux

chmod 0644 /easylinux/lib/*.so

#设置环境变量

export PATH=$PATH:/easylinux/app/bin

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/easylinux/lib

#启动我们的第一个进程,其他进程都由他派生

/usr/bin/procmgr

echo "something error,we should not go here"

Start_system.sh放在src/platform/app/procmgr/etc中,编译procmgr时,和etc下的其他定制文件一起拷贝到根文件系统中。定制inittab文件

# now run any rc scripts

::sysinit:/etc/init.d/rcS > /dev/null

 

# Put a getty on the serial port

#console::respawn:/sbin/getty -L  console 0 vt100 # GENERIC_SERIAL

#这里启动我们的脚本

console::sysinit:/etc/start_system.sh > /dev/null

# Stuff to do for the 3-finger salute

::ctrlaltdel:/sbin/reboot

升级镜像制作

Flash分区和文件系统设计见《EasyLinux平台文件系统设计》

有两种镜像类型,一种是up.bin,用于系统升级,仅包含有效数据和头部信息。一种是flash.bin,用于工厂生产时烧写,包含数据和分区之间填充的空洞。

Easylinux-mkimage目标用于制作镜像文件

make O=build/gt2440 easylinux-mkimage

生成的镜像在buildroot/image/img目录下,buildroot/image/source目录下是用于制作的源文件。其中,gt2440_all包含uboot,kernel,usrimage等所有分区数据,exclude_uboot去掉了uboot,

Exclude_uboot_kernel去掉了uboot和kernel。升级的时候可根据需要只升级部分区域。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式Linux编译系统的设计——Bootloader, 内核,驱动,文件系统,升级镜像等自动化编译打包 的相关文章

  • 基于c3c2440 Linux SPI驱动程序移植与测试

    基于c3c2440 Linux SPI驱动程序移植与测试 环境 ubuntu14 04 TQ2440开发板 linux3 0内核 linux3 0内核移植笔记点此 1 配置内核 Device Drivers gt SPI support g
  • WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    使用SCP命令时出现这个错误 解决办法 rm ssh known hosts
  • 嵌入式 Linux 入门(三、Linux Shell 及常用命令说明)

    嵌入式 Linux入 门第三课 熟悉掌握 Linux 常用 Shell 命令 矜辰所致 更新Shell echo 命令 2022 7 20 目录 前言 一 Shell 基本说明 1 1 Shell 是什么 1 2 Shell 与 终端 te
  • Makefile 中gcc -lm -ldl是什么意思?

    gcc lm ldl是什么意思 包含动态链接库 到书上出现gcc lm 的选项 甚是不解 在网上查阅了一些资料 访问了一些论坛整理下 初学linux和gcc C代码调用math h中的函数有问题 如sqrt函数 若如sqrt 3 0 则可以
  • 嵌入式linux内存分析

    在linux的桌面发行版中 一般都会有一个swap分区 然而在用FLASH做存储介质的嵌入式设备中 是没有交换分区的 这主要的有如下原因 1 一旦使用了交换分区 系统的性能将下降得很快 不可接受 2 FLASH的写次数有限的 大概在几十万次
  • 2020-11-30

    嵌入式MQTT库移植 基于mosquitto库 一 交叉编译OpenSSL 下载源码到Linux虚拟机环境 https www openssl org source openssl 1 1 1f tar gz 放入非windows共享文件夹
  • linux下C程序查看内存剩余大小

    嵌入式linux中很多内存资源都比较小 所以很多程序中在malloc时就需要提前知道内存剩余的大小 下面是一种调用 sysinfo接口来实现 示例代码如下 include
  • shell常用命令

    目录 常用命令 目录信息查看命令 ls 目录切换命令 cd 当前路径显示命令 pwd 系统信息查看命令 uname 清屏命令 clear 系统帮助命令 man 系统重启命令 reboot 系统关闭命令 poweroff 查看和修改系统时间命
  • linux开发板通过网线连接电脑(win10)连接网络问题

    最近开始学习嵌入式Linux开发 使用野火imx6ull开发板 想把开发板通过网线连接到笔记本 笔记本连接WiFi 共享使用网络 查询了很多资料后成功实现 我现在把这个方法分享出来 1 禁用防火墙功能 打开网络和共享中心 gt window
  • Linux多线程编程知识汇总!

    大家好 我杂烩君 什么是多线程编程 1 线程和进程的区别 进程是指正在运行的程序 它拥有独立的内存空间和系统资源 不同进程之间的数据不共享 线程是进程内的执行单元 它与同一进程内的其他线程共享进程的内存空间和系统资源 2 多线程的优势和应用
  • 详解从0开始的嵌入式学习路线,学什么、怎么学?

    嵌入式是个大筐 什么都可以往里面装 电子 机械 计算机 自动化 测控 通信 物联网 很多很多专业都和嵌入式沾边 硬件 驱动 操作系统 网络 应用 算法 很多同学越学越迷糊 越学越感觉什么也不会 首先要记住一句话 嵌入式学习奥义 先观其广 再
  • git push报错 Missing or invalid credentials

    zys zys virtual machine work cpp git push origin master Missing or invalid credentials Error connect ECONNREFUSED run us
  • Ubuntu14.04安装配置NFS用于挂载嵌入式文件系统

    Ubuntu14 04安装配置NFS用于挂载嵌入式文件系统 1 安装 sudo apt get install nfs kernel server rpcbind 2 配置 vi etc exports 在文件的最后一行加上 yaffs2
  • pid算法控制

    一 先来彻底搞懂PID到底是啥 啥是PID PID 就是 比例 proportional 积分 integral 微分 derivative 是一种很常见的控制算法 在工程实际中 应用最为广泛的调节器控制规律为比例 积分 微分控制 简称PI
  • TQ2440移植u-boot2016.11全过程记录-【5】设置从NOR FLASH启动U-BOOT

    TQ2440移植u boot2016 11 设置从NOR FLASH启动u boot gedit include configs tq2440 h 屏蔽掉宏CONFIG SKIP LOWLEVEL INIT 修改宏CONFIG SYS TE
  • linux基本命令与终端操作、linux命令英文全称解释、ls clear cd pwd cat touch cp rm rmdir mkdir mv file find grep sudo su

    linux终端的命令提示符 命令提示符由四部分组成 当前登陆的用户名 主机名 当前所在目录 用户提示符 linux基本命令 查看目录下文件及文件夹 ls 英文全称 助记 list 命令参数 a all 输出所有文件及文件夹 包括隐藏文件 l
  • 嵌入式 Linux 入门 环境篇(四、必备开发工具安装)

    嵌入式 Linux入门 环境篇第四课 开发工具软件的安装与说明 by 矜辰所致 前言 前面的环境篇我们把开发的基本环境安装好了 Ubuntu虚拟机 网络配置 为了从 0 开始说明 还特意买了一台新电脑 就问是不是不将就 在我们接下来做嵌入式
  • TQ2440移植u-boot2016.11全过程记录-【1】单板建立并启动

    TQ2440移植u boot2016 11 单板建立并启动 移植说明 u boot2016 11是S3C2440最后一版的uboot支持 所以选择了此版本进行移植 交叉编译器使用的是天嵌官方的交叉编译器 版本为4 4 3 使用的ubuntu
  • FriendlyDesktop系统烧写,SOM-RK3399/NanoPC T4烧录系统

    SOM RK3399 SOM RK3399 V2 NanoPC T4的系统是通用的 由于Type C烧写有蛮大的概率会识别不成功 实测 所以建议使用SD卡脱机烧写 友善之臂提供了几种系统支持 android7 8 10 FriendlyCo
  • 嵌入式 Linux 入门(七、Linux 下的环境变量)

    嵌入式 Linux 入门第七课 学习理解 linux 的环境变量 矜辰所致 前言 学习完 Linux 的 Shell 命令 和 Shell 脚本 我们还需要理解一个东西 环境变量 理解了 Linux 的环境变量 前面的文章中有些细节的东西

随机推荐

  • C++面向对象特性之继承

    一 继承的概念 继承是一种机制 目的是实现代码复用的同时减少重复代码量 它允许程序员在保持原有类特性的基础上进行功能的拓展 这样产生的新类叫做派生类 被继承的类叫做基类 下面可以看一个实例 class Animal int age clas
  • 遇见未来

    互联网及其延伸 正在导向我们走向一个新的时代 软件技术在新一轮革命技术中毫无疑问是核心竞争力之一 C 语言发明人Biarne Stroustrup说 人类文明运行在软件之上 也突出了软件技术的重要地位 什么是软件定义 软件定义在企业的数据中
  • 利用ESP定律的upx脱壳实践

    背景 除了命令行upx d脱壳 还有手动脱壳 ESP定律的本质是堆栈平衡 又称堆栈平衡定律 是应用频率最高的脱壳方法之一 脱壳的目的就是找到真正的OEP 源文件的EP代码 方法 从pushad到popad是一段解压缩代码 解压UPX壳 这段
  • C++数组越界访问测试

    对int nums 10 进行数组越界测试 文件test cpp 第一次测试 include
  • MySQL实战45讲

    目录 前言 一 连接器 查询缓存 分析器 词法分析 语法分析 优化器 执行器 二 redo log bin log 三 读未提交 read uncommitted 读提交 read committed 可重复读 repeatable rea
  • linux 报错:telnet Connection closed by foreign host

    0 美图 1 背景 链接kudu 报错 telnet samba xx com 7051 Trying 172 xx1 xx 33 Connected to samba example com Escape character is Con
  • java 本地图片压缩 转base64并限制文件大小

    本地图片转base64并限制文件大小 param imagePath 图片全路径 param sizeLimit 大小 整数 限制的大小 KB 1024 return 返回值为0 imageurl为空 返回值为1 imageurl路径不可访
  • 如何更改鼠标右键菜单(转载)

    复制下面的信息到记事本中 然后另存为 reg格式的文件 Windows Registry Editor Version 5 00 HKEY CLASSES ROOT doc Word Document 8 Content Type appl
  • React技巧1(状态组件与无状态组件的使用)

    本教程总共5篇 每日更新一篇 请关注我们 你可以进入历史消息查看以往文章 也敬请期待我们的新文章 1 React 技巧1 状态组件与无状态组件的使用 2018 01 04 2 React 技巧2 避免无意义的父节点 2018 01 05 3
  • Qt4软键盘源码分享

    简述 基于Qt4的软键盘 支持中文 字母 数字 特殊字符输入 开发环境为qt4 8 7 msvc2008 提供了 软键盘动态库源码 和相应的 demo源码 自己编译时记得修改代码中qss 中文字库的路径 源码路径 https downloa
  • IDEA(最新版)导入Myeclipse/eclipse的web项目并运行(全) Windows或者Mac系统

    一 前言 最近在做毕业设计 没想到现在的大学中还是使用的Myeclipse比较多 这个工具逐渐被IDEA工具所代替 因为IDEA的性能和使用更加优秀 或者我们在工作中遇到Myeclipse项目导入IDEA中的情形 怎么将Myeclipse开
  • 西瓜小说(安卓)

    软件名叫西瓜阅读 是吾爱上的大佬根据开源阅读APP魔改之后的版本 内置了超多书源 大家下载安装直接使用 无需再进行任何其他额外的一些操作或者设置 作者魔改之后还给软件添加了推荐 榜单 书架之类的一些很不错的界面 大家都知道 阅读APP最大的
  • SpringCluod深入教程

    1 Nacos配置管理 Nacos除了可以做注册中心 同样可以做配置管理来使用 1 1 统一配置管理 当微服务部署的实例越来越多 达到数十 数百时 逐个修改微服务配置就会让人抓狂 而且很容易出错 我们需要一种统一配置管理方案 可以集中管理所
  • DeFi终极指南【以太坊去中心化金融】

    DeFi De centralized Fi nance 即去中心化金融 是2019年区块链应用发展最迅猛的一个领域 在以太坊区块链上那些最成功的DApp 例如MakerDAO DAI Compound 0x以及下面我们要介绍的那些 其目标
  • 关于matlab中矩阵取值的方法

    在matlab中 取出矩阵中某一个值的方法如下 1 对于二维数组 a i j 表示取出二维数组a的第 i 行 第 j 列的数据 a j 表示取出二维数组a的第 j 列的所有数据 a i 表示取出二维数组a的第 i 行的所有数据 2 多维数组
  • Aviator 表达式的使用

    1 使用Aviator 需要导入包
  • 计算机视觉人体骨骼点动作识别-1.训练自己的关键点检测模型

    人体关键点检测算法 关键点并不特指人体骨骼关键点 还有人脸关键点 物体的关键点 其中人体的关键点 也叫作pose Estimation 是最热门 也是最有难度 应用最广的 应用可以包括 行为识别 人机交互 智能家居 虚拟现实 具体细分下来可
  • USB之基础知识

    1 USB概述 USB Universal Serial Bus 通用串行总线 是一个外部总线标准 用于规范电脑与外部设备的连接和通讯 USB接口支持设备的即插即用和热插拔功能 USB接口有4个pin脚 分别为VCC GND Data Da
  • 通过tomcat.mamager页面远程管理tomcat

    通过java访问tomcat的manager来管理 此方法无法达到重启tomcat的目的 只能重启应用 先在tomcat中修改tomcat users xml
  • 嵌入式Linux编译系统的设计——Bootloader, 内核,驱动,文件系统,升级镜像等自动化编译打包

    项目简介 嵌入式系统的开发过程较为复杂 编译 裁剪 定制等如果没有一套规范的流程将会难于管理和控制 本项目的目的是设计一个嵌入式Linux编译系统 实现代码的编译 定制和裁剪 Bootloader 内核 驱动 文件系统 升级镜像等都可以自动