英飞源嵌入式面试题及参考答案

news2024/12/19 6:53:02

如何在给定的连续内存空间中高效地实现一个队列和一个栈?

栈是一种后进先出(LIFO)的数据结构,要在连续内存空间中实现栈,可以使用一个数组来存储栈元素。定义一个指针来指向栈顶元素,初始时栈为空,指针指向一个特殊值(比如 -1 或者数组的起始位置之前)。当进行入栈操作时,先将指针向上移动一个位置(如果是数组下标,就加 1),然后将元素存储到指针指向的位置。出栈操作则是先取出指针指向位置的元素,然后将指针向下移动一个位置。

例如,用数组 stack [MAX_SIZE] 来表示栈,top 来表示栈顶指针。入栈函数 push 可以这样实现:

void push(int element) {
    if (top < MAX_SIZE - 1) {
        top++;
        stack[top] = element;
    } else {
        // 栈满处理,比如打印错误信息
        printf("Stack is full.\n");
    }
}

出栈函数 pop 可以这样实现:

int pop() {
    if (top >= 0) {
        int element = stack[top];
        top--;
        return element;
    } else {
        // 栈空处理,比如返回一个特殊值或者打印错误信息
        printf("Stack is empty.\n");
        return -1;
    }
}

队列是一种先进先出(FIFO)的数据结构。在连续内存空间中实现队列,可以用一个数组来存储队列元素,同时需要两个指针,一个指向队头(front),一个指向队尾(rear)。当进行入队操作时,将元素存储到 rear 指向的位置,然后将 rear 指针向后移动一个位置;出队操作则是取出 front 指向位置的元素,然后将 front 指针向后移动一个位置。不过要注意,当 rear 指针到达数组末尾时,需要进行循环处理,使其回到数组开头,同样,front 指针也可能需要这样的处理。

例如,用数组 queue [MAX_SIZE] 来表示队列,front 和 rear 来表示队头和队尾指针。入队函数 enqueue 可以这样实现:

void enqueue(int element) {
    if ((rear + 1) % MAX_SIZE!= front) {
        queue[rear] = element;
        rear = (rear + 1) % MAX_SIZE;
    } else {
        // 队列已满的处理,比如打印错误信息
        printf("Queue is full.\n");
    }
}

出队函数 dequeue 可以这样实现:

int dequeue() {
    if (front!= rear) {
        int element = queue[front];
        front = (front + 1) % MAX_SIZE;
        return element;
    } else {
        // 队列已空的处理,比如返回一个特殊值或者打印错误信息
        printf("Queue is empty.\n");
        return -1;
    }
}

这种实现方式的优点是简单高效,直接利用数组的连续存储空间。但也有一些限制,比如栈和队列的大小在初始化后通常是固定的,受到数组大小的限制。如果需要动态扩展,就需要额外的处理,如重新分配更大的内存空间并复制元素。

介绍一下 STM32H750 微控制器的特点和应用。

STM32H750 是意法半导体(ST)推出的高性能微控制器。

特点:

  • 高性能内核:它基于 ARM® Cortex® - M7 内核,具有很高的处理能力。该内核采用了哈佛架构,拥有独立的指令总线和数据总线,能够实现高效的指令预取和数据访问,其工作频率可以达到很高,比如 480MHz,这使得它能够快速地处理复杂的计算任务和多任务处理。
  • 丰富的存储资源:它配备了大容量的闪存和 SRAM。闪存用于存储程序代码,大容量的闪存可以让用户存储更复杂、更庞大的程序。SRAM 则用于数据的快速读写,在运行过程中,能够快速地提供数据给处理器进行处理,这对于一些实时性要求高的数据处理任务非常重要。
  • 丰富的外设接口:有多个通用定时器,可以用于精确的定时操作,比如生成 PWM 信号用于电机控制等。它还具有高速 SPI 接口,用于和高速的 SPI 设备进行通信,像 SPI Flash 等。此外,还有 USB 接口,包括 USB OTG(On - The - Go)接口,这使得它可以方便地连接到 USB 设备,如 U 盘进行数据存储,或者连接到 PC 进行通信和调试。还有以太网 MAC(Media Access Control)接口,使得设备能够接入以太网,实现网络通信功能,这在物联网等应用场景中非常有用。
  • 强大的图形处理能力:具备硬件图形加速功能,能够支持复杂的图形显示任务。这对于一些需要显示图形界面的设备,如工业控制的人机界面(HMI)、智能仪表等非常有用,可以加速图形的绘制和更新速度,提供更流畅的视觉体验。

应用:

  • 工业控制领域:可以用于工业自动化设备的控制。例如,在可编程逻辑控制器(PLC)的实现中,STM32H750 可以作为核心控制器,通过其丰富的接口连接各种工业传感器(如温度传感器、压力传感器等)和执行器(如电机、阀门等)。利用其定时器产生精确的控制信号,通过以太网接口实现远程监控和控制功能,对生产线上的设备进行自动化控制和监测,提高生产效率和质量。
  • 智能仪表领域:用于电表、水表、燃气表等智能仪表的开发。通过其 ADC(模数转换器)接口连接电量、水量或气量的传感器,精确地采集数据,然后进行数据处理和存储。利用其图形处理能力,可以在仪表的显示屏上显示丰富的信息,如读数、历史数据图表、报警信息等。并且可以通过通信接口(如 SPI 或 USB)将数据传输给上位机进行集中管理和计费等操作。
  • 电机控制领域:对于直流电机和交流电机的控制都非常适用。通过定时器产生 PWM 信号,精确地控制电机的转速和转矩。在电动汽车的电机控制器、工业电机驱动器等设备中,STM32H750 可以作为核心控制芯片,结合其高速运算能力和丰富的接口,实现电机的高效、稳定控制,同时还可以通过通信接口实现与其他系统(如车辆的主控系统或工业自动化系统)的协同工作。
  • 物联网设备:作为物联网网关或者边缘节点设备的核心芯片。它可以通过以太网或者无线通信模块(可以外接)连接到互联网,收集各种传感器的数据(如环境监测中的温度、湿度、空气质量传感器等),然后将数据发送到云端服务器进行分析和处理。同时,也可以接收云端的指令,对本地的设备进行控制,实现物联网的智能化应用。

RTOS 系统中任务是如何调度的,优先级问题如何处理?

