linux(全志)初始环境到移植lvgl

news2024/11/13 13:02:15

一、 格式化TF卡

1. linux命令行格式化

1.1 找到U盘位置(已挂载)

sudo fdisk -l

如图,我的在/dev/sdb
在这里插入图片描述

1.2 格式化U盘

sudo  mkfs  -t  vfat  /dev/sdb

-t 后面是格式化为哪种文件系统格式,vfat就是fat32格式,最后加U盘位置
有时候被占用了无法格式化,需要先卸载u盘,挂载u盘后会在/media/user 下找到
使用umount 卸载
在这里插入图片描述

2 gparted格式化 删除分区
在这里插入图片描述
右键 卸载 删除 再确认

二、 将uboot写入到sd卡到8k偏移处

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

在这里插入图片描述

三、 新建分区

1 新建BOOT分区,存放linux kernel

在这里插入图片描述

2 新建rootfs分区 存放根文件系统

在这里插入图片描述

3 将下列三个文件拷贝到BOOT分区

	1 boot.scr  //看了几个教程都没有提及到这个问题 要搞清楚 荔枝派自带

	2 zimage  目录 arch/arm/boot

	3 suniv-f1c100s-licheepi-nano.dtb  目录 arch/arm/boot/dts
	//命令
	sudo cp boot.scr suniv-f1c100s-licheepi-nano.dtb zImage /media/wd/BOOT -rf

在这里插入图片描述

4 将rootfs.tar解压到rootfs

sudo tar -xvf rootfs.tar  -C /media/wd/rootfs

买了一张512M的卡,一键下载镜像后提示card did not respond to voltage select ,unsupported boot device

感觉是卡不行 不知道为啥
有人重新插拔一下就行我的不可以

四、 Lrzsz移植

感谢万能的坑友,我搜索了一下,buildroot中确实有这个功能,可以通过搜索lrzsz,找到了它位于这个目录中:
Target packages —>
Networking applications —>
[v] lrzsz
勾选之后,编译,根文件系统中就有这个工具了。

四、第一次进入linux,命令号只显示#号

解决 修改/etc/profile 

在末尾处 输入 
export PS1='[\u\@\h: \w\a]$'

在这里插入图片描述

重启板子即可

五、 LCD st7789移植

1.设备树更改

在这里插入图片描述

&spi0 {
	pinctrl-names = "default";
	pinctrl-0 = <&spi0_pins_a>;
	status = "okay";

	flash@0 {
		#address-cells = <1>;
		#size-cells = <1>;
		compatible = "winbond,w25q128", "jedec,spi-nor";
		reg = <0>;
		spi-max-frequency = <40000000>;
	};

};
&spi1 {
	pinctrl-names = "default";
	pinctrl-0 = <&spi1_pins_a>;
	status = "okay";

	st7789v@0 {
		status = "okay";
		compatible = "sitronix,st7789v";
			reg = <0>;
			spi-max-frequency = <32000000>;
			rotate = <90>;
			spi-cpol;
			spi-cpha;
			rgb;
			fps = <30>;
			buswidth = <8>;
			reset-gpios = <&pio 4 3 GPIO_ACTIVE_LOW>;
			dc-gpios = <&pio 4 5 GPIO_ACTIVE_LOW>;
			debug = <0>;
	};
};


在这里插入图片描述

2. 修改linux自带的fbtft驱动

只需要更改下面的三个地方即可 不需要按照参考博客上更改,因为新下载的内核已经做了升级

