自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(713)
  • 收藏
  • 关注

原创 LoRa学习

LoRa:Long Range Radio 远距离无线电LoRa是一种低功耗广域网(LPWAN)协议,具有传输距离长,功耗低和成本低的特点。LoRa原本为一种线性调频扩频的物理层调制技术。LoRa主要在全球免费频段运行(即非授权频段)。LoRa技术不需要建立基站,一个网关便可以控制较多设备,并且布网方式较为灵活,可大幅度降低建设成本。Wi-Fi有两种组网结构:一对多和点对点。最常用的Wi-Fi是一对多结构的,例如日常使用的无线路由器是路由器+AP(接入点),可接入多个设备。

2025-04-03 10:58:18 612

原创 STM32 CAN学习

CAN总线(Controller Area Network Bus)控制器局域网总线。

2025-03-31 15:40:16 827

原创 STM32 CAN学习(一)

CAN总线应用最多的是汽车领域。CAN(Controller Area Network)控制器 局域 网局域网:把几台电脑连接到一台路由器上,这几台电脑就可以进行通讯了。控制器在汽车中的专业术语叫做ECU(Electronic Control Unit),可以看做是一台超小型计算机,内部集成了供电系统,单片机,驱动系统,是汽车里面最小的控制模块。为了能让ECU之间进行通信,人们设计了一种CAN协议。CAN总线在最开始是为了减少铜线的长度而开发的。

2025-03-28 11:12:20 732

原创 RTT内核基础学习

内核是操作系统的核心,是操作系统最基础也最重要的部分。它负责管理系统的线程、线程间通信、系统时钟、中断及内存等。内核处于硬件层之上,内核部分包括内核库、实时内核实现。内核库是为了保证内核能够独立运行的一套小型的类似C库的函数实现子集。这部分根据编译器的不同,自带C库的情况也会有些不同,当使用GNU GCC编译器时,会携带更多的标准C库实现。C库,也叫C运行库(C Runtime Library),它提供了类似strcpy、memcpy等函数,有些也会包括printf、scanf函数的实现。

2025-03-27 10:45:06 755

原创 LoRa模块学习

LoRa模块能够支持多个信号同时占用同一个无线信道。LoRa采用一种名为扩频技术的方式,在相同的频率范围内同时传输多个信号而不会产生干扰。不同的设备使用不同的扩频因子和编码方式,使得它们虽然在相同的频道上传输,但互不干扰。这使得LoRa网络在低功耗、长距离传输的同时,也能够支持多个设备共享同一个频段。LoRa模块利用扩频技术和多信道机制,能够在一定程度上区分和解调在相同或部分重叠的频率上传输的多个信号。LoRa使用的是一种称为Chirp Spread Spectrum(CSS)的扩频技术。

2024-12-26 16:10:15 866

原创 RT-Thread中KConfig

Env在根目录下执行menuconfig命令后会递归解析各级Kconfig文件,然后提供如下配置界面,完成相应的配置后并保存,根目录下存放一份.config文件保存当前的配置项,并将.config文件转为RT-Thread的配置系统文件rtconfig.h。config表示一个配置选项的开始,紧跟着的BSP_USING_GPIO是配置选项的名称,config下面几行定义了该配置选项的属性。promt给出提示信息,光标选中后回车进入就可以看到多个config条目定义的配置选项,所以下面的两个例子是等价的。

2024-11-11 10:46:23 815

原创 RT-Thread 配置工具

menuconfig是RTT 3.0以上版本的特性,目前 RT-Thread 还没有对所有的 BSP 做 menuconfig 的支持,也就是说有些 BSP 暂时还不能使用 menuconfig 来进行配置,但常用的 BSP 都已经支持。使用pkgs --upgrade命令解决该问题,这个命令不仅会对本地的包信息进行更新同步,还会对Env的功能脚本进行升级,建议定期使用。如果使用mdk/iar来进行项目开发,可以直接使用BSP中的工程文件或者使用以下命令中的其中一种,重新生成工程,再进行编译下载。

2024-11-11 09:06:05 1445

原创 RTT 内核基础学习

内核是操作系统的核心,负责管理系统的线程、线程间通信、系统时钟、中断以及内存等。内核位于硬件层之上,内核部分包括内核库、实时内核实现。内核库是为了保证内核能够独立运行的一套小型的类似C库的函数实现子集。这部分根据编译器的不同自带C库的情况也会有些不同,当使用GNU GCC编译器时,会携带更多的标准C库实现。C库:也叫C运行库,它提供了类似strcpy、memcpy等函数,有些也会包括printf、scanf函数的实现。