在实时操作系统(RTOS)中,任务调度是核心机制之一。

任务调度主要有两种方式:抢占式调度和非抢占式调度。

非抢占式调度是指一个任务一旦开始执行,就会一直运行直到它主动放弃 CPU 资源,比如任务执行完或者任务进入等待状态(如等待某个事件发生、等待定时器超时等)。这种调度方式比较简单,但实时性可能较差,因为高优先级的任务可能需要等待低优先级任务执行完毕才能得到执行机会。

抢占式调度则是当一个高优先级任务准备好运行时,它可以立即抢占正在运行的低优先级任务的 CPU 资源。这种方式能够更好地保证高优先级任务的实时性。例如,在一个工业控制系统中,如果有一个紧急的报警任务(高优先级)和一个普通的数据采集任务(低优先级),当报警任务触发时,它可以立即抢占 CPU 资源进行处理,确保报警信息能够及时被处理。

对于优先级的处理,RTOS 通常允许用户为每个任务分配一个优先级。优先级可以是静态的,即任务在创建时就确定了优先级,在整个运行过程中不会改变;也可以是动态的,任务的优先级可以根据系统的运行情况和任务的性质进行调整。

在任务创建时,会根据任务的重要性和实时性要求等因素来分配优先级。例如,在一个汽车电子系统中,对于安全气囊控制任务会分配较高的优先级,因为它需要在紧急情况下快速响应;而对于车内的一些舒适性系统(如座椅加热控制)的任务可以分配较低的优先级。

当多个任务同时处于就绪状态时,调度器会根据优先级来选择下一个要执行的任务。一般来说,调度器会维护一个就绪任务队列,按照优先级从高到低的顺序排列任务。当 CPU 空闲时,调度器会从队列头部选择任务进行执行。

为了避免高优先级任务长时间占用 CPU 资源导致低优先级任务 “饥饿” 的情况,一些 RTOS 采用了时间片轮转机制。即使是高优先级任务,也只能在一个时间片内执行,时间片结束后,CPU 资源会被分配给其他任务,这样可以保证每个任务都有机会得到执行。

此外,任务之间可能会存在同步和互斥的情况。例如,多个任务可能会访问共享资源,如全局变量、硬件设备等。为了保证数据的一致性和系统的稳定性,需要采用同步机制,如信号量、互斥锁等。当一个任务获取了互斥锁访问共享资源时,其他任务如果也想访问该资源,就需要等待该任务释放互斥锁。在这种情况下,任务的优先级也会影响等待的顺序,高优先级任务可能会优先获得互斥锁的访问权,但这也可能导致优先级反转的问题。优先级反转是指一个低优先级任务持有一个高优先级任务需要的资源,导致高优先级任务被阻塞,而此时可能有中等优先级的任务在执行,这就违背了优先级的初衷。为了解决这个问题,一些 RTOS 采用了优先级继承等策略,当低优先级任务持有高优先级任务所需的资源时,暂时提高低优先级任务的优先级,使其能够尽快完成资源访问并释放资源,从而保证高优先级任务能够及时得到执行。

占空比如何设置?PWM 一般设置为多少 Hz?

占空比的设置取决于具体的应用需求和控制对象。

在 PWM(脉冲宽度调制)信号中,占空比是指高电平持续时间与整个周期时间的比值。例如,一个 PWM 周期是 10ms,高电平持续时间是 3ms,那么占空比就是 30%。

如果是用于控制电机的转速,占空比的设置通常和电机的速度要求有关。以直流电机为例,一般来说,占空比越高,电机两端的平均电压越高,电机转速就越快。假设电机在占空比为 100%(即 PWM 信号一直为高电平)时达到最大转速,若要电机以一半的最大转速运行,那么可以将占空比设置为 50%。

在 LED 调光应用中,占空比决定了 LED 的亮度。占空比越高,LED 越亮。如果要实现不同的亮度级别,可以根据所需的亮度线性地调整占空比。例如,要实现 10 个亮度级别,可以将占空比从 10% 逐步增加到 100%,以 10% 为一个间隔进行设置。

对于 PWM 的频率,也需要根据应用来选择。

在电机控制中,PWM 频率一般在 10kHz - 20kHz 之间。如果频率太低,电机可能会出现明显的抖动或者噪音。因为在每个 PWM 周期内,电机的电枢电流会有明显的波动,当频率较低时,这种波动就会导致电机运行不平稳。较高的频率可以使电机运行得更平稳,但也会增加控制器的负担,因为需要更快地更新 PWM 信号。

在音频领域,PWM 频率的选择更为复杂。如果是用于简单的音频信号调制,PWM 频率可能需要高于音频信号最高频率的两倍,这是为了满足奈奎斯特采样定理,避免信号失真。例如,对于最高频率为 20kHz 的音频信号,PWM 频率可能需要设置为 40kHz 以上。

在 LED 控制等对频率要求不是特别高的应用中,PWM 频率可以相对较低。比如可以设置在 100Hz - 1kHz 之间,这样既能实现有效的亮度控制,又不会对系统资源造成太大的负担。因为 LED 对电流变化的响应速度相对较慢,不需要像电机控制那样高的频率来保证平稳的性能。

PCB 板上每个位置都是什么,各自的功能是什么?

PCB(印刷电路板)上有多个不同的区域和元件位置,每个部分都有其独特的功能。

首先是元件放置区域。在这个区域放置各种电子元件,如芯片(IC)、电阻、电容、电感等。芯片是整个电路的核心部分,它包含了各种功能模块,例如微处理器芯片可以执行程序代码,实现各种控制和运算功能;通信芯片可以实现数据的发送和接收,如以太网芯片用于网络通信,蓝牙芯片用于短距离无线通信等。电阻主要用于限流和分压。例如,在一个简单的 LED 电路中,通过串联一个电阻来限制流过 LED 的电流,防止 LED 因电流过大而损坏;在一个电压分压电路中,电阻可以按照一定的比例将输入电压进行分压,以得到所需的电压信号。电容用于滤波、去耦和储能等功能,前面已经详细介绍过。电感则主要用于滤波和储能,在开关电源中,电感与电容配合构成滤波电路,滤除电源中的纹波;在一些储能电路中,电感可以存储磁场能量。