static int init_display(struct fbtft_par *par)
{
	par->fbtftops.reset(par);
	mdelay(50);
	write_reg(par,0x11);//Sleep exit
	mdelay(12);
	write_reg(par,0x11);
	mdelay(10);
	write_reg(par,0x3A,0x05); //65k mode
	write_reg(par,0xc5,0x1a);
	write_reg(par,0x36,0x70); // 屏幕显示方向设置
	//-------------ST7789V Frame rate setting-----------//
	write_reg(par,0xb2,0x05,0x05,0x00,0x33,0x33);
	write_reg(par,0xb7,0x35);
	//--------------ST7789V Power setting---------------//
	write_reg(par,0xbb,0x3f);
	write_reg(par,0xc0,0x2c);
	write_reg(par,0xc2,0x01);
	write_reg(par,0xc3,0x0f);
	write_reg(par,0xc4,0x20);
	write_reg(par,0xc6,0x11);
	write_reg(par,0xd0,0xa4,0xa1);
	write_reg(par,0xe8,0x03);
	write_reg(par,0xe9,0x09,0x09,0x08);
	write_reg(par,0xe0,0xd0,0x05,0x09,0x09,0x08,0x14,0x28,0x33,0x3f,0x07,0x13,0x14,0x28,0x30);
	write_reg(par,0xe1,0xd0,0x05,0x09,0x09,0x08,0x03,0x24,0x32,0x32,0x3b,0x14,0x13,0x28,0x2f);
	write_reg(par,0x21);
	write_reg(par,0x11);
	mdelay(120);      //Delay 120ms
	write_reg(par,0x29);
	mdelay(200);
	return 0;
}
static struct fbtft_display display = {
	.regwidth = 8,
	.width = 135,
	.height = 240,
	.gamma_num = 2,
	.gamma_len = 14,
	.gamma = DEFAULT_GAMMA,
	.fbtftops = {
		.init_display = init_display,
		.set_var = set_var,
		.set_gamma = set_gamma,
		.blank = blank,
	},
};

对于1.14寸液晶屏而言,其屏幕有偏移,这里需要修改fbtft-core.c文件中的fbtft_set_addr_win函数

static void fbtft_set_addr_win(struct fbtft_par *par, int xs, int ys, int xe,
                   int ye)
{
    write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS,(xs+40) >> 8, xs+40, ((xe+40) >> 8) & 0xFF, (xe+40) & 0xFF);

    write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS,((ys+52) >> 8) & 0xFF, (ys+52) & 0xFF, ((ye+52) >> 8) & 0xFF, (ye+52) & 0xFF);

    write_reg(par, MIPI_DCS_WRITE_MEMORY_START);
}

现在所有的修改都完成了,剩下的就是编译内核了,在内核根目录下执行
make menuconfig
2.5 内核配置
由于FC1000S的SPI中有一个BUG,因此我们在开启SPI驱动的时候必须选择A31(Device Drivers -> SPI support)
如图所示
在这里插入图片描述
现在选择ST7789V驱动并编译进内核中,如下:
Device Drivers —>  
    [] Staging drivers —>  
        <
> Support for small TFT LCD display modules —>
              <*> FB driver for the ST7789V LCD Controller

在这里插入图片描述
保存退出,然后执行make命令编译内核,然后将镜像拷贝到tf卡第一分区中,此时可以看到屏幕已经可以驱动起来了,并且/dev目录下有fb0设备。

编译 make -j2
将设备树和zimage复制到tf卡中 重启可以看到光标闪烁
说明移植成功

5.测试

在这里插入图片描述

此时可以看到屏幕刷新了,然后编程了黑色背景,同时出现了光标,从终端的 log 可以看到,当
fb 挂载成功后,控制台驱动检测到 fb 设备后会自动将 fb0 映射到 tty0 上,这样 tty0 实际上就是 fb0 ttys0则是串口
设备。现在我们向屏幕输入一个 hello frame buffer,如下:

echo hello frame buffer > /dev/tty0

可以看到此时液晶屏上显示了该文字,我们也可以将当前目录输出到液晶屏上:
ls / > /dev/tty0

6 将启动信息同时打印到lcd 和串口

实际上很就简单
在uboot启动 倒计时内按任意键进入uboot命令行,设置bootargs 添加console=tty0最前面即可
注意不要输入错误 一定要确保是在英文输入法下面输入的,有时不小心按到shift 进入中文输入字符就会不对,我就是这样 导致我格式化了多次tf卡
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七 FE8.1晶振不起振 两端电压为3.3V和3.4V

