自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 基于rtthread了解C语言函数调用栈

因为在实际生产环境中与栈相关的问题也是比较多的,比如局部变量太多导致的栈溢出,或者踩内存问题引起的栈破坏等等。因此,了解了函数栈的原理,在遇到所谓的莫名其妙问题的时候就会有新的思路,本文部分使用了韦东山老师的文档。发现函数C太简单,它根本没有使用栈,函数C执行完,直接返回到LR(在rtthread打印的信息中),LR=0x0800076f,去掉bit0,就是:0x0800076e根据这个值,在反汇编文件中找到函数C的调用者,是函数B,在函数B的入口处,发现使用了8字节的栈,并且保存了R4,LR的值。...

2022-08-09 23:40:32 917 5

原创 STM32以太网之站管理接口

STM32芯片自带以太网模块,该模块包括带专用 DMA 控制器的 MAC 802.3(介质访问控制)。它支持介质独立接口(MII) 和简化介质独立接口 (RMII),并通过一个选择位在两个接口间进行切换(请参见SYSCFG_PMC 寄存器)。自带了一个用于外部 PHY 通信的 SMI 接口,通过一组配置寄存器,用户可以为 MAC 控制器和 DMA 控制器选择所需模式和功能。DMA 控制器通过 AHB 主从接口与内核和存储器相连。AHB 主接口用于控制数据传输,而AHB 从接口则用于访问“...

2022-03-30 22:34:29 3410

原创 FATFS之主引导记录(MBR)

FATFS 简介FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。支持 FATl2、FATl6 和 FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写。FATFS 模块的层次结构如图 所示:最顶层是应用层,使用者无需理会 FATFS 的内部结构和复杂的 FAT 协议,只需要调用FATFS 模块提供给用户的一系列应用接口函数,如 f_open,f_read,f_write 和 f_close 等,就可以像...

2022-03-18 19:09:50 1615

原创 FAT32文件系统理论入门

1.1MBR(Main Boot Record)主引导记录,有时也称主引导扇区,位于整个硬盘的 0 柱面 0 磁头 1 扇区(可以看作是硬盘的第一个扇区),在总共512byte的主引导记录中,MBR的引导程序占了其中的前 446 个字节(偏移 0H~偏移 1BDH),随后的 64 个字节(偏移 1BEH~偏移 1FDH)为DPT(DiskPartitionTable,硬盘分区表),最后的两个字节“55 AA”(偏移 1FEH~偏移1FFH)是分区有效结束标志。 为计算机启动后从可启动...

2022-03-11 21:15:05 827

原创 ARP协议简介

MAC 地址的基本概念MAC Address(Media Access Control Address),亦称为 EHA(Ethernet Hardware Address)、硬件地址、物理地址(Physical Address)。MAC 地址就是在媒体接入层上使用的地址,也叫物理地址、硬件地址或链路地址,其被固化在网卡的 ROM 中。可见 MAC 地址实际上就是网卡地址或网卡标识符。某台计算机网卡上的标识符就成为该计算机的 MAC 地址。MAC 地址长度为 6 字节(48 比特),其前 3 个字节表示

2022-03-09 17:39:39 6830

原创 armv7实现原子操作

原子操作(atomic operation)指的是由多步操作组成的一个操作。如果该操作不能原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。多核系统中,单个的机器指令就不是原子操作,因为多核系统里是多指令流并行运行的,一个核在执行一个指令时,其他核同时执行的指令有可能操作同一块内存区域,从而出现数据竞争现象。多核系统中的原子操作通常使用内存栅障(memory barrier)来实现,即一个CPU核在执行原子操作时,其他CPU核必须停止对内...

2022-01-06 20:59:52 937

原创 基于rtthread的通用bootload设计

1.总体设计1.1概述固件升级,通常称为 OTA(Over the Air)升级或者 FOTA(Firmware Over-The-Air)升级,即固件通过空中下载进行升级的技术。bootloader 的升级模式常见有以下两种:(1):* bootloader 分区 + app1 分区 + app2 分区模式该模式下, bootloader 启动后,检查 app1 和 app2 分区,哪个固件版本最新就运行哪个分区的固件。当有新版本的升级固件时,固件下载程...