其次是布线区域。布线是将各个元件的引脚按照电路设计要求连接起来的线路。信号线用于传输各种信号,如数字信号、模拟信号等。数字信号线传输的是高低电平的数字脉冲,用于在芯片之间、芯片与其他元件之间传递数字信息,如数据、地址、控制信号等。模拟信号线则用于传输连续变化的模拟信号,如音频信号、传感器采集的模拟电压或电流信号等。电源线用于为元件提供电源,它将电源输入接口与各个需要电源的元件连接起来,确保元件能够正常工作。地线是电路中的参考电位点,它为信号提供了一个稳定的参考电平,同时也用于将电流引回电源的负极,保证电路的正常回路。在布线时,要注意信号线之间的间距,避免信号之间的干扰,特别是高频信号线,要采取适当的措施,如差分布线、屏蔽等。

还有一些特殊的区域和接口。例如,PCB 板上可能会有各种接口,包括电源接口,用于连接外部电源,如直流电源插头或者交流 - 直流转换模块的接口;通信接口,像 USB 接口用于连接 USB 设备进行数据传输,UART 接口用于串行通信,SPI 接口用于与 SPI 设备通信等;还有传感器接口,用于连接各种外部传感器,如温度传感器、压力传感器等,将传感器采集到的信号引入 PCB 板内的电路进行处理。另外,PCB 板上可能会有测试点,这些测试点主要是为了在电路调试和测试过程中方便工程师使用测试仪器(如示波器、万用表等)来测量电路中的信号、电压、电流等参数,以便快速定位电路故障和验证电路性能。

PWM 输出是用什么电压控制的?

PWM(脉冲宽度调制)输出的控制电压主要与电源电压以及控制信号的逻辑电平相关。

在一个基本的 PWM 输出电路中,输出信号的高电平和低电平是由电源电压决定的。例如,在一个由微控制器产生 PWM 输出的系统中,如果微控制器的电源电压是 3.3V,那么 PWM 输出信号的高电平通常接近 3.3V,低电平接近 0V。这个电源电压为 PWM 信号提供了电压幅值的基准。

从控制的角度来看,PWM 的占空比(高电平时间与周期时间的比值)是通过内部的计数器和比较器来控制的。以一个简单的定时器模块产生 PWM 为例,定时器有一个计数器,它会按照一定的时钟频率进行计数。同时,有一个比较寄存器,当计数器的值小于比较寄存器中的值时,PWM 输出为高电平;当计数器的值大于等于比较寄存器中的值时,PWM 输出为低电平。通过改变比较寄存器中的值,就可以改变 PWM 的占空比。

在一些更复杂的电路中,可能会有外部的控制信号来间接影响 PWM 输出。比如,有一个外部的模拟电压信号,通过模数转换器(ADC)转换为数字信号后,作为参考信号来调整 PWM 的占空比。或者有一个数字通信接口接收外部的控制指令,这些指令经过微控制器的处理后,改变 PWM 模块中的参数,从而控制 PWM 输出。

另外,在功率放大电路中,PWM 信号可能会经过功率放大器来驱动负载。此时,功率放大器的电源电压会影响最终输出到负载上的电压。例如,在一个电机驱动电路中,PWM 信号经过功率放大器放大后,输出到电机两端的电压幅值取决于功率放大器的电源电压和 PWM 信号的占空比。如果功率放大器的电源电压是 12V,PWM 占空比为 50%,那么电机两端的平均电压大约是 6V。不过,实际情况还会受到功率放大器的效率、电机的内阻等因素的影响。

而且,在一些需要电平转换的应用中,PWM 输出可能会经过电平转换电路。例如,微控制器输出的 3.3V 的 PWM 信号,要驱动一个需要 5V 逻辑电平的设备,就需要使用电平转换电路。这个电路会根据自身的转换规则,将 3.3V 的 PWM 信号转换为 5V 的 PWM 信号,此时,控制 PWM 输出的电压就变成了 5V,但其占空比等特性可以保持不变或者按照一定的转换规则进行调整。

单线雷达和多线雷达的区别是什么?

单线雷达和多线雷达在结构、功能和应用场景等方面都存在诸多区别。

从结构上看,单线雷达只有一个发射天线和一个接收天线,它每次只能发射一束雷达波,并接收这束波反射回来的信号。这使得它的结构相对简单,体积较小,成本也较低。例如,一些简单的距离检测传感器就采用单线雷达的结构,它可以很方便地安装在小型设备上,如智能垃圾桶的开盖感应装置,通过检测物体与传感器的距离来控制垃圾桶盖的开启和关闭。

多线雷达则有多个发射天线和接收天线,能够同时发射多束雷达波并接收它们的反射信号。这些天线在垂直方向上有一定的分布,一般来说,线数越多,垂直方向的分辨率越高。例如,常见的 16 线雷达,它在垂直方向上可以形成 16 个不同角度的扫描波束,这样可以获取更丰富的环境信息。多线雷达的结构相对复杂,内部包含多个射频通道和信号处理单元,用于处理不同天线发射和接收的信号,因此其体积较大,成本也比较高。

在功能方面,单线雷达主要用于测量目标物体与雷达之间的距离。它通过发射雷达波并计算反射波的时间延迟,根据雷达波的传播速度(光速)来计算距离。其角度检测范围相对较窄,通常只能提供一个平面内的距离信息。多线雷达不仅可以测量距离,还可以获取目标物体的高度信息。由于它能够在垂直方向上进行多波束扫描,所以可以构建出目标物体的三维轮廓信息。例如,在自动驾驶汽车中,多线雷达可以扫描车辆周围的环境,获取道路、其他车辆、行人等物体的三维位置信息,为车辆的自动驾驶决策提供更全面的数据支持。

在应用场景上,单线雷达适用于一些对环境感知要求不高、只需要简单距离检测的场合。如在一些简单的工业自动化设备中,用于检测物料的位置,判断物料是否到达指定位置,以便进行下一步的操作,像自动包装机中检测产品是否到位。多线雷达主要应用于对环境感知要求较高的领域,特别是需要构建三维环境模型的场景。在智能交通领域,除了自动驾驶汽车外,还用于交通流量监测系统。它可以安装在道路上方或者路边的基础设施上,对道路上的车辆进行三维扫描,获取车辆的类型、速度、行驶轨迹等信息,从而实现对交通流量的精确统计和交通事件的监测。

UART 协议的详细说明,包括总线的数量、每根线的作用以及哪些线可以不用接。

