自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 资源 (1)
  • 收藏
  • 关注

原创 Ubuntu22.04 搭建 OpenHarmony 命令行开发环境

在本文中,我们将介绍如何使用命令行工具在你的设备上安装OpenHarmony操作系统。OpenHarmony是一个开源的、面向物联网(IoT)设备的操作系统,它提供了一套全面的开发框架,使得开发者可以更容易地创建和部署IoT应用。

2023-10-24 11:34:51 1375

原创 可变性隔离

假设我们正在设计一个电子商务平台,其中包含以下两个组件:ProductCatalog(产品目录)和ShoppingCart(购物车)。ProductCatalog负责管理产品的信息和库存,而ShoppingCart负责管理用户的购物车内容。在架构设计中,可以通过隔离可变性来将应用程序中的内部服务进行分割,划分为可变组件和不可变组件。不可变组件不修改任何状态,而可变组件则负责修改变量状态并与不可变组件进行通信。

2023-09-21 22:40:48 182

原创 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 2083

原创 Zephyr stack

k_stack_init:初始化栈对象。k_stack_alloc_init:分配并初始化栈对象。k_stack_cleanup:清理栈对象。k_stack_push:将数据压入栈中。k_stack_pop:从栈中弹出数据。

2023-06-01 23:10:30 373

原创 Zephyr sem

在 Zephyr 中,信号量(semaphore)是一种用于实现任务之间同步和互斥的同步原语。

2023-05-28 21:16:17 1025

原创 CANopenNode Master 配置

CANopenNode 是一个开源的免费的开源 CANopen 协议栈。对象字典为任何变量提供清晰灵活的组织。可以直接或通过读/写函数访问变量。NMT从设备启动、停止、复位设备。监控 CANopen 设备的心跳生产者/消费者错误控制。对象字典中的变量可以动态映射到 TPDO,然后根据通信规则进行传输。传输的数据被其他设备当作 RPDO 进行接收。SDO服务器支持对 CANopen 设备内所有对象字典变量的快速、分段和块传输访问。

2023-05-24 22:13:58 1686 4

原创 Zephyr condvar

condvar 是一种同步原语,它允许线程在继续之前等待某个条件变为 true。condvar 功能与event有一些相似,event 可以等待一个或者多个条件满足,而一个条件变量只能等待一个条件满足。根据他们之间的差别,选择出适合应用场景的同步对象。condvar 是一种轻量级的同步对象,可以让程序在某个条件满足之前进入等待,当条件满足之后再继续运行。

2023-05-20 18:29:16 712

原创 Zephyr 设备树中的特殊节点

在zephyr中包含一部分特殊节点,他们的功能各不相同,节点如下:aliases 是对设备树中其他节点起的别名,别名用于为节点提供较短的名称,该名称可用于设备树的其他部分以引用节点。chosen在Zephyr中,chosen节点是一个特殊的设备树节点,用于指定一些系统级别的属性,这些属性可以在系统启动时被引导加载程序(bootloader)或内核使用,在这个特定的设备树文件中,chosen节点支持以下属性:Zephyr 的 devicetree 脚本将/zephyr,user节点作为一种特殊情况进行处理

2023-05-03 11:59:13 669 1

原创 Zephyr mailbox

mailbox 是Zephyr 中的一个内核对象,它提供了增强的消息队列功能,超越了消息队列对象的能力。邮箱允许线程同步或异步地发送和接收任何大小的消息。信箱允许线程,但不允许 ISR,交换消息。发送消息的线程被称为发送线程,而接收消息的线程则被称为接收线程。每个消息只能由一个线程接收(即不支持点对多点和广播消息)。使用邮箱交换的消息是以非匿名方式处理的,参与交换的两个线程知道(甚至指定)另一个线程的身份。消息描述符是一个数据结构,它指定了消息数据的位置,以及消息如何被邮箱处理。

2023-04-20 18:08:16 524

原创 Zephyr 消息队列

message queue 用于中断和线程之间进行数据传输的一项服务,其本质是一个环形缓冲区,例如串口驱动中通常会使用环形缓冲区来接收数据,缓冲区中每一项的大小是固定的。Zephyr 中的 msgq 是消息队列的具体实现,它需要提供一个缓冲区用于存储数据,缓冲区的大小是缓存项大小的整数倍,与 Zephyr 中的 queue 不同,消息队列写入和读取会拷贝数据。消息队列包含3个重要属性,单条消息的大小,缓冲区最大消息容量,缓冲区对齐大小。定义一个静态缓冲区可使用 K_MSGQ_DEFINE 宏。

2023-04-18 18:23:58 724

原创 Zephyr mutex