2021-12-16 17:22:53 1830

原创 STM32 USB主机调度器

主机调度器主机模块内置硬件调度器,可自主对应用程序发出的 USB 事务请求重新排序和管理。每一帧开始时,主机都先执行周期性(同步和中断)事务,然后执行非周期性(控制和批量)事务,以符合 USB 规范对同步和中断传输高优先级的保证。主机通过请求队列(一个周期性请求队列和一个非周期请求队列)处理 USB 事务。每个请求队列最多可存储 8 个条目。每个条目代表一个应用程序发起但还未得到响应的 USB 事务请求,并存储了执行该 USB 事务所用到的 IN 或 OUT 通道的编...

2021-10-16 11:01:02 395

原创 LWIP/TCPIP糊涂窗口综合症

TCP协议栈基于滑动窗口动态调整机制进行流量控制会导致一种被称为“糊涂窗口综合症SWS (Silly WindowSyndrome)"的状况。当TCP接收方通告了一个小窗口,并且TCP发送方立即发送数据填充该小窗口时,糊涂窗口综合症SWS (Silly WindowSyndrome)就会发生。糊涂窗口综合症能够导致网络性能严重下降。当TCP的双方都是以小窗口通告和小报文段发送来实现通信,会使TCP数据流包含很多非常小的报文段,而不是满长度的报文段;而小单元报文段中IP首...

2021-08-09 23:46:59 1077

原创 rtthread-IO扩展PCA9539芯片

一、芯片介绍PCA9539是NXP推出用于扩展芯片引脚的芯片,当主芯片控制引脚不够时,可以通过添加PCA9539芯片来进行扩展,PCA9539具有中断输出和复位配置的远程 16 位 I2C 和 SMBus 低功耗 I/O 扩展器 寄存器。PCA9539由两个8位配置(输入或输出选择),输入端口,输出端口和极性反转(高电平有效或低电平有效操作)寄存器组成。上电时,I /O配置为输入。系统主机可以通过写入I /O配置位将I /O用作输入或输出。每个输入或输出的数据保存在相应的输入或输出寄存...

2021-06-25 20:34:58 2542

原创 rtthread-TMF8801激光测距芯片

一、芯片介绍TMF8801是2019年艾迈斯半导体推出的用于测量直接飞行时间(dToF)距离的集成式模块,这个传感器测量范围是2cm至2500cm。亮的环境下能达到2.4m,暗环境下能够测量到2.5m,但是在2cm以下测量数据不准备,距离比2cm要短。相比VL53L0X测距模块测量距离和精度确实要好很多。二、引脚定义三、驱动流程1、项目开发使用了RTT实时操作系统,因此会使用到模拟I2C驱动跟传感器驱动框架,首先注册I2C总线设备驱动及传感器驱动。1)使能I2C接口及定义I2C引

2021-06-23 20:59:50 2615

原创 如何调整TCP拥塞控制的性能

当接收主机的处理能力不足时,是通过滑动窗口来减缓对方的发送速度。我们看一看当网络处理能力不足时又该如何优化 TCP 的性能?如果阅读过 TCP 协议相关的书籍,一定看到过慢启动、拥塞控制等,若对这些概念不是很理解,请参考文章TCPIP------慢启动与拥塞避免。当我们理解了拥塞控制的工作原理,就可以在内核的 TCP 层,提升所有进程的网络性能。比如,2013 年谷歌把初始拥塞窗口从 3 个 MSS(最大报文长度)左右提升到 10 个 MSS,将 Web 站点的网络性能提升了 10% 以上,而有些高速 C

2021-06-22 21:00:47 991 2

原创 rtthread之线程池