UART(通用异步收发器)是一种广泛应用于嵌入式系统中的串行通信协议。

UART 通信一般需要两根线,分别是发送线(TX)和接收线(RX)。发送线用于从发送设备(如微控制器)向接收设备(如另一个微控制器或者上位机)发送数据。数据是以字节为单位,按照一定的波特率(每秒传输的位数)在 TX 线上串行发送。例如,当发送设备要发送字符 'A'(ASCII 码为 0x41),它会将这个字节按照先低位后高位的顺序(假设是小端序),逐位发送到 TX 线上。波特率可以根据实际应用进行设置,常见的波特率有 9600bps、115200bps 等。

接收线用于接收从对方设备发送过来的数据。接收设备会在 RX 线上检测到起始位(一般是低电平)后,开始按照波特率接收数据位,然后根据校验位(可选)来验证数据的正确性,最后接收停止位(一般是高电平)。例如,当接收设备在 RX 线上检测到起始位后,会以设置好的波特率为时钟,逐位读取数据,直到读取完一个字节的数据和停止位。

除了 TX 和 RX 这两根主要的线之外,UART 还可以有其他的辅助线。其中,地线(GND)是非常重要的一根线,它为通信提供了一个公共的参考电平。在实际的通信系统中,发送设备和接收设备的 TX 和 RX 线必须连接正确,并且它们的 GND 线也要连接在一起,这样才能保证信号的正确传输。因为如果没有共同的参考电平,信号的高低电平判断就会出现错误,导致通信失败。

另外,还有一些可选的线,如流控制相关的线。在一些高速通信或者对数据缓冲要求较高的应用中,会使用流控制信号。其中包括请求发送(RTS)线和清除发送(CTS)线。请求发送线用于发送设备向接收设备请求发送数据的权限。当发送设备的发送缓冲区快满时,它会拉低 RTS 线,告诉接收设备自己可能无法继续发送数据。接收设备收到 RTS 信号后,如果自己的接收缓冲区还有足够的空间,就会拉高 CTS 线,表示允许发送设备继续发送数据。不过,在很多简单的 UART 通信场景中,比如设备之间的数据传输速率较低,且数据量不大的情况下,RTS 和 CTS 线可以不接。这样可以简化电路连接,但需要确保发送和接收设备能够正确处理数据的发送和接收,避免数据丢失或者缓冲区溢出的情况。

UART 协议通常使用什么接口进行包装?

UART 协议常使用多种接口进行包装,以适应不同的应用场景和物理连接要求。

一种常见的是 DB9 接口。DB9 接口有 9 个引脚,在 UART 通信中,通常会用到其中的 2 - 3 个引脚。其中引脚 2 用于接收数据(RXD),引脚 3 用于发送数据(TXD),引脚 5 是接地(GND)。这种接口在早期的计算机串行通信中广泛应用,比如计算机与外部的调制解调器进行通信时,就会通过 DB9 接口利用 UART 协议传输数据。它的优点是连接比较稳固,有明确的引脚定义和标准,在工业控制等领域用于连接设备进行简单的配置或者数据传输也很方便。

USB 转 UART 接口也是常用的一种。在现代的电子设备中,很多设备都带有 USB 接口。通过 USB 转 UART 芯片,可以将 UART 协议的数据转换为 USB 协议的数据格式进行传输。这样的接口便于和计算机等带有 USB 接口的设备进行连接。例如,在开发嵌入式设备时,我们可以使用 USB 转 UART 模块将嵌入式设备的 UART 接口连接到计算机的 USB 端口,从而在计算机上使用终端软件来对嵌入式设备进行调试、烧录程序或者接收设备发送的数据。这种接口的优势在于利用了 USB 接口的普遍性和高速传输特性,能够方便地实现设备与主机之间的数据交互。

还有一些无线接口可以对 UART 协议进行包装,比如蓝牙模块。蓝牙模块内部会将 UART 协议的数据转换为蓝牙信号进行无线传输。在智能家居设备中,很多传感器或者控制器可能内部使用 UART 进行数据通信,通过添加蓝牙模块,就可以将这些设备的数据无线传输到手机或者其他智能设备上。例如,一个带有温度传感器的设备,其内部通过 UART 将温度数据传输给蓝牙模块,蓝牙模块将数据发送出去,手机通过蓝牙接收数据后就可以进行显示或者进一步的处理。这种包装方式使得 UART 协议能够跨越物理连接的限制,实现更灵活的通信。

RS232 和 RS485 的电气特性有何不同?它们的差分电平是多少,分别对应什么逻辑电平?

RS232 和 RS485 是两种不同的串行通信标准,它们的电气特性有明显的区别。

从电压范围来看,RS232 的信号电平较高。它的逻辑 0 电平规定为 + 3V 到 +15V 之间,逻辑 1 电平规定为 - 3V 到 - 15V 之间。这种较高的电压范围使得 RS232 信号具有较强的抗干扰能力,但同时也意味着它在传输过程中消耗的功率相对较大。而且,由于其电平范围与常见的数字逻辑电平(如 TTL 电平)不兼容,所以在与其他设备连接时,往往需要进行电平转换。例如,当计算机的 COM 口(采用 RS232 标准)与微控制器进行通信时,如果微控制器使用的是 TTL 电平,就需要使用专门的 RS232 - TTL 电平转换芯片来确保信号能够正确传输。

RS485 的信号电平相对较低。它采用差分信号传输方式,差分电平的幅度一般为 2V 左右。在 RS485 中,当 A - B 的电压差大于 + 200mV 时,对应的逻辑电平为 1;当 A - B 的电压差小于 - 200mV 时,对应的逻辑电平为 0。这种差分信号传输方式使得 RS485 具有很强的抗干扰能力,特别是在长距离通信和噪声环境复杂的情况下表现出色。因为差分信号可以有效地抵消共模干扰,即两根传输线上同时受到的干扰信号可以相互抵消。

RS232 一般是全双工通信,它有单独的发送线(TX)和接收线(RX),可以同时进行数据的发送和接收。而 RS485 可以是半双工通信,它通过一对双绞线(A 线和 B 线)来传输信号,同一时刻要么处于发送状态,要么处于接收状态。这是由于 RS485 的通信线路在物理上是共享的,通过控制信号的方向来实现发送和接收的切换。

