面经真题 | 芯片原厂

点赞关注收藏不迷路~~~

uart如何进行通信,模块发给uart数据信息后经历了什么

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种用于串行通信的协议,它使用一对传输线(TX和RX)进行双向通信。UART通信通过串行传输数据,数据以字节为单位进行传输。每个字节由起始位、数据位、校验位和停止位组成。

当模块向UART发送数据信息时,这些数据会经历以下过程:

  • 1、数据准备:发送模块将要发送的数据准备好,通常这些数据存储在发送缓冲区中。
  • 2、数据格式化:UART模块根据配置参数(如波特率、数据位、停止位、奇偶校验等)将待发送的数据格式化成符合UART协议的数据帧。数据帧以一个起始位开始,后面跟着数据位(通常为7或8位),然后是可选的奇偶校验位,最后以一个或多个停止位结束。
  • 3、数据发送:UART模块的发送器将格式化后的数据帧通过TX线发送出去。发送器会控制波特率发生器以设定的波特率将数据串行输出。

在接收端,UART的接收器执行以下操作:

  • 1、信号检测:接收器通过RX线实时检测输入信号,一旦检测到起始位,就知道数据准备发送,并尝试与发送器时钟频率同步。
  • 2、数据接收:接收器按照设定的波特率接收数据,并将数据存储在接收缓冲区中。
  • 3、数据校验:接收器根据数据帧中的奇偶校验位对数据进行校验,以检测数据传输中的错误。
  • 4、数据处理:如果数据校验正确,接收器将接收到的数据从串行转换成并行,并交给上层应用处理。

在整个通信过程中,UART模块还负责处理其他信号,如产生额外的信号来指示发送和接收的状态。例如,如果产生一个奇偶错误,UART会置位奇偶标志。

总的来说,UART通信过程涉及数据准备、格式化、发送、接收、校验和处理等多个步骤,确保数据的正确性和可靠性。同时,UART模块还负责处理各种信号和状态,以维持通信的顺畅进行。

pc如何连接入linux系统的,底层原理是什么

PC连接到Linux系统的底层原理主要涉及到**网络通信协议、远程访问技术和服务端配置等多个方面。**以下是具体的解释:

网络通信协议:

PC和Linux系统之间的连接是通过网络通信协议实现的。常见的协议包括TCP/IP协议族,它负责在不同设备之间传输数据。

在这个过程中,数据被拆分成数据包,通过网络中的路由器和交换机进行转发,最终到达目标Linux系统。

远程访问技术:

常见的远程访问技术有SSH(Secure Shell)和Telnet等。SSH是最常用的方式,因为它提供了加密的数据传输,保证了通信的安全性。

当PC使用SSH连接到Linux系统时,会建立一个加密的通道,通过这个通道,PC可以发送命令到Linux系统,并接收Linux系统的响应。

服务端配置:

Linux系统需要配置相应的服务来接受PC的连接请求。对于SSH连接,Linux系统需要运行SSH服务器(如OpenSSH),并监听特定的端口(默认是22端口)。 服务端还需要配置相应的认证机制,比如密码认证或密钥认证,以确保只有经过授权的用户才能访问系统。

会话管理:

一旦连接建立成功,PC和Linux系统之间会建立一个会话。这个会话会维护双方的通信状态,确保数据的正确传输。 在会话期间,PC可以发送命令给Linux系统执行,Linux系统会将执行结果发送回PC。

数据传输:

数据在PC和Linux系统之间的传输是基于底层的网络协议进行的。数据包会按照网络协议的规定进行封装和解封装,确保数据在传输过程中的完整性和安全性。

总结来说,PC连接到Linux系统的底层原理是通过网络通信协议建立连接,利用远程访问技术实现数据的加密传输和命令的执行,同时需要服务端进行相应的配置和会话管理来确保通信的顺畅进行。这些原理共同构成了PC与Linux系统之间的远程连接和交互的基础。

手撕哈希表的建立