在这里插入图片描述

七、 LVGL

1.在linux下新建目录,下载lvgl核心库和驱动

mkdir my_lvgl
cd my_lvgl
2.从github上下载lvgl到本地 https://github.com/lvgl/lvgl 上我们选择最新的释放版本release/v7 我们只下载当前版本来使用。
git clone -b release/v7 --depth 1 https://github.com/lvgl/lvgl.git 下载lvgl核心库
git clone -b release/v7 --depth 1  https://github.com/lvgl/lv_drivers.git 下载驱动

2.更改配置

最重要的需要配置的有一下几个可以搜索并配置:
这几个就必须要根据板子实际情况修改了
#define LV_HOR_RES_MAX          (480)  //屏幕水平宽度 根据实际使用修改
#define LV_VER_RES_MAX          (320)  //屏幕垂直高度 根据实际使用修改
#define LV_COLOR_DEPTH     16           //LCD 屏幕的像素深度。一般的可能是rgb565 也有是rgb8888的就写 32 根据实际使用修改
#define LV_USE_GPU              1           //这个记得给他置0了一般的板子应该没有gpu

下面这几个可以不动
#define LV_USE_PERF_MONITOR     0  //右下角cpu信息输出。测试可以打开看下
#  define LV_MEM_SIZE    (32U * 1024U) //这里默认的是32K 用作lvgl的动态内存分配。可以根据实际情况修改,但是要大于等于2KB
#define LV_DISP_DEF_REFR_PERIOD      30   //刷新周期 30ms 就是刷新速率问题,看性能设置吧。
#define LV_INDEV_DEF_READ_PERIOD          30//输入设备的扫描时间,就是轮询按键的时间。默认30ms。
#define LV_USE_FILESYSTEM       1    //文件系统不用也可以给置0了
#define LV_USE_DEBUG        1         //debug信息输出可关闭

3.更改驱动

将lvgl driver模板拷贝出来修改 cp lv_drivers/lv_drv_conf_template.h ./lv_drv_conf.h
修改头 if 0改为 if 1
#  define USE_FBDEV           0    //把这个置位为1   
#  define FBDEV_PATH          "/dev/fb0"  //确认是否为你设备的fb

4.提供lvgl心跳

然后你会发现任务刷新的label并没有改变。原因就是lvgl还需要提供一个计时的心跳包给他,按照官网的说明是调用lv_tick_inc这个函数来设置lvgl的时钟。官网移植给的建议是linux开个线程来调用这个函数,实际上有另外一种方式就是用用户的时钟源(这里用Linux下的gettimeofday比用usleep好使)。

在lv_conf.h中
LV_TICK_CUSTOM  0   置为1 这个就是使用用户的时钟源使能
#define LV_TICK_CUSTOM_INCLUDE  "Arduino.h" //将这个头文件改为<sys/time.h> (gettimeofday 的头文件)
#define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis())   //宏定义声明外部函数,就是提供一个能获取时间的函数给lvgl。这个我们自己写个在main中 写个my_tick() 所以这里替换掉millis()即可。
在 main.c中增加此函数 记得加<sys/time.h> 这个头文件

uint32_t my_tick(void)
{
    static uint64_t start_ms = 0;
    struct timeval tv_time;

    if(start_ms == 0) {
        gettimeofday(&tv_time, NULL);
        start_ms = (tv_time.tv_sec * 1000000 + tv_time.tv_usec) / 1000;
    }

    gettimeofday(&tv_time, NULL);
    uint64_t now_ms;
    now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;

    uint32_t time_ms = now_ms - start_ms;
    return time_ms;
}

至此 make一下拷贝到板子运行即可count就加起来了。


5.编写makefile

编译输出
mkdir obj 创建一个输出目录用于输出生成的.o文件
在obj目录下创建一个Makefile 毕竟编译方便输入下面语句