在传输距离方面,RS232 的传输距离相对较短,一般建议不超过 15 米。这是因为其高电平信号在长距离传输时容易受到衰减和干扰,而且信号的波特率越高,传输距离越短。RS485 的传输距离则可以达到较长的距离,在合适的波特率和电缆质量下,传输距离可以达到 1200 米左右。这使得 RS485 非常适合于工业现场等长距离通信的场景,如工厂自动化中的设备间通信、远程数据采集等。

IIC 通信协议的运行方式是什么?从机地址和主机地址是如何配置的?

IIC(Inter - Integrated Circuit)通信协议是一种同步、半双工的串行通信协议。

在运行方式上,IIC 总线上有一个或多个主机和多个从机。通信是由主机发起的,主机通过产生起始条件来启动一次通信。起始条件是在时钟线(SCL)为高电平时,数据线(SDA)从高电平变为低电平。之后,主机发送从机地址,这个地址是 7 位或者 10 位(在不同的应用场景下),用于在总线上唯一标识一个从机。从机在检测到自己的地址后,会发送一个应答信号(ACK)给主机,表示已经接收到地址并且准备好接收或发送数据。

当主机要向从机发送数据时,它会在发送完从机地址后接着发送数据字节。每个数据字节是 8 位,按照高位在前、低位在后的顺序发送。在发送完每个字节后,从机会发送一个 ACK 信号来表示已正确接收数据。如果从机因为某些原因(如缓冲区满等)无法接收数据,就会发送一个非应答信号(NACK),这时主机可以根据情况决定是停止发送还是重新尝试发送。在数据传输完成后,主机产生停止条件,即当 SCL 为高电平时,SDA 从低电平变为高电平,结束这次通信。

从机地址的配置是由从机设备本身决定的。在设计从机设备时,会给它分配一个唯一的 7 位或 10 位地址。这个地址通常是由芯片制造商在芯片设计阶段确定的,可以通过硬件引脚的连接或者内部的寄存器设置来进行调整。例如,一些 IIC 从机芯片有专门的地址引脚,通过将这些引脚连接到高电平或者低电平,可以改变芯片的地址。还有一些芯片可以通过内部的寄存器来设置地址,在芯片初始化阶段,主机可以通过特定的命令序列来设置从机的地址。

主机地址在 IIC 协议中一般没有像从机地址那样严格的定义。因为在一个 IIC 总线系统中,主机是主动发起通信的一方,它主要是通过发送从机地址来控制通信过程。不过,在一些复杂的多主机系统中,每个主机可能会有自己的标识方式,这可能涉及到更复杂的协议和硬件设计,比如通过额外的仲裁机制来确定哪个主机能够获得总线的控制权,此时可能会用到主机的标识信息,但这不是 IIC 基本协议所规定的主机地址的概念。

如何在嵌入式系统中实现 SPI 通信协议?SPI 在电路上是如何实现通信的?

在嵌入式系统中实现 SPI 通信协议,首先需要有硬件支持。一般微控制器内部会集成 SPI 控制器,它提供了 SPI 通信所需的基本功能。

从软件角度来看,需要进行一系列的初始化设置。包括设置 SPI 的工作模式,SPI 有四种工作模式(0、1、2、3),这些模式主要是根据时钟极性(CPOL)和时钟相位(CPHA)来区分的。CPOL 决定了时钟信号(SCK)在空闲状态时是高电平还是低电平,CPHA 决定了数据是在时钟的上升沿还是下降沿进行采样。例如,在模式 0 下,CPOL 为 0(时钟空闲时为低电平),CPHA 为 0(数据在时钟上升沿采样)。还需要设置 SPI 的波特率,波特率决定了数据传输的速度,它是通过配置 SPI 控制器内部的时钟分频器来实现的。例如,若系统时钟为 10MHz,要设置 SPI 波特率为 2.5MHz,则需要将时钟分频为 4。

在电路实现方面,SPI 通信通常需要至少四根线。其中包括主设备输出 - 从设备输入线(MOSI),主设备通过这条线将数据发送给从设备。主设备输入 - 从设备输出线(MISO),从设备通过这条线将数据发送给主设备。时钟线(SCK),由主设备产生,用于同步主从设备之间的数据传输。还有一条片选线(CS),主设备通过拉低或拉高这条线来选择要与之通信的从设备。当主设备要与某个从设备通信时,它会先拉低该从设备的 CS 线,然后在 SCK 线上产生时钟信号,同时在 MOSI 线上发送数据,从设备在 SCK 的控制下,在 MISO 线上将数据发送给主设备。

例如,在一个嵌入式系统中,主设备是微控制器,从设备是 SPI 接口的外部传感器。当需要读取传感器的数据时,微控制器先拉低传感器对应的 CS 线,然后按照设置好的 SPI 模式和波特率,在 SCK 线上发送时钟脉冲,同时在 MOSI 线上发送读取命令(如果需要),传感器在接收到命令后,会在 MISO 线上将数据发送给微控制器,微控制器在每个时钟脉冲的适当边沿(由 SPI 模式决定)接收数据,从而完成一次数据读取过程。

SPI 通信还可以支持多个从设备。在这种情况下,每个从设备都有自己独立的 CS 线,主设备通过控制不同的 CS 线来选择与不同的从设备进行通信,这样可以在一个 SPI 总线上连接多个不同功能的从设备,如 SPI 接口的闪存、ADC、DAC 等,实现多种数据的交互和处理。

I2C 读数据的信号流是什么样的?

在 I2C 协议中,读数据的信号流是一个较为复杂但有序的过程。

首先,主设备会发起起始条件,这是通过将数据线(SDA)在时钟线(SCL)为高电平时从高电平拉到低电平来实现的。起始条件标志着一次 I2C 通信的开始。

接着,主设备发送从机地址。从机地址是 7 位或者 10 位(这里以 7 位为例),主设备在 SDA 线上按照高位在前、低位在后的顺序发送从机地址,同时在 SCL 线上发送时钟脉冲来同步数据传输。发送完 7 位地址后,主设备还会发送一位读写位,对于读操作,这一位是 1。

然后,从机在检测到自己的地址并且读写位为 1 时,会发送一个应答信号(ACK)。应答信号是在主设备发送完地址和读写位后的第 9 个时钟脉冲期间,从机将 SDA 线拉低来表示应答。