Mutex 实现了一个优先级继承算法,该算法可以将 Mutex 持有者的的任务优先级提高至等待队列中优先级最高的线程同等优先级。Zephyr 中支持互斥操作,由于其本身是支持SMP调度机制的,关中断不能达到独占访问的目的,需要使用一个全局自旋锁来保护持有者线程优先级之类的东西,这不是 k_mutex 中的一部分。

2023-04-17 21:44:34 460

原创 Zephyr events

events 是Zephyr 提供的一种多线程同步方式,其功能和 FreeRTOS 中的 eventGroup 一样,可以用于等待多个用户事件发生。events 对象用于向一个或多个线程发出信号,指示发生了一组自定义事件。线程等待 events 对象,直到另一个线程或 ISR 将所需的事件集发布到事件对象。每次将事件发布到 events 对象时, events 对象会处理等待该事件对象的所有线程以确定是否存在匹配项。等待条件与事件对象中的事件集匹配的所有线程都将被唤醒。

2023-04-13 15:02:16 674

原创 Zephyr 启动流程

在 Cortex-M 系列 MCU 中,如果设置为从 flash 启动,flash 前1K 用于存放中断向量表,其中第一个字为程序栈顶指针,第二个字为复位向量,即 ResetHandler 的地址,boot会将第一个字用于初始化栈顶,第二个字作为中保存的地址作为程序跳转地址,从而跳转到程序中运行,详细说明可参考。, 该机制为Cortex-M 系列 MCU 中独有,与此相对的,不同的芯片在系统启动时对可执行程序都有一定的格式要求,需要在程序的头部添加符合操作规范的头。

2023-04-12 18:31:47 761

原创 Zephyr spinlock

由于多个CPU之间的内存是共享的,当CPU使用共享资源时需要通过互斥机制获得其使用权,实现其互斥的方式有两种,一种是互斥锁,另一种是自旋锁,两者在同一时间都只能一个持有者,但是在工作方式上有很大区别,互斥锁在获取锁时如果发现资源不可用时会使调用线程进入睡眠,而自旋锁不同,获取互斥锁失败时会在原地等待资源可用,不会使调用线程进入睡眠。自旋锁适用于锁使用者持锁时间比较短的情况,正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。

2023-04-11 10:02:18 202

原创 Zephyr poll

在Zephyr中,polling是一种等待事件的机制,它可以等待多个事件同时发生。在Zephyr中,可以使用k_poll()函数来等待事件。k_poll()函数接受一个k_poll_event数组,数组中的每个元素都描述了一个等待的事件。在等待期间,线程会被阻塞,直到所有事件都发生或等待超时。在等待结束后,k_poll()函数会返回一个整数,表示发生的事件数。

2023-04-04 22:37:33 592

原创 Zephyr queue

Zephyr 内核中支持队列操作,该队列是由带头指针和尾指针的单链表组成。并且提供了队列的常见操作方式,和内核中的其他对象一样,向队列中插入数据是不会进行深拷贝的,用户向其中插入数据时需要自己申请动态空间,否则就会造成内存错误。Zephyr 中的队列是链式队列,队列的插入和并不会进行数据的深拷贝,使用时应避免使用栈上的内存,如果传入的对象来自于栈需要仔细考虑同步问题,否则会造成严重错误。

2023-04-02 17:47:24 369

原创 【Linux内存管理概述】

x86的CPU实模式下,段基址表示的是内存物理地址。而保护模式下段基地存放在描述符中,通过选择子加上逻辑地址可以访问对应的指令或数据,而在ARM处理器中没有这两个概念,他们都被称为虚拟地址。KSM(Kernel Samepage Merging)用于将两个完全相同的匿名页面进行合并,当进行写操作时候再将其分开,也就是写时复制。内存中的部分页面可以进行迁移(在页面规整和内存热插拔用到了该技术)。用于分配较大的内存,通常大于2M就可以使用它,在服务器中比较常见。OOM用于去查找内存较多的进程结束运行。

2023-04-02 14:07:18 918

原创 vim 基础操作

saveas :bn:bp.N NGggGwe%# 和 *ctr+dctr+uctr+fctr+b。

2023-04-02 14:00:02 1287

原创 Zephyr MPU栈保护

MPU在ARMv7m架构中是一个可选的内存保护组件,提供了以下功能:提供8个或者16个内存保护区域优先级依次上升的可重叠保护区域当存在16个保护区域时最高优先级为15当存在8个保护区域时最高优先级为7最低优先级为0访问权限设置向系统输出存储器属性通过MPU可以实施访问规则,特权规则,分离进程。

2023-04-01 10:02:34 416

原创 Zephyr out of tree board