手撕哈希表的建立主要包括以下几个步骤:

  • 确定哈希表的大小:首先,你需要确定哈希表的大小,这通常取决于你预计要存储的元素数量以及你希望的哈希表性能。哈希表的大小应该是一个质数,这样可以减少哈希冲突的可能性。

  • 设计哈希函数:哈希函数是将键(key)映射到哈希表中索引的函数。设计哈希函数时,你需要确保它能够将不同的键映射到不同的索引(理想情况),或者至少将冲突的数量最小化。常见的哈希函数包括除法取余法、平方取中法、折叠法等。

  • 初始化哈希表:创建一个数组作为哈希表的底层数据结构,数组的每个元素可以是一个链表或者其他数据结构,用于处理哈希冲突。

  • 插入元素:对于每个要插入的元素,首先使用哈希函数计算其哈希值,然后将该哈希值作为索引在哈希表中查找。如果索引处为空,则直接在该位置插入元素;如果索引处已有元素(即哈希冲突),则使用链表或其他数据结构存储这些元素。

  • 处理哈希冲突**:哈希冲突是哈希表中常见的问题,即两个不同的键通过哈希函数计算得到了相同的哈希值**。处理哈希冲突的方法有多种,如链地址法(将冲突的元素存储在同一索引处的链表中)、开放地址法(当冲突发生时,尝试在哈希表中的其他位置插入元素)等。

下面是一个简单的哈希表插入操作的伪代码示例:

python
class HashTable:  
    def __init__(self, size):  
        self.size = size  
        self.table = [[] for _ in range(size)]  # 初始化哈希表为大小为size的空链表数组  
  
    def hash_function(self, key):  
        # 这里使用简单的除法取余法作为哈希函数  
        return key % self.size  
  
    def insert(self, key, value):  
        index = self.hash_function(key)  
        for pair in self.table[index]:  # 遍历链表查找是否存在相同键  
            if pair[0] == key:  
                pair[1] = value  # 如果键已存在,更新值  
                return  
        self.table[index].append([key, value])  # 如果键不存在,添加到链表末尾

这个示例中,我们使用了除法取余法作为哈希函数,并使用链表来处理哈希冲突。

在插入元素时,我们首先计算键的哈希值,然后在对应的索引处查找是否存在相同的键。

如果存在,则更新其值;如果不存在,则将新的键值对添加到链表的末尾。

请注意,这只是一个简单的示例,实际的哈希表实现可能会更加复杂,并需要考虑更多的因素,如动态调整哈希表的大小、优化哈希函数以减少冲突等。

质数,又称素数,是指在大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。

C语言实现

#include <stdio.h>  
#include <stdlib.h>  
#include <stdbool.h>  
  
#define HASH_TABLE_SIZE 10  
#define EMPTY -1  
  
typedef struct {  
    int key;  
    int value;  
} HashTableItem;  
  
HashTableItem hashTable[HASH_TABLE_SIZE];  
  
// 哈希函数  
unsigned int hash(int key) {  
    return key % HASH_TABLE_SIZE;  
}  
  
// 插入元素到哈希表  
bool insert(int key, int value) {  
    unsigned int index = hash(key);  
    while (hashTable[index].key != EMPTY) {  
        // 如果键已经存在,则更新其值并返回  
        if (hashTable[index].key == key) {  
            hashTable[index].value = value;  
            return true;  
        }  
        // 使用线性探测找到下一个空槽  
        index = (index + 1) % HASH_TABLE_SIZE;  
        if (index == hash(key)) { // 如果回到原点,说明表已满  
            return false;  
        }  
    }  
    // 找到空槽,插入新元素  
    hashTable[index].key = key;  
    hashTable[index].value = value;  
    return true;  
}  
  
// 根据键查找值  
int lookup(int key) {  
    unsigned int index = hash(key);  
    while (hashTable[index].key != EMPTY) {  
        if (hashTable[index].key == key) {  
            return hashTable[index].value;  
        }  
        index = (index + 1) % HASH_TABLE_SIZE;  
        if (index == hash(key)) { // 如果回到原点,说明键不存在  
            return EMPTY;  
        }  
    }  
    return EMPTY; // 键不存在  
}  
  