之后,主设备开始接收数据。从机按照高位在前、低位在后的顺序在 SDA 线上发送数据字节,主设备在 SCL 线的每个时钟脉冲上升沿(根据 I2C 协议规定的采样时刻)采样 SDA 线上的数据。每接收完一个字节,主设备会发送一个 ACK 信号(如果主设备希望继续接收数据)或者 NACK 信号(如果主设备希望停止接收数据)。ACK 信号是主设备将 SDA 线拉低,NACK 信号是主设备保持 SDA 线为高电平。

当主设备接收完所有需要的数据后,会发起停止条件。停止条件是在 SCL 为高电平时,主设备将 SDA 从低电平拉到高电平。这样就完成了一次 I2C 读数据的过程。

例如,假设主设备是微控制器,从机是一个 I2C 接口的 EEPROM。微控制器想要读取 EEPROM 中的数据,首先发起起始条件,然后发送 EEPROM 的地址和读操作位。EEPROM 应答后,开始发送存储的数据,微控制器按照上述的时钟和数据采样规则接收数据,在接收过程中通过 ACK 或 NACK 信号来控制数据传输的继续或停止,最后发起停止条件结束通信。在整个过程中,时钟信号 SCL 起到了严格的数据同步作用,确保主从设备之间数据传输的准确性。

项目中使用的蓝牙模块型号是什么?

这个问题的答案取决于具体的项目。不同的蓝牙模块型号具有不同的特点和适用场景。

例如,HC - 05 是一种常用的蓝牙模块。它是一种主从一体的蓝牙串口模块,工作在蓝牙 2.0 + EDR(Enhanced Data Rate)标准下。其优势在于成本较低,容易实现与各种微控制器的连接,通过简单的串口通信(如 UART)就可以进行数据传输。在一些简单的物联网设备开发项目中,如智能温湿度传感器与手机的通信,HC - 05 可以很好地发挥作用。它可以将传感器采集到的数据发送给手机 APP 进行显示和分析。而且,它的通信距离在开阔环境下可达 10 米左右,基本满足小型设备近距离通信的需求。

还有 HC - 06 蓝牙模块,它是从模块,主要用于接收数据。该模块也通过 UART 接口与微控制器相连,同样具有成本低的优点。在一些只需要单向传输数据的项目中比较适用,比如将嵌入式设备的数据发送到具有蓝牙功能的上位机进行数据处理。

如果是对蓝牙功能要求更高的项目,可能会使用 BLE(低功耗蓝牙)模块,如 CC2540/CC2541。这些模块支持蓝牙 4.0 及以上标准,具有低功耗的特点。在可穿戴设备、智能家居设备等对功耗要求严格的项目中应用广泛。以智能手环为例,CC2540/CC2541 可以实现手环与手机之间的低功耗通信,如传输运动数据、心率数据等。它们能够在保持连接的同时,最大程度地降低设备的耗电量,延长设备的电池续航时间。而且,这类模块还支持更多的蓝牙配置文件,能够实现更复杂的功能,如蓝牙连接的安全性更高,可以进行设备配对和身份验证等操作。

项目用的是哪种轮子?差速小车和阿克曼小车有什么区别?

关于项目中使用的轮子类型,这会因项目需求而异。轮子可能是普通的橡胶轮、聚氨酯轮或者金属轮等。

橡胶轮有良好的弹性和摩擦力,适用于多种地面,如室内的瓷砖地面、室外的柏油马路等,能够提供较好的抓地力,在需要稳定行驶的项目中比较常用。聚氨酯轮硬度稍高,耐磨性好,常用于需要精确运动控制的场合。金属轮则具有较高的强度,一般在需要承受较大重量或者在恶劣环境下使用。

差速小车和阿克曼小车在结构和运动方式上有很大的区别。

差速小车主要由两个驱动轮和一个或多个万向轮组成。两个驱动轮分别由独立的电机驱动,通过控制两个电机的转速差来实现转向。例如,当小车要向左转时,左轮电机减速或者反转,右轮电机保持原来的速度或者加速,这样小车就可以以不同的半径转弯。这种小车的优点是结构简单,控制方便,在空间比较狭窄的环境下灵活性较高。它适用于一些对转向精度要求不是特别高的场合,比如在小型仓库中进行货物搬运的自动导引车(AGV),主要是在相对简单的路径规划下进行直线行驶和简单的转弯操作。

阿克曼小车的结构更复杂,它的转向方式类似于汽车。它有四个轮子,前轮为转向轮,后轮为驱动轮(也有四驱的情况)。在转向时,前轮的转向角度是根据阿克曼几何原理设计的,即内外轮的转向角度不同,以保证车辆在转弯时所有轮子都能绕着同一个瞬时中心旋转,从而减少轮胎的磨损和提高车辆的稳定性。阿克曼小车在高速行驶和需要精准转向的场景下表现出色。比如在自动驾驶的赛车模型或者一些户外的高精度巡检机器人项目中,阿克曼小车能够以较高的速度稳定地行驶在规定的路径上,并且能够实现精确的转向控制。

DSP 和 ARM 处理器的主要区别是什么?

DSP(数字信号处理器)和 ARM 处理器在设计目的、架构和应用场景等方面存在诸多主要区别。

从设计目的来讲,DSP 主要是为了高效地处理数字信号,如音频、视频信号的滤波、调制、解调等。它专注于数字信号处理算法的快速执行,能够在短时间内完成大量的乘法 - 累加(MAC)运算。例如,在音频处理中,DSP 可以快速地对声音信号进行傅里叶变换,以实现声音的均衡、降噪等功能。ARM 处理器则是一种通用的微处理器,其设计目的是为了运行各种不同类型的软件,包括操作系统、应用程序等。它可以处理多种任务,如控制外部设备、进行数据通信、运行用户界面等。

在架构方面,DSP 通常具有专门的硬件乘法器和累加器,并且其数据通路和指令集是针对数字信号处理算法进行优化的。例如,DSP 的指令集可能包括专门用于 FFT(快速傅里叶变换)运算的指令,能够高效地利用硬件资源进行信号处理。ARM 处理器的架构更侧重于通用计算,它具有多级流水线结构,能够提高指令的执行效率。其指令集相对比较丰富,涵盖了数据处理、存储访问、分支跳转等多种类型的指令,以满足不同类型软件的运行需求。

