- 博客(63)
- 资源 (1)
- 收藏
- 关注
原创 ARMv8-A MacOS调试环境搭建
aarch64 架构的交叉编译器和gdb客户端Visual Studio Code 和 C语言插件qemu。
2024-12-08 00:36:07
1113
原创 运动控制 编码器测速
使用STM32高级定时器的编码器模式对编码器输出的脉冲进行计数,定时器可以根据配置的工作模式对边沿进行计数。在实际使用过程中,直接使用编码器的脉冲计算速度并不稳定,需要对这些数据进行滤波得到更稳稳定的结果。使用冒泡排序将数据从小到大排列,并去掉最大最小值求出平均值,得到一个稳定的输出。本文采用电驱动板为正点原子的直流有刷电机驱动板,由两个半桥组成一个H桥。
2024-11-06 15:49:18
950
原创 运动控制 双轮差速模型轨迹规划
文章目录一、轨迹规划1.1轨迹平滑与轮迹1.2 目标距离1.3 速度限制1.4 候选速度的计算与调整1.5 路径生成二、双轮轨迹2.1 计算梯度2.2 计算偏移轨迹2.3 返回结果一、轨迹规划1.1轨迹平滑与轮迹初始时,我们有一条由若干坐标点构成的机器人运行路径。通过对这些坐标点进行插值,我们可以得到一个更加平滑的轨迹,使得机器人在移动时能够更平稳地过渡。接着,我们基于这条中心轨迹,计算出左轮和右轮的轨迹。这是通过向中心轨迹的左侧和右侧分别偏移一定宽度来实现的。1.2 目标距离对于中心轨
2024-11-04 22:37:42
887
3
原创 运动控制 电机
电机,通常被大家俗称为马达,其核心功能是将电能高效地转换为动能,从而驱动各种机械设备运转。作为现代工业与科技领域中不可或缺的组件,电机广泛应用于生活的各个方面。
2024-11-04 19:08:54
466
原创 Ubuntu22.04 搭建 OpenHarmony 命令行开发环境
在本文中,我们将介绍如何使用命令行工具在你的设备上安装OpenHarmony操作系统。OpenHarmony是一个开源的、面向物联网(IoT)设备的操作系统,它提供了一套全面的开发框架,使得开发者可以更容易地创建和部署IoT应用。
2023-10-24 11:34:51
2505
原创 可变性隔离
假设我们正在设计一个电子商务平台,其中包含以下两个组件:ProductCatalog(产品目录)和ShoppingCart(购物车)。ProductCatalog负责管理产品的信息和库存,而ShoppingCart负责管理用户的购物车内容。在架构设计中,可以通过隔离可变性来将应用程序中的内部服务进行分割,划分为可变组件和不可变组件。不可变组件不修改任何状态,而可变组件则负责修改变量状态并与不可变组件进行通信。
2023-09-21 22:40:48
257
原创 qemu虚拟网卡设置
最近一段时间使用qemu来进行测试,为了方便调试,需要使用nfs和tftp等网络服务,这就必须为qemu添加网卡,通过网络搜索了对应的设置方法如下:在虚拟机添加第二个网卡,并设置为NET模式修改网络管理配置文件 /etc/netplan/01-network-manager-all.yaml修改/etc/qemu-ifup和qemu-ifdown脚本,qemu在启动前会调用该脚本初始化网卡,启动完成后再调用脚本关闭网卡。
2023-07-10 10:08:41
3991
原创 Zephyr stack
k_stack_init:初始化栈对象。k_stack_alloc_init:分配并初始化栈对象。k_stack_cleanup:清理栈对象。k_stack_push:将数据压入栈中。k_stack_pop:从栈中弹出数据。
2023-06-01 23:10:30
487
原创 CANopenNode Master 配置
CANopenNode 是一个开源的免费的开源 CANopen 协议栈。对象字典为任何变量提供清晰灵活的组织。可以直接或通过读/写函数访问变量。NMT从设备启动、停止、复位设备。监控 CANopen 设备的心跳生产者/消费者错误控制。对象字典中的变量可以动态映射到 TPDO,然后根据通信规则进行传输。传输的数据被其他设备当作 RPDO 进行接收。SDO服务器支持对 CANopen 设备内所有对象字典变量的快速、分段和块传输访问。
2023-05-24 22:13:58
2377
4
原创 Zephyr condvar
condvar 是一种同步原语,它允许线程在继续之前等待某个条件变为 true。condvar 功能与event有一些相似,event 可以等待一个或者多个条件满足,而一个条件变量只能等待一个条件满足。根据他们之间的差别,选择出适合应用场景的同步对象。condvar 是一种轻量级的同步对象,可以让程序在某个条件满足之前进入等待,当条件满足之后再继续运行。
2023-05-20 18:29:16
785
原创 Zephyr 设备树中的特殊节点
在zephyr中包含一部分特殊节点,他们的功能各不相同,节点如下:aliases 是对设备树中其他节点起的别名,别名用于为节点提供较短的名称,该名称可用于设备树的其他部分以引用节点。chosen在Zephyr中,chosen节点是一个特殊的设备树节点,用于指定一些系统级别的属性,这些属性可以在系统启动时被引导加载程序(bootloader)或内核使用,在这个特定的设备树文件中,chosen节点支持以下属性:Zephyr 的 devicetree 脚本将/zephyr,user节点作为一种特殊情况进行处理
2023-05-03 11:59:13
996
1
原创 Zephyr mailbox
mailbox 是Zephyr 中的一个内核对象,它提供了增强的消息队列功能,超越了消息队列对象的能力。邮箱允许线程同步或异步地发送和接收任何大小的消息。信箱允许线程,但不允许 ISR,交换消息。发送消息的线程被称为发送线程,而接收消息的线程则被称为接收线程。每个消息只能由一个线程接收(即不支持点对多点和广播消息)。使用邮箱交换的消息是以非匿名方式处理的,参与交换的两个线程知道(甚至指定)另一个线程的身份。消息描述符是一个数据结构,它指定了消息数据的位置,以及消息如何被邮箱处理。
2023-04-20 18:08:16
1360
原创 Zephyr 消息队列
message queue 用于中断和线程之间进行数据传输的一项服务,其本质是一个环形缓冲区,例如串口驱动中通常会使用环形缓冲区来接收数据,缓冲区中每一项的大小是固定的。Zephyr 中的 msgq 是消息队列的具体实现,它需要提供一个缓冲区用于存储数据,缓冲区的大小是缓存项大小的整数倍,与 Zephyr 中的 queue 不同,消息队列写入和读取会拷贝数据。消息队列包含3个重要属性,单条消息的大小,缓冲区最大消息容量,缓冲区对齐大小。定义一个静态缓冲区可使用 K_MSGQ_DEFINE 宏。
2023-04-18 18:23:58
1093
原创 Zephyr mutex
Mutex 实现了一个优先级继承算法,该算法可以将 Mutex 持有者的的任务优先级提高至等待队列中优先级最高的线程同等优先级。Zephyr 中支持互斥操作,由于其本身是支持SMP调度机制的,关中断不能达到独占访问的目的,需要使用一个全局自旋锁来保护持有者线程优先级之类的东西,这不是 k_mutex 中的一部分。
2023-04-17 21:44:34
655
原创 Zephyr events
events 是Zephyr 提供的一种多线程同步方式,其功能和 FreeRTOS 中的 eventGroup 一样,可以用于等待多个用户事件发生。events 对象用于向一个或多个线程发出信号,指示发生了一组自定义事件。线程等待 events 对象,直到另一个线程或 ISR 将所需的事件集发布到事件对象。每次将事件发布到 events 对象时, events 对象会处理等待该事件对象的所有线程以确定是否存在匹配项。等待条件与事件对象中的事件集匹配的所有线程都将被唤醒。
2023-04-13 15:02:16
971
原创 Zephyr 启动流程
在 Cortex-M 系列 MCU 中,如果设置为从 flash 启动,flash 前1K 用于存放中断向量表,其中第一个字为程序栈顶指针,第二个字为复位向量,即 ResetHandler 的地址,boot会将第一个字用于初始化栈顶,第二个字作为中保存的地址作为程序跳转地址,从而跳转到程序中运行,详细说明可参考。, 该机制为Cortex-M 系列 MCU 中独有,与此相对的,不同的芯片在系统启动时对可执行程序都有一定的格式要求,需要在程序的头部添加符合操作规范的头。
2023-04-12 18:31:47
1337
原创 Zephyr spinlock
由于多个CPU之间的内存是共享的,当CPU使用共享资源时需要通过互斥机制获得其使用权,实现其互斥的方式有两种,一种是互斥锁,另一种是自旋锁,两者在同一时间都只能一个持有者,但是在工作方式上有很大区别,互斥锁在获取锁时如果发现资源不可用时会使调用线程进入睡眠,而自旋锁不同,获取互斥锁失败时会在原地等待资源可用,不会使调用线程进入睡眠。自旋锁适用于锁使用者持锁时间比较短的情况,正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。
2023-04-11 10:02:18
411
原创 Zephyr poll
在Zephyr中,polling是一种等待事件的机制,它可以等待多个事件同时发生。在Zephyr中,可以使用k_poll()函数来等待事件。k_poll()函数接受一个k_poll_event数组,数组中的每个元素都描述了一个等待的事件。在等待期间,线程会被阻塞,直到所有事件都发生或等待超时。在等待结束后,k_poll()函数会返回一个整数,表示发生的事件数。
2023-04-04 22:37:33
811
2
原创 Zephyr queue
Zephyr 内核中支持队列操作,该队列是由带头指针和尾指针的单链表组成。并且提供了队列的常见操作方式,和内核中的其他对象一样,向队列中插入数据是不会进行深拷贝的,用户向其中插入数据时需要自己申请动态空间,否则就会造成内存错误。Zephyr 中的队列是链式队列,队列的插入和并不会进行数据的深拷贝,使用时应避免使用栈上的内存,如果传入的对象来自于栈需要仔细考虑同步问题,否则会造成严重错误。
2023-04-02 17:47:24
526
原创 【Linux内存管理概述】
x86的CPU实模式下,段基址表示的是内存物理地址。而保护模式下段基地存放在描述符中,通过选择子加上逻辑地址可以访问对应的指令或数据,而在ARM处理器中没有这两个概念,他们都被称为虚拟地址。KSM(Kernel Samepage Merging)用于将两个完全相同的匿名页面进行合并,当进行写操作时候再将其分开,也就是写时复制。内存中的部分页面可以进行迁移(在页面规整和内存热插拔用到了该技术)。用于分配较大的内存,通常大于2M就可以使用它,在服务器中比较常见。OOM用于去查找内存较多的进程结束运行。
2023-04-02 14:07:18
1034
原创 Zephyr MPU栈保护
MPU在ARMv7m架构中是一个可选的内存保护组件,提供了以下功能:提供8个或者16个内存保护区域优先级依次上升的可重叠保护区域当存在16个保护区域时最高优先级为15当存在8个保护区域时最高优先级为7最低优先级为0访问权限设置向系统输出存储器属性通过MPU可以实施访问规则,特权规则,分离进程。
2023-04-01 10:02:34
709
3
原创 Zephyr out of tree board
在Zephyr中使用west工具进行编译时,会从zephyr/boards目录下寻找用户输入的board,查找成功后再继续进行后续工作,但是在一些情况下,现存的board中存在的配置并不能满足需求,或是使能了一些不需要的功能,这种情况下我们通常需要根据硬件新建board。通常可以在zephyr/boards目录下新建board并添加设备树和kconfig文件,west运行后会根据board名称查找对应的文件夹,将其中的文件添加到编译系统中。
2023-03-30 17:19:09
360
原创 Zephyr UART
与串口相连接的设备通常定义在串口对应的节点下,根据设备的不同为其添加不同的属性。例如使用串口1控制串口蓝牙模块,该模块上除了使用串口,还可以提供一个低电平复位的引脚,此处不做演示,对应的设备树如下:& usart1 {除了设备树,还需要编写对应的绑定文件,下面是uart-bluetooth-module.yaml的内容。
2023-03-27 23:52:13
855
原创 Zephyr MCUBoot
MCUBoot 是可配置的安全引导加载程序,由多个行业领导者维护。ECDSA-P256RSA-2048RSA-3072默认情况下,它支持映像回滚,下载的固件会被试验性地启动一次。初次升级引导时,如果升级映像将自身标记为已确认,则其将被保留为主映像文件。如果升级映像未被确认,则后续引导将回退至 上一个被确认的映像。如果没有可用的有效映像,作为一种安全 预防措施,设备会将自己变砖。
2023-03-21 22:32:29
1036
8
原创 Zephyr DMA
DMA,全称Direct Memory Access,即直接存储器访问,可以在不需要CPU的参与下直接将数据从外设传输到内存,或是从内存传输到外设中,或从内存中的一个位置传输到另一个位置,在如今的大部分CPU中都有它的身影。除了需要DMA控制器,还需要开启DMA的请求,这种请求通常是由外设发起的,例如定时器溢出事件,串口接收数据寄存器非空,当使能了外设中的DMA请求之后,接收到对应事件便会自动触发一次DMA请求。在设备树中会有针对DMA控制器的描述,以STM32为例,下面是设备树中的DMA控制器。
2023-03-19 01:32:57
452
原创 Zephyr pinctrl
某些设备驱动会使用自定义状态而不是标准状态,这种情况下需要在驱动作用域内定义一个自定义状态标识符,标识符以命名风格如下: PINCTRL_STATE_{STATE_NAME} ,其中{STATE_NAME} 是大写的状态名称。如果自定义状态需要在驱动外使用,例如进行动态的引脚配置,这种情况需要将节点标识符放到头文件中公开访问。
2023-03-18 13:53:13
783
原创 Zephyr ADC
在Zephyr中,设备树的编译需要与对应的绑定文件相匹配,如果不知道参数ADC参数如何设置,可通过SOC设备树文件中对应节点的 compatible 属性搜索包含该关键字的 yaml 文件,里面提供了对应的模板和使用实例,哪些属性是必须的,哪些属性是可选的。在Zephyr中,板载的绝大部分的外设默认情况下都是disabled的,如果需要使用某个功能,就需要在overlay中使能对应的节点,并添加外设的初始化参数,某些情况下可能还需要使用 pinctrl 进行IO复用。
2023-03-17 22:01:13
605
原创 模块自动初始化机制
为了能够让业务层直接获取到实例,可将需要自动注册的函数指针放入一个专用的段中,在段前后放置两个变量,系统初始化时将两个变量中间的函数读出并进行调用,被调用函数中包含了设备注册功能,从而自动将设备注册到设备管理器中,应用层通过设备管理器查找对应的设备并返回实例地址,通过该实例可对硬件进行访问。独立看门狗的驱动利用自动初始化机制将实例注册到设备管理器中。此时独立看门狗的接口不变。
2023-03-15 10:15:55
135
原创 Zephyr undefined reference to `__device_dts_ord_<N>‘
【代码】Zephyr __device_dts_ord_<N>
2023-03-15 10:01:35
1109
原创 Zephyr 设备树中的重要属性
以一个字符串代表节点是否被使能,设备树手册中允许该值为 “okay”, “disabled”, “reserved”, “fail”, “fail-sss”,当前Zephyr中仅使用了"okay", “disabled”。从这些例子中可以看出reg属性和单元地址有一些相似,这并不是巧合,reg属性可以看作是比单元地址对设备中可寻址的资源更详细的叙述。用于描述设备地址,对于具体的设备而言是确定的,该属性由一对称作寄存器块的(地址,长度)序列组成,通常使用16进制表示,
2023-03-14 17:12:49
320
原创 Zephyr 设备树访问
在这种情况下,你首先需要定义 DT_DRV_COMPAT,其值为 DT_INST(idx, compat) 中的compat,然后你可以以更简短的方式访问某个实例的属性。使用 DT_PHANDLE(), DT_PHANDLE_BY_IDX(), 或 DT_PHANDLE_BY_NAME()可以将对应的phandle 转换为节点标识,具体取决于使用的属性类型。DT_PHA_HAS_CELL_AT_IDX() 和 DT_PROP_HAS_IDX() 用于检查 phandle 属性中是否存在对应的标识的值。
2023-03-09 21:59:11
692
1
原创 Zephyr 目录结构
Zephyr OS 基于专为资源受限和嵌入式系统设计的小型内核:从简单的嵌入式环境传感器和 LED可穿戴设备到复杂的嵌入式控制器、智能手表和物联网无线应用。允许在编译时定义系统资源,从而减少代码大小并提高资源受限系统的性能。
2023-03-08 11:01:22
749
原创 CANOpen SDO
普通SDO(分段传输)进行下载和上传服务时,应用程序负责将SDO作为一个分段序列进行传输。与此同时,快速SDO也应当得到支持。如果传输的数据长度大于4字节,则应支持SDO分段传输。当使用SDO块下载和SDO块上传服务时,应用程序负责将负责将数据作为一个块的序列传输。
2023-03-05 21:48:13
1547
原创 【嵌入式操作系统-6】延时队列
操作系统使用变量记录时钟节拍,硬件定时器每产生一次中断便加一,无论是32位还是64位,该变量总有溢出的时候,判断任务是否需要唤醒的依据就是当前时钟节拍计数值大于延时队列中任务的下一次唤醒时间,如果下一次唤醒时间是在溢出之后,这种情况下无法进行判断,如果将溢出前后的任务分别放入两个队列则可以避免该问题。xPendingReadyList 当调度器挂起时,所有就绪状态的任务会移出到该队列中,调度器恢复时再将任务从该队列移出到就绪队列中。xSuspendedTaskList 用于保存被挂起和无限等待的任务。
2023-01-18 16:23:24
215
原创 嵌入式实时通讯协议设计与实现
第二种:帧长度不固定,每帧可以分为三个部分,帧头,数据,校验,其中帧头和校验的长度是固定的,数据的长度是可变的,帧头中包含长度信息,当接收完一个完整的帧头后进行解析,通过读取其中的长度信息获取到剩余数据的长度,然后继续接收,直到接收到校验,一帧数据接收完成,然后进行数据的校验,校验成功进行下一步处理,这种情况下接收端在发送前并不清楚需要接收的数据长度,相比第一种协议可拓展性更强,可以用于传输文件等超长信息。数据长度不固定,是可变的,接收端会根据帧头中包含的长度信息接收数据,如果没有数据则直接接收帧尾。
2022-07-03 12:58:57
2151
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人