CC = arm-linux-gcc 
LVGL_DIR ?=/home/wd/linuxdev/Lichee/my_LVGL
LVGL_DIR_NAME ?= lvgl
CFLAGS ?= -O3 -g0 -I$(LVGL_DIR)/
LDFLAGS ?= -lm
BIN = lvgl_demo
MAINSRC = ../main.c
include $(LVGL_DIR)/lvgl/lvgl.mk
include $(LVGL_DIR)/lv_drivers/lv_drivers.mk
OBJEXT ?= .o
AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))
MAINOBJ = $(MAINSRC:.c=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS) $(MAINSRC)
OBJS = $(AOBJS) $(COBJS)

all: default

%.o: %.c
	@$(CC)  $(CFLAGS) -c $(INCLUDES) $< -o $@
	@echo "CC $<"

default: $(AOBJS) $(COBJS) $(MAINOBJ)
	$(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS) 
	cp $(BIN) ../

clean:
	rm -f $(BIN) $(AOBJS) $(COBJS) $(MAINOBJ)


6.应用编写测试

添加测试代码
在lvgl根目录下新建main.c加入如下代码。
#include "lvgl/lvgl.h"
#include "lv_drivers/display/fbdev.h"
#define DISP_BUF_SIZE (100 * LV_HOR_RES_MAX) //lvgl用于绘制屏幕的缓冲区。这里用100行像素作为缓冲区这个可以修改。
static lv_obj_t *label;
static void refresh_ui_task(lv_task_t * task)
{
        char temp[50];
        static int count = 0;
        sprintf(temp, "hello why can %d", count++);
        lv_label_set_text(label, temp);
}
static void button_event(lv_obj_t * obj, lv_event_t event)
{
        if (event == LV_EVENT_CLICKED) {
                printf("button event\n");
        }
}
static void video_disp_window()
{
        lv_obj_t *  this_win = lv_cont_create(lv_scr_act(), NULL);
        lv_obj_set_size(this_win, LV_HOR_RES, LV_VER_RES);
        lv_obj_t *btn = lv_btn_create(this_win, NULL);
        label = lv_label_create(btn, NULL);
        lv_label_set_text(label, "hello why can");
        lv_obj_set_event_cb(btn, button_event);
        lv_task_create(refresh_ui_task, 1000, LV_TASK_PRIO_MID, NULL);
}

int main(int argc, char **argv)
{
    lv_init();  //lvgl gui初始化

    fbdev_init(); //fb初始化 此函数在 lv_drivers/display/fbdev.c 中,就是打开fb设备映射显存出来使用

    static lv_color_t buf[DISP_BUF_SIZE];
    static lv_disp_buf_t disp_buf;

    lv_disp_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE);
    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.buffer = &disp_buf;
    disp_drv.flush_cb = fbdev_flush; //fbdev_flush这就是输入显示驱动提供的操作函数 刷新数据到显存的函数。其他非Linux fb移植照葫芦即可。
    lv_disp_drv_register(&disp_drv);

    video_disp_window();
    while (1) 
        {
        lv_task_handler();
        usleep(5000);
         }
}

根目录make一下 拷贝到板子上试下呗。

7.增加外设 根据实际情况添加

1.加入触摸点击



触摸输入在lv_drv_conf.h
#  define USE_EVDEV           0 这个 置为1
#  define EVDEV_NAME   "/dev/input/event0"    //这个就是输入设备了看你自己的是event几了。

在main.c的main函数中加入

evdev_init();
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);      
indev_drv.type =LV_INDEV_TYPE_POINTER;                
indev_drv.read_cb =evdev_read;             
lv_indev_drv_register(&indev_drv);

记得添加头文 #include "lv_drivers/indev/evdev.h"
make一下到板子试试。这样就可以妥妥的运行起来了。

八、linux vscode lvgl模拟器

大部分操作参考https://blog.csdn.net/weixin_45652444/article/details/119756079
实际操作有几率无法编译过
一般卡在c99编译上
解决办法 在顶层Makefile CFLAGS 后增加 -std=c99选项
搞了很久才解决
CFLAGS := -O0 -g $(WARNINGS) -std=c99
在这里插入图片描述