在应用场景上,DSP 广泛应用于信号处理领域。在通信系统中,DSP 用于调制解调器的设计,实现信号的编码、解码和调制、解调。在音频和视频设备中,如数字音频播放器、高清电视等,DSP 用于音频和视频信号的处理和增强。ARM 处理器则应用于各种嵌入式系统和移动设备中。在智能手机中,ARM 处理器运行操作系统、各种应用程序和处理用户交互等任务。在工业控制领域,ARM 处理器用于控制工业机器人、自动化生产线等设备,通过运行控制软件和处理传感器数据来实现设备的自动化操作。

介绍一下 CAN 和 RS485 通信协议的特点和应用场景。

CAN(Controller Area Network)通信协议是一种多主站的串行通信协议,具有以下特点。

在可靠性方面,CAN 协议采用了差分信号传输方式,具有很强的抗干扰能力。它通过两根线(CAN_H 和 CAN_L)进行通信,两根线之间的差分信号可以有效抵御外界的电磁干扰。并且,CAN 协议具有完善的错误检测和处理机制。它能够检测出多种错误类型,如位错误、填充错误、CRC 错误等。当检测到错误时,会自动采取措施进行错误处理,如重发数据帧,这保证了数据传输的可靠性。

在通信效率上,CAN 协议支持多主站通信,多个节点可以同时向总线发送数据。它采用了非破坏性仲裁机制,当多个节点同时发送数据时,通过比较标识符来决定哪个节点的数据帧能够优先发送。这种仲裁机制可以确保高优先级的数据能够及时传输,提高了通信的实时性。CAN 协议的数据传输速率较高,最高可达 1Mbps,能够满足一些对数据传输速度要求较高的应用场景。

在应用场景方面,CAN 协议主要应用于汽车电子领域。在汽车内部,各种电子控制单元(ECU)之间通过 CAN 总线进行通信,如发动机控制单元、变速箱控制单元、车身控制单元等。这些 ECU 之间需要快速、可靠地交换数据,以实现汽车的各种功能,如发动机的控制、车辆的稳定系统、仪表盘的显示等。CAN 协议还应用于工业自动化领域,特别是一些对可靠性和实时性要求较高的场合,如机器人控制系统、电梯控制系统等。

RS485 通信协议也是一种串行通信协议,它具有自己的特点。

从电气特性来看,RS485 采用差分信号传输,差分电平幅度一般为 2V 左右,抗干扰能力强。它可以在长距离通信和噪声环境复杂的情况下稳定工作。RS485 是一种半双工通信协议,通过一对双绞线(A 线和 B 线)进行通信,同一时刻只能进行发送或者接收操作。

在应用场景方面,RS485 协议广泛应用于工业现场的长距离通信。在工厂自动化中,它可以用于连接各种工业设备,如 PLC(可编程逻辑控制器)与传感器、执行器之间的通信。例如,多个温度传感器可以通过 RS485 总线将采集到的温度数据发送给 PLC 进行集中处理,PLC 也可以通过 RS485 总线控制电机等执行器的动作。由于其传输距离长,在一些分布式的工业控制系统中非常实用。

UTF - 8 编码的原理是什么?

UTF - 8(8 - bit Unicode Transformation Format)是一种可变长度的 Unicode 编码方式。

其原理是基于字节来表示 Unicode 字符。对于 ASCII 码字符,UTF - 8 编码与 ASCII 码完全兼容。ASCII 码字符只占用一个字节,其编码范围是 0 - 127,在 UTF - 8 中,这些字符的编码方式保持不变。例如,字符 'A' 的 ASCII 码是 65,其 UTF - 8 编码也是 65,用二进制表示为 01000001。

对于其他 Unicode 字符,UTF - 8 会根据字符的 Unicode 码点值来确定编码的字节数。Unicode 码点值范围在 0x0080 - 0x07FF 之间的字符,UTF - 8 用两个字节来表示。编码的第一个字节的前几位是 110,后面跟着字符 Unicode 码点值的高 5 位;第二个字节的前几位是 10,后面跟着字符 Unicode 码点值的低 6 位。

例如,对于码点值为 0x0416(西里尔字母Ж)的字符,其 UTF - 8 编码的计算过程如下:先将码点值转换为二进制 010000010110,然后将其分为高 5 位 01000 和低 6 位 000110。第一个字节是 110 开头,后面跟上高 5 位,即 11001000;第二个字节是 10 开头,后面跟上低 6 位,即 10000110。

对于 Unicode 码点值在 0x0800 - 0xFFFF 之间的字符,UTF - 8 用三个字节来表示。第一个字节的前几位是 1110,后面跟着字符 Unicode 码点值的高 4 位;第二个字节的前几位是 10,后面跟着中间 6 位;第三个字节的前几位是 10,后面跟着低 6 位。

UTF - 8 这种可变长度的编码方式有效地节省了存储空间。因为在实际的文本数据中,ASCII 码字符和一些常用的低码点值 Unicode 字符出现的频率较高,通过使用较短的编码来表示这些字符,可以在不丢失信息的情况下减少数据的存储量和传输量。同时,UTF - 8 编码的兼容性也很好,它可以在各种系统和软件中方便地进行处理,无论是处理英文文本还是各种其他语言的文本,都能够很好地适应。

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

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

相关文章

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…

XXE练习

pikachu-XXE靶场 1.POC:攻击测试 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe "a">]> <foo>&xxe;</foo> 2.EXP:查看文件 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SY…

Leetcode打卡:形成目标字符串需要的最少字符串数II

执行结果&#xff1a;通过 题目&#xff1a;3292 形成目标字符串需要的最少字符串数II 给你一个字符串数组 words 和一个字符串 target。 如果字符串 x 是 words 中 任意 字符串的 前缀 &#xff0c;则认为 x 是一个 有效 字符串。 现计划通过 连接 有效字符串形成 targ…

【蓝桥杯】49362.《视频相关度计算》

视频相关性计算 问题描述 小蓝作为异世界最大流媒体网站 LanTube 的高级算法工程师&#xff0c;他想要实现更加精准的视频推荐服务来满足用户的喜好。 其中&#xff0c;**“视频的相关性”**是一个重要指标&#xff0c;它代表了两个视频 A 到 B 的关联程度&#xff0c;记作 f…

ASP.NET|日常开发中数据集合详解