2024-11-07 16:36:58 949

原创 RTT BSP制作

在RT-Thread实时操作系统中,各种各样的设备驱动是通过一套I/O设备管理框架来管理的。设备管理框架给上层应用提供了一套标准的设备操作API,开发者通过调用这些标准设备操作API,可以高效地完成和底层硬件外设的交互。设备管理框架的结构如下图所示:使用同一套标准的API开发应用程序,使应用程序具有更好的移植性。底层驱动的升级和修改不会影响到上层代码。驱动和应用程序相互独立,方便多个开发者协同开发。板载外设驱动:指MC之外,开发板上外设,例如TF卡,以太网和LCD等。

2024-11-05 11:17:48 813

原创 RT-Thread PIN设备 UART设备

芯片上的引脚一般分为四类:电源、时钟、控制与I/O。I/O口在使用模式上又分为General Purpose Input Output(通用输入/输出),简称GPIO,与功能复用I/O(如SPI/I2C/UART等)。大多数MCU的引脚都不止一个功能。不同引脚内部结构不一样,拥有的功能也不一样。可以通过不同的配置,切换引脚的实际功能。可编程控制中断输出模式一般包括:推挽、开漏、上拉、下拉。引脚为输出模式时,可以通过配置引脚输出的电平状态为高电平或低电平来控制连接的外围设备。

2024-11-04 17:04:17 793

原创 函数指针及其定义和用法

这段存储空间的首地址称为这个函数的地址,并且函数名表示的就是这个地址。通常用指针变量来存放地址,所以上述的地址也可以用指针存放,称为函数指针。在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段。

2024-11-04 14:41:11 230

原创 RT-Thread I/O设备模型

通常情况下,设备驱动程序需要首先执行相对应的设备块的读操作,然后把写入数据覆盖到读出数据上,然后再把这个 “合成” 的数据块作为一整个块写回到设备中。例如上图中的块 4,驱动程序需要先把块 4 所对应的设备块读出来,然后将需要写入的数据覆盖至从设备块读出的数据上,使其合并成一个新的块,最后再写回到块设备中。绝大部分的嵌入式系统都包括一些I/O设备,例如仪器上的数据显示屏,工业设备上的串口通信、数据采集设备上用于保存数据的Flash或SD卡,以及网络设备的以太网接口等。

2024-11-04 11:07:03 956

原创 RTT工具学习

RT-Thread Studio作为一个开发工具软件,需要一个从了解到熟悉,从熟悉再到熟练应用的过程,特别是对于以前没有用过基于eclipse的开发工具的用户,还是需要先熟悉软件基本使用方法和主要功能入口,然后开发项目。

2024-10-29 14:07:39 978

原创 嵌入式笔试准备

ARM架构的中断服务程序(ISR)的最后一条指令是BX LR。在ARM架构中,Link Register(LR)寄存器通常用来保存子程序返回地址。当发生中断时,硬件会自动将当前PC的值保存到LR中,然后跳转到中断向量表中对应的中断服务程序入口。BX是ARM指令集中的一个分支指令,根据指定的寄存器中的值来确定跳转的目标地址。通过将LR寄存器作为BX指令的操作数,就可以实现从ISR返回到中断发生前的指令处。

2024-09-01 14:03:16 815

原创 嵌入式笔试准备

IO多路复用是一种高效的I/O处理机制,它允许单个进程同时监控多个文件描述符(如网络套接字),一旦某个描述符就绪(可读或可写),就能及时通知程序进行相应的读写操作。程序将这些集合传递给select,select监听这些描述符,一旦其中的某个或多个描述符就绪,select 就会返回,程序再对就绪的描述符进行相应的 IO 操作。条件变量与互斥锁配合使用,允许线程等待某个特定的条件的发生。poll与select类似,但没有文件描述符数量的限制,并且使用了更灵活的数据结构(链表),可以监视更多的文件描述符。

2024-08-28 20:36:47 1244

原创 嵌入式笔试准备

假设这些腐烂橘子先开始是新鲜的,而有一个腐烂橘子(超级源点)会在下一秒把这些句子都变腐烂,而这个腐烂橘子刚开始的时间是-1,那么按照广度优先搜索的算法,下一分钟(第0分钟)这个腐烂橘子会把它们都变成腐烂橘子,然后继续向外拓展,所以其实这些腐烂橘子是同一层的节点。对于对象B,包含一个虚函数指针,也是对齐到8字节,然后是4个char型,最后补齐到8字节整倍数,变成16字节。C++的多态肯定是使用父类的指针指向子类的对象,所以肯定是释放子类的对象,如果不使用虚函数的话,父类的指针就只能释放父类的对象。