在编写一个Makefile工具时,出现Makefile:7: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.这个问题,
将空格用TAB键代替
用vim编辑makefile 错误的会现红色
在这里插入图片描述

2 VIM非正常退出

交换文件 “~/.add.py.swp” 已存在! 以只读方式打开([O]), 直接编辑((E)), 恢复(®), 删除交换文件((D)), 退出((Q)),中止((A)):

产生原因:文件的非正常关闭。

解决办法:删除add.py.swp文件,该文件是隐藏文件所以使用la查看,使用语句rm -r add.py.swp删除该文件,再次打开文件不会产生该问题。

————————————————
版权声明:本文为CSDN博主「sunsi_10」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sunsi_10/article/details/78232207

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

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

相关文章

Hashmap链表长度大于8真的会变成红黑树吗?

1、本人博客《HashMap、HashSet底层原理分析》 2、本人博客《若debug时显示的Hashmap没有table、size等元素时&#xff0c;查看第19条》 结论 1、链表长度大于8时(插入第9条时)&#xff0c;会触发树化(treeifyBin)方法&#xff0c;但是不一定会树化&#xff0c;若数组大小小于…

Win11电脑速度慢、延迟高怎么办?

作为新版的系统&#xff0c;Windows 11还需要更多的时间完善。不少用户反映升级了Win11后反而感觉速度慢&#xff0c;还有延迟或死机现象。 如果你使用Win11系统时也有这种感觉&#xff0c;那这篇文章就是为你提供的。 问题可能出在系统存储容量低、驱动程序已过时&#xff0…

APP渗透抓包

APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…

JVM调优及垃圾回收GC

一、说一说JVM的内存模型。JVM的运行时内存也叫做JVM堆&#xff0c;从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间&#xff0c;老年代默认占2/3堆内存空间&#xff0c;永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和Surv…

Node.js安装与配置

Node.js安装与配置 前言 本篇博文记录了Node.js安装与环境变量配置的详细步骤&#xff0c;旨在为将来再次配置Node.js时提供指导方法。 另外&#xff1a;Node.js版本请根据自身系统选择&#xff0c;安装位置、全局模块存放位置和环境变量应根据自身实际情况进行更改。 Node…

spring(四)——————从spring源码角度去解释前面的疑问

前面两篇文章&#xff0c;我们从mybatis-spring的插件包出发&#xff0c;探究如何将第三方框架集成到spring中&#xff0c;也知道了mybatis中使用了FactoryBeanImportBeanDefifinitionRegistrarImport对mapper进行注入。 不过我们在前两篇文章中仍然遗留很多疑点&#xff0c;例…

Revit导出PDF格式图纸流程及“批量导出图纸”

一、Revit导出PDF格式图纸流程 1、点击左上方“应用程序菜单”即“R”图标&#xff0c;进择“打印”选项。 2、在弹出的对话框中&#xff0c;需要设置图纸“打印范围”&#xff0c;选择“所选的视图/图纸选项”&#xff0c;点击“选择”&#xff0c;按钮&#xff0c;选择我们需…

LESS模型与随机森林

模型学习 1 随机森林 https://blog.csdn.net/weixin_35770067/article/details/107346591? 森林就是建立了很多决策树&#xff0c;把很多决策树组合到一起就是森林。 这些决策树都是为了解决同一任务建立的&#xff0c;最终的目标也都是一致的&#xff0c;最后将其结果来平均…

Xline v0.2.0: 一个用于元数据管理的分布式KV存储

Xline是什么&#xff1f;我们为什么要做Xline&#xff1f; Xline是一个基于Curp协议的&#xff0c;用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议&#xff0c;需要两次RTT才能完成一次请求。当部署在单个数据中心时&#xff0c;节点之间的延迟较低&a…

08 SpringCloud 微服务网关Gateway组件