大多数网络服务器都具有一个特点,就是单位时间内必须处理数目巨大的连接请求,但是处理时间却是比较短的。在传统的多线程服务器模型中是这样的:一旦有个请求到达,就创建一个新的线程,由该线程执行任务,任务执行完毕之后,线程就退出。这就是"即时创建,即时销毁"的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数非常频繁,那么服务器就将处于一个不停的创建线程和销毁线程的状态。这笔开销是不可忽略的,尤其是线程执行的时间非常非常短的情况。线程池就能解...

2021-04-15 18:19:36 929

原创 环形缓冲区(ringbuffer)

环形缓冲区(ringbuffer)环形缓冲区是嵌入式系统中十分重要的一种数据结构,比如在串口处理中,串口中断接收数据直接往环形缓冲区丢数据,而应用可以从环形缓冲区取数据进行处理,这样数据在读取和写入的时候都可以在这个缓冲区里循环进行,程序员可以根据自己需要的数据大小来决定自己使用的缓冲区大小。环形缓冲区,顾名思义这个缓冲区是环形的,那么何谓环形这个意思也很好理解,就是用一个指针去访问该缓冲区的最后一个内存位置的的后一位置时回到环形缓冲区的起点。类似一个环一样在此之前,我们来回顾一下队列的基本概念

2021-03-29 21:24:35 15895 4

原创 rtthread中INIT_EXPORT与linux中__define_initcall对比解析

INIT_EXPORT的作用宏定义INIT_EXPORT(fn, level) 对于RTT内核的初始化很重要,它指示编译器在编译的时候,将一系列初始化函数的起始地址值按照一定的顺序放在一个section中。在内核初始化阶 段,rt_components_board_init()、rt_components_init() 将按顺序从该section中以函数指针的形式取出这些函数的起始地址,来依次完成相应的初始化。由于内核某些部分的初始化需要依赖于其他某些部分的初始 化的完成,因此这个顺序排列常常非常重要。

2021-03-29 20:50:27 1711

原创 TCPIP协议------快速重传与快速恢复

前面介绍过,在收到一个失序的报文段时,该报文段会被挂接到ooseg队列上,同时向发送端返回一个ACK(期待的下一个字节),很明显,这个ACK一定是个重复的ACK,且这个重复的ACK被发送出去的时候不会有任何延迟。接收端利用该重复的ACK,目的在于让对方知道收到一个失序的报文段,并告诉对方自己希望收到的序号。但是在发送方看来,它不可能知道一个重复的ACK是由一个丢失的报文段引起的,还是由于仅仅出现了几个报文段的重新排序引起。因此我们需要等待少量重复的ACK到来。假如这只是一些报文段的重新排序,则在重新排序

2020-12-15 11:18:33 1049

原创 ros安装及编译ORB_SLAM2

一、ubuntu18.04安装ROS(melodic)操作步骤1.1.设置软件源sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'2.设置密钥sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-ke

2020-11-20 12:59:24 1897

原创 TCPIP------慢启动与拥塞避免

如果阅读过 TCP 协议相关的书籍,一定看到过慢启动、拥塞控制等名词。这些概念似乎离应用开发者很远,然而,如果没有拥塞控制,整个网络将会锁死,所有消息都无法传输。当接收主机的处理能力不足时,是通过滑动窗口来减缓对方的发送速度。当网络处理能力不足时TCP又是如何处理的 。 假如按照滑动窗口的讨论,只要接收方的读缓冲区足够大,就可以通过报文中的接收窗口,要求对方更快地发送数据;既发送方一开始便可以向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个...

2020-11-17 20:07:52 1060

原创 TCPIP-------超时与重传

TCP是可靠的传输层协议,但这并不意味着发送端发送的数据一定可以到达接收端,因为传输过程中遇到的情况是不可控的,在TCP两端交互过程中,数据和确认的报文都有可能丢失,因此在发送端引入超时和重传机制可以很好的解决报文丢失问题。其基本原理:TCP通过在发送端为每个发送出去的报文设置一个超时定时器,当定时器溢出时还没有收到确认报文,它就重传该数据。对任何TCP协议实现而言,怎样决定超时间隔和如何确定重传的方式是提高TCP性能的关键,如何设置这个定时器的时间(RTO),从而保证对网络资源最小的浪费。...

