
Zephyr
文章平均质量分 90
Zephyr3.3内核分析
咕咚.萌西
这个作者很懒,什么都没留下…
展开
-
Zephyr stack
k_stack_init:初始化栈对象。k_stack_alloc_init:分配并初始化栈对象。k_stack_cleanup:清理栈对象。k_stack_push:将数据压入栈中。k_stack_pop:从栈中弹出数据。原创 2023-06-01 23:10:30 · 506 阅读 · 0 评论 -
Zephyr sem
在 Zephyr 中,信号量(semaphore)是一种用于实现任务之间同步和互斥的同步原语。原创 2023-05-28 21:16:17 · 1330 阅读 · 0 评论 -
Zephyr condvar
condvar 是一种同步原语,它允许线程在继续之前等待某个条件变为 true。condvar 功能与event有一些相似,event 可以等待一个或者多个条件满足,而一个条件变量只能等待一个条件满足。根据他们之间的差别,选择出适合应用场景的同步对象。condvar 是一种轻量级的同步对象,可以让程序在某个条件满足之前进入等待,当条件满足之后再继续运行。原创 2023-05-20 18:29:16 · 787 阅读 · 0 评论 -
Zephyr 设备树中的特殊节点
在zephyr中包含一部分特殊节点,他们的功能各不相同,节点如下:aliases 是对设备树中其他节点起的别名,别名用于为节点提供较短的名称,该名称可用于设备树的其他部分以引用节点。chosen在Zephyr中,chosen节点是一个特殊的设备树节点,用于指定一些系统级别的属性,这些属性可以在系统启动时被引导加载程序(bootloader)或内核使用,在这个特定的设备树文件中,chosen节点支持以下属性:Zephyr 的 devicetree 脚本将/zephyr,user节点作为一种特殊情况进行处理原创 2023-05-03 11:59:13 · 1011 阅读 · 1 评论 -
Zephyr mailbox
mailbox 是Zephyr 中的一个内核对象,它提供了增强的消息队列功能,超越了消息队列对象的能力。邮箱允许线程同步或异步地发送和接收任何大小的消息。信箱允许线程,但不允许 ISR,交换消息。发送消息的线程被称为发送线程,而接收消息的线程则被称为接收线程。每个消息只能由一个线程接收(即不支持点对多点和广播消息)。使用邮箱交换的消息是以非匿名方式处理的,参与交换的两个线程知道(甚至指定)另一个线程的身份。消息描述符是一个数据结构,它指定了消息数据的位置,以及消息如何被邮箱处理。原创 2023-04-20 18:08:16 · 1489 阅读 · 0 评论 -
Zephyr 消息队列
message queue 用于中断和线程之间进行数据传输的一项服务,其本质是一个环形缓冲区,例如串口驱动中通常会使用环形缓冲区来接收数据,缓冲区中每一项的大小是固定的。Zephyr 中的 msgq 是消息队列的具体实现,它需要提供一个缓冲区用于存储数据,缓冲区的大小是缓存项大小的整数倍,与 Zephyr 中的 queue 不同,消息队列写入和读取会拷贝数据。消息队列包含3个重要属性,单条消息的大小,缓冲区最大消息容量,缓冲区对齐大小。定义一个静态缓冲区可使用 K_MSGQ_DEFINE 宏。原创 2023-04-18 18:23:58 · 1131 阅读 · 0 评论 -
Zephyr mutex
Mutex 实现了一个优先级继承算法,该算法可以将 Mutex 持有者的的任务优先级提高至等待队列中优先级最高的线程同等优先级。Zephyr 中支持互斥操作,由于其本身是支持SMP调度机制的,关中断不能达到独占访问的目的,需要使用一个全局自旋锁来保护持有者线程优先级之类的东西,这不是 k_mutex 中的一部分。原创 2023-04-17 21:44:34 · 677 阅读 · 0 评论 -
Zephyr events
events 是Zephyr 提供的一种多线程同步方式,其功能和 FreeRTOS 中的 eventGroup 一样,可以用于等待多个用户事件发生。events 对象用于向一个或多个线程发出信号,指示发生了一组自定义事件。线程等待 events 对象,直到另一个线程或 ISR 将所需的事件集发布到事件对象。每次将事件发布到 events 对象时, events 对象会处理等待该事件对象的所有线程以确定是否存在匹配项。等待条件与事件对象中的事件集匹配的所有线程都将被唤醒。原创 2023-04-13 15:02:16 · 1010 阅读 · 0 评论 -
Zephyr 启动流程
在 Cortex-M 系列 MCU 中,如果设置为从 flash 启动,flash 前1K 用于存放中断向量表,其中第一个字为程序栈顶指针,第二个字为复位向量,即 ResetHandler 的地址,boot会将第一个字用于初始化栈顶,第二个字作为中保存的地址作为程序跳转地址,从而跳转到程序中运行,详细说明可参考。, 该机制为Cortex-M 系列 MCU 中独有,与此相对的,不同的芯片在系统启动时对可执行程序都有一定的格式要求,需要在程序的头部添加符合操作规范的头。原创 2023-04-12 18:31:47 · 1429 阅读 · 0 评论 -
Zephyr spinlock
由于多个CPU之间的内存是共享的,当CPU使用共享资源时需要通过互斥机制获得其使用权,实现其互斥的方式有两种,一种是互斥锁,另一种是自旋锁,两者在同一时间都只能一个持有者,但是在工作方式上有很大区别,互斥锁在获取锁时如果发现资源不可用时会使调用线程进入睡眠,而自旋锁不同,获取互斥锁失败时会在原地等待资源可用,不会使调用线程进入睡眠。自旋锁适用于锁使用者持锁时间比较短的情况,正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。原创 2023-04-11 10:02:18 · 430 阅读 · 0 评论 -
Zephyr MPU栈保护
MPU在ARMv7m架构中是一个可选的内存保护组件,提供了以下功能:提供8个或者16个内存保护区域优先级依次上升的可重叠保护区域当存在16个保护区域时最高优先级为15当存在8个保护区域时最高优先级为7最低优先级为0访问权限设置向系统输出存储器属性通过MPU可以实施访问规则,特权规则,分离进程。原创 2023-04-01 10:02:34 · 734 阅读 · 2 评论 -
Zephyr undefined reference to `__device_dts_ord_<N>‘
【代码】Zephyr __device_dts_ord_<N>原创 2023-03-15 10:01:35 · 1150 阅读 · 0 评论 -
Zephyr ADC
在Zephyr中,设备树的编译需要与对应的绑定文件相匹配,如果不知道参数ADC参数如何设置,可通过SOC设备树文件中对应节点的 compatible 属性搜索包含该关键字的 yaml 文件,里面提供了对应的模板和使用实例,哪些属性是必须的,哪些属性是可选的。在Zephyr中,板载的绝大部分的外设默认情况下都是disabled的,如果需要使用某个功能,就需要在overlay中使能对应的节点,并添加外设的初始化参数,某些情况下可能还需要使用 pinctrl 进行IO复用。原创 2023-03-17 22:01:13 · 637 阅读 · 0 评论 -
Zephyr 目录结构
Zephyr OS 基于专为资源受限和嵌入式系统设计的小型内核:从简单的嵌入式环境传感器和 LED可穿戴设备到复杂的嵌入式控制器、智能手表和物联网无线应用。允许在编译时定义系统资源,从而减少代码大小并提高资源受限系统的性能。原创 2023-03-08 11:01:22 · 805 阅读 · 0 评论 -
Zephyr MCUBoot
MCUBoot 是可配置的安全引导加载程序,由多个行业领导者维护。ECDSA-P256RSA-2048RSA-3072默认情况下,它支持映像回滚,下载的固件会被试验性地启动一次。初次升级引导时,如果升级映像将自身标记为已确认,则其将被保留为主映像文件。如果升级映像未被确认,则后续引导将回退至 上一个被确认的映像。如果没有可用的有效映像,作为一种安全 预防措施,设备会将自己变砖。原创 2023-03-21 22:32:29 · 1093 阅读 · 11 评论 -
Zephyr partitions
Zephyr partitions原创 2023-03-19 23:38:04 · 668 阅读 · 0 评论 -
Zephyr poll
在Zephyr中,polling是一种等待事件的机制,它可以等待多个事件同时发生。在Zephyr中,可以使用k_poll()函数来等待事件。k_poll()函数接受一个k_poll_event数组,数组中的每个元素都描述了一个等待的事件。在等待期间,线程会被阻塞,直到所有事件都发生或等待超时。在等待结束后,k_poll()函数会返回一个整数,表示发生的事件数。原创 2023-04-04 22:37:33 · 840 阅读 · 1 评论 -
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 · 723 阅读 · 1 评论 -
Zephyr UART
与串口相连接的设备通常定义在串口对应的节点下,根据设备的不同为其添加不同的属性。例如使用串口1控制串口蓝牙模块,该模块上除了使用串口,还可以提供一个低电平复位的引脚,此处不做演示,对应的设备树如下:& usart1 {除了设备树,还需要编写对应的绑定文件,下面是uart-bluetooth-module.yaml的内容。原创 2023-03-27 23:52:13 · 886 阅读 · 0 评论 -
Zephyr out of tree board
在Zephyr中使用west工具进行编译时,会从zephyr/boards目录下寻找用户输入的board,查找成功后再继续进行后续工作,但是在一些情况下,现存的board中存在的配置并不能满足需求,或是使能了一些不需要的功能,这种情况下我们通常需要根据硬件新建board。通常可以在zephyr/boards目录下新建board并添加设备树和kconfig文件,west运行后会根据board名称查找对应的文件夹,将其中的文件添加到编译系统中。原创 2023-03-30 17:19:09 · 398 阅读 · 0 评论 -
Zephyr pinctrl
某些设备驱动会使用自定义状态而不是标准状态,这种情况下需要在驱动作用域内定义一个自定义状态标识符,标识符以命名风格如下: PINCTRL_STATE_{STATE_NAME} ,其中{STATE_NAME} 是大写的状态名称。如果自定义状态需要在驱动外使用,例如进行动态的引脚配置,这种情况需要将节点标识符放到头文件中公开访问。原创 2023-03-18 13:53:13 · 804 阅读 · 0 评论 -
Zephyr queue
Zephyr 内核中支持队列操作,该队列是由带头指针和尾指针的单链表组成。并且提供了队列的常见操作方式,和内核中的其他对象一样,向队列中插入数据是不会进行深拷贝的,用户向其中插入数据时需要自己申请动态空间,否则就会造成内存错误。Zephyr 中的队列是链式队列,队列的插入和并不会进行数据的深拷贝,使用时应避免使用栈上的内存,如果传入的对象来自于栈需要仔细考虑同步问题,否则会造成严重错误。原创 2023-04-02 17:47:24 · 568 阅读 · 0 评论 -
Zephyr DMA
DMA,全称Direct Memory Access,即直接存储器访问,可以在不需要CPU的参与下直接将数据从外设传输到内存,或是从内存传输到外设中,或从内存中的一个位置传输到另一个位置,在如今的大部分CPU中都有它的身影。除了需要DMA控制器,还需要开启DMA的请求,这种请求通常是由外设发起的,例如定时器溢出事件,串口接收数据寄存器非空,当使能了外设中的DMA请求之后,接收到对应事件便会自动触发一次DMA请求。在设备树中会有针对DMA控制器的描述,以STM32为例,下面是设备树中的DMA控制器。原创 2023-03-19 01:32:57 · 480 阅读 · 0 评论 -
Zephyr 设备树中的重要属性
以一个字符串代表节点是否被使能,设备树手册中允许该值为 “okay”, “disabled”, “reserved”, “fail”, “fail-sss”,当前Zephyr中仅使用了"okay", “disabled”。从这些例子中可以看出reg属性和单元地址有一些相似,这并不是巧合,reg属性可以看作是比单元地址对设备中可寻址的资源更详细的叙述。用于描述设备地址,对于具体的设备而言是确定的,该属性由一对称作寄存器块的(地址,长度)序列组成,通常使用16进制表示,原创 2023-03-14 17:12:49 · 332 阅读 · 0 评论