网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f; 如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去用。 这样的架构&#xff0c;会存…

Linux软件管理:源代码安装

前言 Linux上面的软件几乎都是经过GPL的授权&#xff0c;所以每个软件都提供源码 我们的系统中有一个http软件包&#xff08;上一篇文章中安装的&#xff09; 通过man手册我们知道了该软件包属于Apache&#xff0c;所以我们就可以进入它的官网中获取此源码 官网除了能获取源码…

IB学校获得IBO授权究竟有多难?

IB 学校认证之路&#xff0c;道阻且长 The road to IB school accreditation is long and difficult一所学校能获得IB授权必须经过IBO非常严格的审核&#xff0c;在办学使命&教育理念、组织架构、师资力量&授课技能、学校硬件设施和课程体系上完全符合标准才可获得授权…

英特尔 31.0.101.4125显卡驱动更新!

周更驱动的英特尔又来啦&#xff01;时隔一周英特尔为大家带来了31.0.101.4125版本的显卡驱动&#xff0c;支持《英雄连3》、《工人物语&#xff1a;新兴同盟》、《原子之心》、《狂野之心》、《如龙维新&#xff01;极》等游戏。 《如龙维新&#xff01;极》将在2月22日正式登…

功率放大器在lamb波方向算法的损伤定位中的应用

实验名称&#xff1a;基于PZT结Lamb波方向算法的损伤定位方法研究方向&#xff1a;损伤定位测试目的&#xff1a;Lamb波是在具有自由边界的固体板或层状结构中传输的一种弹性导波&#xff0c;由于其本身的传播特性&#xff0c;如沿传播路径衰减小&#xff0c;能量损失小&#x…

makefile简易教程

makefile简易教程 一、学习目标 达到多文件快速编译的需求&#xff0c;相关符号的意思&#xff0c;以及其它注意事项。 二、快速入门 2.1 基本概念 Makefile 是一个在Unix和Linux操作系统上使用的构建工具&#xff0c;用于自动化编译和构建源代码。 2.2 用处 通过Makefi…

Linux环境下(CentOS 7)安装MySQL

Linux环境下(CentOS 7)安装MySQL数据库 文章目录Linux环境下(CentOS 7)安装MySQL数据库一、安装MySQL数据库二、安装过程的中相关问题三、如何卸载已安装的MySQL四、参考链接一、安装MySQL数据库 1、下载mysql源安装包(version: 5.7.41 MySQL Community Server) wget http://…

ACM MM 相关内容的整理+汇总

目录一、网址二、重要时间点三、论文篇幅要求四、征稿主题五、论文格式相关要求六、论文模板修改成投稿模式上述参考七、模板使用相关八、关于图片方面的问题九、Review and Rebuttal十、ACM MM2022相关论文参考arxiv上 ACM MM2022 论文汇总一、网址 ACM MM2023 主页&#xff1…

阿里工作7年,一个30岁女软件测试工程师的心路历程

简单的先说一下&#xff0c;坐标杭州&#xff0c;14届本科毕业&#xff0c;算上年前在阿里巴巴的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09; 其中成功的有4家&am…

嵌入式原理与应用期末复习汇总(附某高校期末真题试卷)

文章目录一、选择题二、填空题&#xff1a;三、判读题&#xff1a;四、简答题&#xff1a;五、程序设计题高校真题试卷第一套第二套第三套重修试卷一、选择题 1、为保证在启动服务器时自动启动DHCP进程&#xff0c;应对&#xff08; B &#xff09;文件进行编辑。 A、 /etc/rc…

少儿户外拓展北斗定位解决方案

一、项目背景户外拓展训练是指通过专业的机构&#xff0c;对久居城市的人进行的一种野外生存训练。拓展训练通常利用崇山峻岭、翰海大川等自然环境&#xff0c;通过精心设计的活动达到“磨练意志、陶冶情操、完善人格、熔炼团队”的培训目的。针对户外拓展人员安全管理存在的实…