2024-08-28 10:32:43 947

原创 C语言笔试准备

经常要操作的内存分为哪几个类别?线程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。线程间可以直接读写进程数据段(如全局变量)来通信。线程上下文切换要比进程快。使用哈夫曼算法编码后,用编码值来存储这段文本将花费最少的存储空间。使用哈夫曼算法进行编码,编码值可以有多套,但每个字符编码的位是确定的。哈夫曼树带权路径长度最短的树,路径上全值较大的节点离根较近。当从一个最小堆删除一个元素时,需要把堆尾元素填补到堆顶位置,然后再按条件把它逐层向下调整到合适位置。

2024-08-26 14:16:49 886

原创 面试准备算法

我们将设置慢指针slow和快指针fast,慢指针每次走一步,快指针走两步,在有环的情况下一定相遇,此时再将慢指针放到slow,两个指针同时移动一步,相遇的点就是答案。对nums数组建图,每个位置i连一条i->nums[i]的边,由于存在重复的数字target,因此,target这个位置至少有两条指向它的边,在构建完图之后,对于任何一个查询,就可以从起点出发,通过广度优先搜索的方式,不断更新起点与当前点之间的路径,直到搜索到终点为止。因此,为了深拷贝出整张图,我们需要知道整张图的结构以及对应节点的值。

2024-08-22 15:15:02 951

原创 面试准备算法

对于数组中的每个元素,如果它与前面的元素最大公约数为1,那么它需要作为新的子数组的第一个元素。所以我们考虑以i结尾的和为k的连续子数组的个数时,只需要统计有多少个前缀和为pre[i] - k的pre[j]即可。所以考虑以i结尾的和为k的连续子数组个数只需要统计有多少个前缀和pre[i] - k的pre[j]即可。,i]里所有数的和,则pre[i] = pre[i-1] + nums[i],i]子数组和为k可以转换为pre[i] - pre[j-1] == k。查看Linux磁盘用量常用命令。

2024-08-20 09:53:59 703

原创 面试准备算法