// 初始化哈希表  
void initHashTable() {  
    for (int i = 0; i < HASH_TABLE_SIZE; i++) {  
        hashTable[i].key = EMPTY;  
        hashTable[i].value = 0;  
    }  
}  
  
int main() {  
    initHashTable();  
  
    // 插入一些元素  
    insert(10, 100);  
    insert(20, 200);  
    insert(30, 300);  
    insert(40, 400);  
  
    // 查找元素  
    printf("Value for key 20: %d\n", lookup(20));  
    printf("Value for key 50: %d\n", lookup(50)); // 应该返回 EMPTY  
  
    return 0;  
}

为什么哈希表的大小应该是一个质数,这样可以减少哈希冲突的可能性?

哈希表的大小选择质数作为底层数组的大小有助于减少哈希冲突,原因如下:

  • 均匀分布:质数在除法运算中更有可能产生均匀分布的结果。当使用除法取余法作为哈希函数时,如果哈希表的大小是质数,那么对于大多数键,其哈希值将更均匀地分布在哈希表的各个槽位中。这有助于减少由于某些键具有相同的哈希值而导致的冲突。

  • 周期性避免:非质数,特别是那些包含小因子的数(如偶数或能被小素数整除的数),。这意味着某些键的哈希值可能会以某种模式重复出现,导致冲突增加。质数由于只能被1和它

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

ARM/Linux嵌入式真题 文章被收录于专栏

让实战与真题助你offer满天飞!!! 每周更新!!! 励志做最全ARM/Linux嵌入式面试必考必会的题库。 励志讲清每一个知识点,找到每个问题最好的答案。 让你学懂,掌握,融会贯通。 因为技术知识工作中也会用到,所以踏实学习哦!!!

全部评论

相关推荐