在Zephyr中使用west工具进行编译时,会从zephyr/boards目录下寻找用户输入的board,查找成功后再继续进行后续工作,但是在一些情况下,现存的board中存在的配置并不能满足需求,或是使能了一些不需要的功能,这种情况下我们通常需要根据硬件新建board。通常可以在zephyr/boards目录下新建board并添加设备树和kconfig文件,west运行后会根据board名称查找对应的文件夹,将其中的文件添加到编译系统中。

2023-03-30 17:19:09 232

原创 Zephyr UART

与串口相连接的设备通常定义在串口对应的节点下,根据设备的不同为其添加不同的属性。例如使用串口1控制串口蓝牙模块,该模块上除了使用串口,还可以提供一个低电平复位的引脚,此处不做演示,对应的设备树如下:& usart1 {除了设备树,还需要编写对应的绑定文件,下面是uart-bluetooth-module.yaml的内容。

2023-03-27 23:52:13 492

原创 Zephyr MCUBoot

MCUBoot 是可配置的安全引导加载程序,由多个行业领导者维护。ECDSA-P256RSA-2048RSA-3072默认情况下,它支持映像回滚,下载的固件会被试验性地启动一次。初次升级引导时,如果升级映像将自身标记为已确认,则其将被保留为主映像文件。如果升级映像未被确认,则后续引导将回退至 上一个被确认的映像。如果没有可用的有效映像,作为一种安全 预防措施,设备会将自己变砖。

2023-03-21 22:32:29 582 8

原创 Zephyr partitions

Zephyr partitions

2023-03-19 23:38:04 327

原创 Zephyr DMA

DMA,全称Direct Memory Access,即直接存储器访问,可以在不需要CPU的参与下直接将数据从外设传输到内存,或是从内存传输到外设中,或从内存中的一个位置传输到另一个位置,在如今的大部分CPU中都有它的身影。除了需要DMA控制器,还需要开启DMA的请求,这种请求通常是由外设发起的,例如定时器溢出事件,串口接收数据寄存器非空,当使能了外设中的DMA请求之后,接收到对应事件便会自动触发一次DMA请求。在设备树中会有针对DMA控制器的描述,以STM32为例,下面是设备树中的DMA控制器。

2023-03-19 01:32:57 218

原创 Zephyr pinctrl

某些设备驱动会使用自定义状态而不是标准状态,这种情况下需要在驱动作用域内定义一个自定义状态标识符,标识符以命名风格如下: PINCTRL_STATE_{STATE_NAME} ,其中{STATE_NAME} 是大写的状态名称。如果自定义状态需要在驱动外使用,例如进行动态的引脚配置,这种情况需要将节点标识符放到头文件中公开访问。

2023-03-18 13:53:13 456

原创 Zephyr ADC

在Zephyr中,设备树的编译需要与对应的绑定文件相匹配,如果不知道参数ADC参数如何设置,可通过SOC设备树文件中对应节点的 compatible 属性搜索包含该关键字的 yaml 文件,里面提供了对应的模板和使用实例,哪些属性是必须的,哪些属性是可选的。在Zephyr中,板载的绝大部分的外设默认情况下都是disabled的,如果需要使用某个功能,就需要在overlay中使能对应的节点,并添加外设的初始化参数,某些情况下可能还需要使用 pinctrl 进行IO复用。

2023-03-17 22:01:13 254

原创 模块自动初始化机制

为了能够让业务层直接获取到实例,可将需要自动注册的函数指针放入一个专用的段中,在段前后放置两个变量,系统初始化时将两个变量中间的函数读出并进行调用,被调用函数中包含了设备注册功能,从而自动将设备注册到设备管理器中,应用层通过设备管理器查找对应的设备并返回实例地址,通过该实例可对硬件进行访问。独立看门狗的驱动利用自动初始化机制将实例注册到设备管理器中。此时独立看门狗的接口不变。

2023-03-15 10:15:55 84

原创 Zephyr undefined reference to `__device_dts_ord_<N>‘

【代码】Zephyr __device_dts_ord_<N>

2023-03-15 10:01:35 576

原创 Zephyr 设备树中的重要属性

以一个字符串代表节点是否被使能,设备树手册中允许该值为 “okay”, “disabled”, “reserved”, “fail”, “fail-sss”,当前Zephyr中仅使用了"okay", “disabled”。从这些例子中可以看出reg属性和单元地址有一些相似,这并不是巧合,reg属性可以看作是比单元地址对设备中可寻址的资源更详细的叙述。用于描述设备地址,对于具体的设备而言是确定的,该属性由一对称作寄存器块的(地址,长度)序列组成,通常使用16进制表示,

2023-03-14 17:12:49 179

原创 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 367 1

原创 Zephyr 目录结构

Zephyr OS 基于专为资源受限和嵌入式系统设计的小型内核:从简单的嵌入式环境传感器和 LED可穿戴设备到复杂的嵌入式控制器、智能手表和物联网无线应用。允许在编译时定义系统资源,从而减少代码大小并提高资源受限系统的性能。

2023-03-08 11:01:22 387

原创 CANOpen SDO

普通SDO(分段传输)进行下载和上传服务时,应用程序负责将SDO作为一个分段序列进行传输。与此同时,快速SDO也应当得到支持。如果传输的数据长度大于4字节,则应支持SDO分段传输。当使用SDO块下载和SDO块上传服务时,应用程序负责将负责将数据作为一个块的序列传输。

2023-03-05 21:48:13 879

原创 【嵌入式操作系统-6】延时队列

操作系统使用变量记录时钟节拍,硬件定时器每产生一次中断便加一,无论是32位还是64位,该变量总有溢出的时候,判断任务是否需要唤醒的依据就是当前时钟节拍计数值大于延时队列中任务的下一次唤醒时间,如果下一次唤醒时间是在溢出之后,这种情况下无法进行判断,如果将溢出前后的任务分别放入两个队列则可以避免该问题。xPendingReadyList 当调度器挂起时,所有就绪状态的任务会移出到该队列中,调度器恢复时再将任务从该队列移出到就绪队列中。xSuspendedTaskList 用于保存被挂起和无限等待的任务。

2023-01-18 16:23:24 166

原创 嵌入式实时通讯协议设计与实现

第二种:帧长度不固定,每帧可以分为三个部分,帧头,数据,校验,其中帧头和校验的长度是固定的,数据的长度是可变的,帧头中包含长度信息,当接收完一个完整的帧头后进行解析,通过读取其中的长度信息获取到剩余数据的长度,然后继续接收,直到接收到校验,一帧数据接收完成,然后进行数据的校验,校验成功进行下一步处理,这种情况下接收端在发送前并不清楚需要接收的数据长度,相比第一种协议可拓展性更强,可以用于传输文件等超长信息。数据长度不固定,是可变的,接收端会根据帧头中包含的长度信息接收数据,如果没有数据则直接接收帧尾。

2022-07-03 12:58:57 1486 2

原创 TCP与UDP

网络基础

2022-06-12 14:28:56 305

原创 KConfig

KConfig语法

2022-06-11 15:00:19 326

原创 【嵌入式操作系统-5】操作系统中的上下文切换

文章目录

2022-05-15 17:02:55 490

原创 【嵌入式操作系统-4】操作系统中的异常处理

文章目录操作系统中需要管理的异常SysTickSVCPendSV操作系统中需要管理的异常在操作系统中需要管理的异常通常有以下几种:外部中断为操作系统提供时钟节拍的时钟中断系统调用(SVC)在这三种异常中时钟节拍和系统调用与操作系统运行直接相关,在操作系统实现中需要根据需求在中断服务函数中完成响应的功能。SysTickSysTick中断是系统定时器持续进行递减,当数值减为时将产生中断,在嵌入式操作系统中通常使用该中断来提供对应的时钟节拍,并查找出是否有需要切换的任务,如果有则将PendSV

2022-05-08 21:54:00 728

原创 【嵌入式操作系统-3】Cortex-M7异常模型

文章目录异常状态异常类型异常处理程序中断向量表异常和返回抢占异常返回Tail-chainingLate-arriving异常状态在Cortex-M7处理器中有四种异常状态不活跃异常没有被处理和挂起挂起异常发生,等待被CPU处理活跃异常正在被CPU处理活跃和挂起CPU正在处理一个异常,但是还有一个与他相同中断源的异常处于挂起状态异常类型异常类型描述复位异常(Reset)复位异常始终有效,他有一个固定的优先级-3不可屏蔽中断(NMI

2022-04-28 23:02:57 1805

原创 【嵌入式操作系统-2】Cortex-M7处理器程序员模型

文章目录Cortex-M7内核外设Cortex-M7处理器软件运行时的处理器模式和特权级两种处理器模式:软件运行时的两种特权等级:非特权级:特权级:栈处理器寄存器Cortex-M7内核外设中断向量控制器NVIC是一种嵌入式的中断控制器,它支持低延迟的中断处理。系统控制模块系统控制模块(SCB)是访问处理器的接口,它提供了包含配置,控制,报告异常信息在内的系统实现和系统控制。系统定时器一个24位的向下计数计数器,可以用作实时操作系统的节拍计时器或者普通计时器。集成指令和数据缓

2022-04-25 23:57:50 2783

stm32f767移植LVGL8.1-正点原子阿波罗

使用正点原子阿波罗开发板移植了LVGL8.1,fatfs,freertos,适配了ILI9341和NT35510两款液晶

2021-11-20

空空如也

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

TA关注的人

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