i++){j--){

2024-08-18 16:59:14 794

原创 RTT学习

SMP:对称多处理(Symmetrical Multi-Processiong)简称SMP,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。系统上电后,每个CPU都在ROM中的代码控制下独自运行,但是只有主处理器(简称CPU0)跳转到RTT的初始化入口,而其它处理器(次级CPU)会暂停在某个状态下,等待CPU0将它们唤醒。CPU0完成RTT的全局初始化过程,包括外设初始化,中断控制器的中断分发部分初始化、全局变量的初始化、全局内核对象的创建等等。

2024-08-16 13:23:48 1012

原创 RTT学习

在进入新的休眠模式,大部分时钟源会被停止,如果外设不支持休眠的冻结功能,那么从休眠唤醒的时候,外设的时钟就需要重新配置外设。绝大部分的嵌入式系统都包含一些I/O(输入/输出)设备,例如仪器上的数据显示屏、工业设备上的串口通信,数据采集设备上用于保存数据的Flash或SD卡,以及网络设备的以太网接口等,都是嵌入式系统中容易找到的I/O设备例子。外设或应用通过投票机制对所需的功耗模式进行投票,当系统空闲时,根据投票数决策出合适的功耗模式,调用抽象接口,控制芯片进入低功耗状态,从而降低系统功耗。

2024-08-16 08:58:11 855

原创 RTT学习

在动态创建线程和初始化线程的时候,会使用到内部的线程初始化函数_rt_thread_init(),_rt_thread_init()函数会调用栈初始化函数rt_hw_stack_init(),在栈初始化函数里会手动构造一个上下文内容,这个上下文内容会被作为每个线程第一次执行的初始值。因此,我们会编译得到一个稍微冗余的固件。默认使用的libc,提供了printf、scanf等很多标准库函数,但是这些库函数相对较大,而且很可能一些复杂的可能,我们在项目中并没有使用到,这样会造成代码体积的增大。

2024-08-12 14:46:03 1130

原创 RTT学习

在RTT实时操作系统中,各种各样的设备驱动是通过一套I/O设备管理框架来管理的。设备管理框架给上层应用提供了一套标准的设备操作API,开发者通过这些标准设备操作API,可以高效地完成和底层硬件外设的交互。使用同一套标准的API开发应用程序,使应用程序具有更好的移植性。底层驱动程序的升级和修改不会影响到上层代码。驱动和应用程序相互独立,方便多个开发者协同开发。片上外设驱动:指MCU芯片上的外设,如硬件定时器、ADC和看门狗等。板载外设驱动:开发板上外设,例如TF卡,以太网和LCD等。

2024-08-12 10:39:32 1304

原创 RTT DEMO学习

同理的,如果内存池是空的,里面没有数据,接收邮件里面的 RT_WAITING_FOREVER 会使得nrf24l01_thread 线程阻塞,并挂起,然后 MCU 就会去干别的事情去了,在 ds18b20_thread 线程中采集温度,并申请内存块塞数据进去,内存块一旦有数据,就会发邮箱,另外一边一有邮箱收到了,就又开始工作了。我们创建两个线程去工作,onenet_mqtt_init_thread线程用于初始化 MQTT 客户端,onenet_upload_data_thread 线程去上传数据给云。

2024-08-11 10:58:18 1140

原创 嵌入式面试准备

使用32位地址,地址范围0.0.0.0到255.255.255.255。使用128位地址私有IP地址用于局域网(LAN)内部,不在互联网中传输。公有IP地址由互联网服务提供商(ISP)分配,可以在全球互联网中唯一识别。静态IP地址是手动分配的,不会改变。适用于需要长期保持相同IP地址的设备,如服务器。动态IP地址由DHCP服务器动态分配,每次连接网络时可能会关闭。路由器是一种网络设备,用于在计算机网络之间转发数据包。它主要用于连接不同的网络,并确定数据包的最佳路径。

2024-08-09 11:01:36 936

原创 嵌入式面试准备

子进程完整复制了父进程的地址空间,此时父子进程的虚拟内存空间映射到相同的物理内存空间。在全缓冲模式下,数据只会在缓冲区满时刷新,这意味着数据被存储在缓冲区直到缓冲区被填满,然后整个缓冲区的内容一次性刷写。线程是进程中的执行单元,它共享进程的资源和地址空间,但拥有自己的执行堆栈、程序计数器和一组寄存器。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,广泛应用于互联网中。通常向文件写数据的默认模式就是全缓冲,这样可以减少对底层系统资源的调用次数,提高数据处理效率。

2024-08-09 07:49:34 607

原创 嵌入式面试准备

线程池是一种用于管理和重用多个线程的设计模式。它通过维护一个线程池(线程的几何),可以有效处理并发任务而无需每次创建和销毁线程。这种方法可以减少线程创建和消耗的开销,提高性能和资源利用率。

2024-08-07 19:28:40 1050

原创 嵌入式面试准备

我们可以设置消息队列的模式为O_RDWR,使它可以用于收发数据,从技术上讲,单条消息队列可以用于双向通信,但这会导致消息混乱,无法确定队列中的数据是本进程写入的还是读取的,因此,不会这么做,单条消息队列只用于单向通信。Linux提供了可以修改的属性pthread_rwlockattr_t,默认情况下,属性中指定的策略为“读优先”,当写操作阻塞时,读线程依然可以获得读锁,从而在读操作并发较高时导致写饥饿问题。管道在内核里,所以管道内存非常小,而共享内存的内存很大,并不是存到磁盘里,因为磁盘速度非常慢。

2024-08-06 15:45:22 1058

原创 经典算法题准备

数组nums升序排列,数组中的值互不相同。二分查找对于有序数组,可以使用二分查找的方法查找元素。我们将数组从中间分开,一定有一部分是有序的,[4,5,6]和[7,0,1,2]。可以分割出[l, mid],[mid+1, r]哪个部分有序。在排序数组中查找元素的第一个和最后一个位置三数之和LRU缓存请设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:哈希表+双向链表LRU缓存机制可以通过哈希表+双向链表实现。双向链表按照被使用的顺序存储了这些键值对,靠近头

2024-08-05 16:06:10 787

原创 嵌入式面试准备

进程是正在运行的程序,是操作系统进行资源分配的基本单位。程序是存储在硬盘或内存的一段二进制序列,是静态的,而进程是动态的,进程包括代码、数据以及分配给它的其它系统资源(如文件描述符、网络连接等)。使用标准库函数创建子进程在C99标准之前,main函数没有参数的形式被写为int main(),这在某些情况下可能导致与int main(void)行为不完全相同的问题,因为int main()在老式的C语言标准中不明确指出函数是否接受参数。从C99标准开始,

2024-08-05 15:08:02 1088

原创 嵌入式面试准备

我们在say_hello()函数中调用了printf()函数,这个函数是在stdio.h中声明的,后者来源于glibc库,printf()的实现在glibc的二进制组件中,通常是在共享库(如libc.so)或静态库(libc.a)文件中。如果是数组的插入排序,则数组的前面部分是有序序列,每次找到有序序列的第一个元素(待插入元素)的插入位置,将有序序列中的插入位置后面的元素都往后移动一个位置,然后将插入元素置于插入位置。在类成员函数的声明和定义中,const放在函数的参数表之后,不能修改该对象的数据成员。

2024-08-04 07:47:34 856

原创 嵌入式面试准备

可以用哈希表存储所有节点的父节点,然后从p节点依次向上跳,将经过的地方标记为true。q节点向上跳,遇到的第一个为true的节点,就是公共节点。给两个单词word1和word2,请返回将word1转换成word2所使用的最少操作数。定义dp[i]表示0,…,i-1是否能被空格拆分成若干字典中出现的单词。暴力枚举的时间复杂度高的原因是寻找target-x的时间复杂度过高。如果有两件,选择其中最高的一间,获得最高金额。如果只有一间房屋,则偷窃该房屋获得最高金额。

2024-07-29 20:30:43 895

原创 嵌入式面试准备

Linux系统中有很多种系统服务,大多数服务都是通过守护进程实现的,譬如系统日志服务syslog,web服务httpd,邮件服务sendmail和数据库服务mysqld等。假如是在排序数组中寻找一个目标值,那么直接利用二分法就可以在O(log n)找到目标值,但是这题添加了额外条件,如果不存在数组中的时候,需要返回插入顺序。父进程先于子进程结束,也就意味着,此时子进程变成了一个孤儿进程,在Linux系统中,所有孤儿进程都自动变成init进程的子进程。给一棵完全二叉树的根节点root,求出该树的节点个数。

2024-07-29 08:55:02 952

原创 面试算法刷题

需要调查从start基因变为end基因的基因变化,一次基因变化就意味着一个字符发生变化。如果start与end相等,此时返回0,如果最终基因序列不在bank中,返回-1。基因序列可表示为一条由8个字符组成的字符串,每个字符都是A,C,G,T。层次遍历,每次取出每一层的最后一个节点的值,加入到res即可。变化后的基因必须位于bank中。任何边界上的0不会被填充为X。

2024-07-27 07:51:44 278

原创 嵌入式面试总结

声明一个指向含有10个元素的数组的指针,其中每一个元素是一个函数指针,函数的返回值是int,参数是int*。

2024-07-26 07:48:40 867

原创 嵌入式面试总结

通过rand()可以得到[0,RAND_MAX]之间的伪随机数,但是每次运行的序列是相同的,通过srand()设置随机数种子。目录块中有多个目录项,每一个目录项都会对应到该目录下的某一个文件,目录项记录了该文件的文件名以及inode节点。在函数内部声明的静态变量会保持其值,直到程序结束,它们在内存中位置固定,不会随着函数的调用而销毁和重新创建。当函数被声明为静态时,它的作用域仅限于声明它的文件内部,不可见于其它文件中的代码。kill函数用于发送一个信号,在发送信号的时候需要指定接收信号的进程。

2024-07-24 19:06:17 834

原创 嵌入式面试总结

当进程对文件进行操作时,将进行权限检查,如果文件的set-user-ID位权限被设置,内核会将进程的有效ID设置为该文件的用户ID(文件所有者ID),意味着该进程直接获取了文件所有者的权限,以文件所有者的身份操作该文件。inode数据结构中记录了文件的硬链接数,当为文件每创建一个硬链接,inode节点上的链接数就会加1,每删除一个硬链接,inode节点上的链接数就会减1,直到为0,inode节点和对应的数据块才会被文件系统回收。

2024-07-22 09:10:32 1302

原创 嵌入式面试总结

对于或运算,如果第一个表达式为真,不需要执行第二个表达式。对于与运算,如果第一个表达式为假,不用执行后面语句。

2024-07-20 10:12:29 755

原创 嵌入式面试总结

在计算机系统中,通常存储空间分为两种:内部存储空间和外部存储空间。内部存储空间通常访问速度比较快,能按照变量地址随机访问。也就是我们所说的RAM(随机存储器)。外部存储空间保存的内容相对固定,即使掉电后数据也不会丢失。变量,中间数据一般存放在RAM中,只有实际使用时才将它们从RAM调入到CPU中进行运算。一些数据需要的内存大小在程序运行过程中根据实际情况确定,这就要求具备动态管理内存的能力。

2024-07-19 07:36:54 708

随机过程-排队论-习题解答

随机过程-排队论-习题解答

2022-10-27

随机过程排队论习题解答

课后习题答案

2022-10-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除