05-15 09:54
已编辑
中山大学 前端工程师
1.&nbsp;先说一下背景&nbsp;&nbsp;&nbsp;&nbsp;19-23年,某中9遥感;23-26年,本校测绘;也算是”双非“科了&nbsp;&nbsp;&nbsp;&nbsp;大学期间基本上啥也没做,大概学了测量平差、“这个遥感”、“那个遥感”,分成很多类,实验基本都是在外面测量,组织的实习也是去野外测量(各位都在找暑期找秋招的时候,我们在扛着三脚架和经纬仪戴着草帽测数据),本科就这么过去了...&nbsp;&nbsp;&nbsp;&nbsp;后面读了个研,研究方向是“那个遥感”中的一类,用的python、传统机器学习那一套(随机森林之类的)...2.&nbsp;为什么学前端&nbsp;&nbsp;&nbsp;&nbsp;有点兴趣,相对简单好学,我的时间也决定我只能找前端了。&nbsp;&nbsp;&nbsp;&nbsp;大二那会有个课叫“地理信息系统”,实验课用WebGIS那一套,写了一个简单的网页,做了一点空间分析&nbsp;&nbsp;&nbsp;&nbsp;研一有个课叫“三维信息可视化”,主要讲摄影测量、激光雷达那些;在准备作业的时候,突发奇想,把网页元素按照层级提取出来,计算面积,做了一个点云,生成三维模型,贴个图,效果大概类似(本来打算放个图,结果找不到了),后面感觉太简单,就没弄了;当时大作业准备的给我们学院拍一些照片,用摄影测量的方法(其实就是现成的软件,点点点)重建一个三维模型,加了一些交互效果,老师反馈还不错;只用了三件套,写报告的时候其他组员把上面什么git、docker都加进去了,反正老师不会查,多堆一点技术,显得专业一点3.&nbsp;后面怎么学的&nbsp;&nbsp;&nbsp;&nbsp;研二开始陆陆续续抽空学前端,因为身边没转码的同学,所以都是在自学。其实我一直对自己学的符不符合公司招前端的正常要求存疑,但除了看一些视频、官网、书、别人写的项目,也没啥更好的选择了,不知道目标在哪,只能按照当前的节奏走一步看一步;刚入门是在B站看的三件套和尚硅谷的Vue,写了个商城和后台管理系统,用py写了个后端(写的真的烂,数据库也没有,用个json存的数据);后面又学了一点java,跟着写了个苍穹外卖...,也认识了一些后端的东西,没有目标,瞎学,对数据库、redis、消息队列、微服务、docker有个大概的印象,面试的时候如果能聊到,可能会加点分...,比如字节三面面试官问MinIO相关的,我就多少答了一点 4.&nbsp;准备面试:&nbsp;&nbsp;&nbsp;&nbsp;今年1月开始准备的,首先是项目,前面那俩商城和管理系统还是算了吧,重新写个...。网上找了一个网盘的项目,看了一眼流程和大概用了哪些库,然后把它关了,按照自己的想法写,他用elementplus我用acro&nbsp;design,他用本地目录存文件我用minio,洋洋洒洒写了将近20天,踩了一些坑,后面优化了一下分包,nginx用http2,租服务器配置域名,上线,算是一整套跑通了,这个就差不多了。&nbsp;&nbsp;&nbsp;&nbsp;第二个是今年字节青训营的埋点项目,组内4个人,也花了快一个月的时间做,做的还凑合吧感觉(后端py写的,别提什么进阶要求高并发高可用,不过夹了点私货,自己写的一个工具,用起来还不错),时间已经来到3月中,就包装了一下,开始准备了。&nbsp;&nbsp;&nbsp;&nbsp;准备面试的话,是不是忘了什么。没错,到现在为止,八股没专门背过,力扣刷了个位数...&nbsp;&nbsp;&nbsp;&nbsp;后面开始挤时间狂补,八股大概都过了几遍,力扣快200,项目再包装了一下,就开始投了。&nbsp;&nbsp;&nbsp;&nbsp;整体来说还行,基本上投了一两天就能约面,问的大多是复习过的。4.13投腾讯、4.14投字节,真的不知天高地厚...都说字节面评差会让冷静很久。虽然刚开始面的几次都过了,但还是觉得风险太高,后面又投了快手、美团、TME、B站,运气还不错,到写这个动态为止,面的9次技术面都过了(图1),(我工程化方面很弱,只做了简单的优化,经不起深挖,但好在面试官都基本没问,真神奇)。目前也是收到了两个offer,腾讯PCG和字节抖音电商。这俩可能更倾向于字节,其他还在流程的就不考虑了(一直听说美团体验好,29号体验一把)。&nbsp;&nbsp;&nbsp;&nbsp;找暑期实习就告一段落了,15号首面腾讯,27号收到第一个offer,很知足了。&nbsp;&nbsp;&nbsp;&nbsp;面试官可能会好奇为什么转码学前端,所以我就把那两个WebGIS实验和三维模型放到了自我介绍中,省的他们再问...。因为我没实习,所以只能揪着八股和项目问,感觉有些难为面试官了...&nbsp;&nbsp;&nbsp;&nbsp;学院的实习就业分享会,基本每年都有,同学们会分享一些经历,比如小米、momenta以及其他不知名的小公司的实习,岗位一般是算法(很少)或产品经理(多),感觉腾讯字节和这些企业还是有一定gap的,期待在明年分享会上露一手(,大佬们可能都习以为常了,打工人而已,但在我们身边应该算很难得了)5.&nbsp;一点感想&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;转码很爽&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;这些面试检验了我一直以来所学的东西,是可以像科班那样去找一个正常工作的,已经很知足了,不容易&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;面的这些厂都不错,真的都想去试试啊,很羡慕那些有三五段实习的同学,经验丰富、能力强。算了没机会了,就让它成为一个遗憾吧...,不然没点深刻的记忆,老了就忘了&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;&nbsp;希望实习可以多认识一些朋友&nbsp;&nbsp;&nbsp;&nbsp;5.&nbsp;&nbsp;面这么多次,只有腾讯的HR面是个小姐姐,其余的全是男的,真就这么绝缘吗?------------------------------------------------------------------车到山前自有路,就这样了,溜了溜了&nbsp;&nbsp;&nbsp;
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务