ASP.NET&#xff5c;日常开发中数据集合详解 前言一、数组&#xff08;Array&#xff09;1.1 定义和基本概念1.2 数组的操作 二、列表&#xff08;List<T>&#xff09;2.1 特点和优势2.2 常用操作 三、字典&#xff08;Dictionary<K, V>&#xff09;3.1 概念和用途…

如何将多张图片合并为一个pdf?多张图片合并成一个PDF文件的方法

如何将多张图片合并为一个pdf&#xff1f;当我们需要将多张图片合并为一个PDF文件时&#xff0c;通常是因为我们希望将这些图片整理成一个统一的文档&#xff0c;方便查看、分享或打印。无论是工作中需要提交的报告、学生们需要整理的作业&#xff0c;还是个人收藏的照片、旅行…

【html网页页面013】html+css制作节日主题圣诞节网页含视频、留言表单(独创首发-5页面附效果及源码)

节日主题圣诞节网页制作 &#x1f964;1、写在前面&#x1f367;2、涉及知识&#x1f333;3、网页效果完整效果(5页)&#xff1a;代码目录结构&#xff1a;page1、首页page2、庆祝page3、影响page4、起源page5、留言板 &#x1f308;4、网页源码4.1 html4.2 CSS4.3 源码获取圣诞…

直播预告 | 蓝卓生态说,解锁supOS在化工领域的无限可能

生态是蓝卓生命力的体现&#xff0c;为全方位赋能生态伙伴使用supOS并从中获益&#xff0c;蓝卓打造生态说系列栏目&#xff0c;通过生态沙龙、直播对话、案例剖析、产品解读等&#xff0c;持续展现“12N”的智能工厂创新路径&#xff0c;加速推进工业数字化转型。 嘉宾介绍 朱…

java对子网掩码的转换

一般的子网掩码展示为点分十进制形式&#xff0c;如&#xff1a;255.255.255.0&#xff0c;但有时因为业务需要&#xff0c;我们需要转换成对应的数字&#xff0c;以及数字转成点分十进制&#xff0c;所以整理了java的方法可以进行两者的互相转换 1、点分十进制转数字 public…

亚马逊-用表格创建多变体商品

引言 当我们使用“月亮树选品软件”找到一款不错的产品时&#xff0c;我们会延续这个产品的优点&#xff0c;并对其进行改良。改良之后&#xff0c;我们需要将产品上架到亚马逊平台&#xff0c;以测试这个产品的市场表现。然而&#xff0c;许多亚马逊卖家觉得上传多变体商品这…

使用C#在目录层次结构中搜索文件以查找目标字符串

例程以递归方式搜索目录层次结构中的文件以查找目标字符串。它可以搜索几乎任何类型的文件&#xff0c;即使它不包含 Windows 理解的文本。例如&#xff0c;它可以搜索 DLL 和可执行文件以查看它们是否恰好包含字符串。 下面的代码中显示的ListFiles 方法完成了大部分工作。 …

【深度学习总结】使用PDF构建RAG:结合Langchain和通义千问

【深度学习总结】使用PDF构建RAG&#xff1a;结合Langchain和通义千问 使用平台&#xff1a;趋动云&#xff0c;注册送算力 前言 在大型语言模型&#xff08;LLMs&#xff09;应用领域&#xff0c;我们面临着大量挑战&#xff0c;从特定领域知识的匮乏到信息准确性的窘境&am…

P8772 [蓝桥杯 2022 省 A] 求和

题目描述&#xff1a; 解题思路&#xff1a; 首先这题我们可以直接用两个for循环嵌套来控制两个变量来求值&#xff0c;但是这样做时间复杂度高。这里我们用到了一个前缀和差的方法。通过for循环变量第一个变量&#xff0c;用和差的方法的到第二个量&#xff0c;这样就只用了一…

Flux Tools 结构简析

Flux Tools 结构简析 BFL 这次一共发布了 Canny、Depth、Redux、Fill 四个 Tools 模型系列&#xff0c;分别对应我们熟悉的 ControlNets、Image Variation&#xff08;IP Adapter&#xff09;和 Inpainting 三种图片条件控制方法。虽然实现功能是相同的&#xff0c;但是其具体…

什么是芯片电阻

有人把Chip Resistor翻译成“芯片电阻”&#xff0c;我觉得翻译成“贴片电阻”或“片状电阻”更合适。有些厂商也称之为”电阻片”&#xff0c;英文写作Resistor Chip。比如&#xff1a;Thick film resistor chips&#xff08;厚膜电阻片&#xff09;、Thin film resistor chip…

【Linux】深入理解进程信号机制:信号的产生、捕获与阻塞

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 时间不语&#xff0c;却回答了所有问题 目录 &#x1f4da;前言 &#x1f4da;一、信号的本质 &#x1f4d6;1.异步通信 &#x1f4d6;2.信…

模具生产过程中的标签使用流程图

①NFC芯片嵌入周转筐&#xff0c;通过读卡器读取CK_Label_v3的数据&#xff0c;并将这些信息上传至服务器进行存储&#xff1b; ②服务器随后与客户的WMS&#xff08;仓库管理系统&#xff09;进行交互&#xff0c;记录和同步注塑机的原始数据&#xff1b; ③当周转筐内的模具…

【AIGC安全】CCF-CV企业交流会直播回顾:探寻AI安全治理,共筑可信AI未来

文章目录 一、活动背景&#xff1a;AI技术快速发展与安全治理需求迫切二、论坛内容金耀辉&#xff1a;智能共生时代&#xff1a;平衡生成式AI的创新与风险何延哲&#xff1a;人工智能安全检测评估的逻辑和要点谢洪涛&#xff1a;面向特定人物深度伪造视频的主动防御与被动检测技…

Cesium 无人机航线规划(区域航线)

区域航线&#xff0c;即划定一片区域一键巡查 这里选择点几个点&#xff0c;形成的区域内计算规划航线

【SH】Ubuntu Server 24搭建Web服务器访问Python程序研发笔记

文章目录 说个问题写个方案一、安装Ubuntu Server二、安装Web服务器采用Nginx服务器 三、安装Python及依赖创建项目虚拟环境 四、安装Python Web框架采用Flask框架创建和运行Flask应用&#xff08;以后的重点&#xff09; 五、安装WSGI服务器采用Gunicorn 六、配置Nginx七、验证…