2020-11-17 00:35:11 1421

原创 rtthread移植实现uorb

  uORB(Micro Object Request Broker,微对象请求代理器)是PX4/Pixhawk系统中非常重要且关键的一个模块,它肩负了整个系统的数据传输任务,所有的传感器数据、GPS、PPM信号等都要从芯片获取后通过uORB进行传输到各个模块进行计算处理。实际上uORB是一套跨「进程」 的IPC通讯模块。在Pixhawk中, 所有的功能被独立以进程模块为单位进行实现并工作。而进程间的数据交互就由为重要,必须要能够符合实时、有序的特点。  Pixhawk使用的是NuttX实时ARM系统,u

2020-08-25 01:19:02 1512

原创 rtthread之工作队列

中断处理分为上半部和下半部一般来说中断处理的上半部和下半部都是不允许出现睡眠和阻塞的。但是对于下半部,并不是一刀切,下半部的实现方式有软中断和tasklet(不允许睡眠和阻塞)以及工作队列(允许睡眠和阻塞)。上半部:一般中断的中断处理函数为上半部,要求做耗时少的动作,尽量迅速,一定不能休眠和阻塞。下半部:由于上半部只能执行耗时少的操作,所以耗时长的操作就放在下半部,两个的界限并不是很明显,取决于我们要将哪个操作放在上半部还是下半部。下面讨论一下工作队列的原...

2020-05-29 17:26:21 2209

原创 ARM常用汇编指令

1.数据传送指令 【MOV指令】:它的传送指令只能是把一个寄存器的值(要能用立即数表示)赋给另一个寄存器,或者将一个常量赋给寄存器,将后边的量赋给前边的量。 MOV指令的格式为:MOV{条件}{S}目的寄存器,源操作数MOVr1,r0 ; 将寄存器r0的值传送到寄存器r1---->(r0 = r1)MOVpc,r14 ; 将寄存器r14的值传送到pc,常用于子程序返回---->(PC = r14)MOVr1,...

2020-05-16 16:58:50 3377

原创 双向链表

链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。 1.定义双向链表结构typedef struct list_node{ struct list_node *next; struct list_node *prev;}list_t; 2.初始化双向链表llist_init(list_t * l......

2020-05-13 12:43:44 2586

原创 rtthread之小内存管理算法

计算机系统中,变量、中间数据一般存放在 RAM 中,只有在实际使用时才将它们从 RAM 调入到 CPU 中进行运算。一些数据需要的内存大小需要在程序运行过程中根据实际情况确定,这就要求系统具有对内存空间进行动态管理的能力,在用户需要一段内存空间时,向系统申请,系统选择一段合适的内存空间分配给用户,用户使用完毕后,再释放回系统,以便系统将该段内存空间回收再利用。 RT-...

2020-04-25 23:16:08 1420

原创 STM32 USBH CDC开发及应用

USB,是英文 Universal Serial BUS (通用串行总线)的缩写,而其中文简称为通串线是一个外部总线标准,用于规范USB主机与外部设备的连接和通讯。由于项目需要,需要开发基于STM32USB主机(HOST)的CDC的开发,用于编队表演系统中底座跟无人机间的数据交互,同时usb提供了给无人机充电的功能。在做usb主机(HOST)开发之前,我们需要先了解一个概念,USB设备(DEVI......

2020-04-17 22:55:08 6433 13

原创 LwIP协议栈——网络接口管理

最近做的项目涉及到网络协议及应用,准备写文档用于记录一下自己学习过程。我在公司的做产品是无人机编队及基站开发,在整个系统中,我主要负责设备端(无人机,基站)网络通讯这块的软件开发。网络通讯采用4G转以太网和wifi,这两种通讯并不是采用的串口透传,而是采用驱动加上TCP/IP网络协议栈(lwip)。文档主要讨论TCPIP技术,内容参考了TCPIP详解、老衲五木(朱升林)的微博,朱老师写的微博让我...

2019-08-14 16:43:14 1927

空空如也

空空如也

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

TA关注的人

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