
zephyr物联网
文章平均质量分 76
zephyr物联网操作系统
lbaihao
zephyr,data structure, algorithm, protocol,darknet,architecture
展开
-
Zephyr单元测试框架:ztest的使用和介绍
这个目录下存放了一些初始化的Test Case,每次你调用twister时它会首先去执行构建这个目录下的所有Test Case,但是不记作你的测试项目里,只是它用于初始化调用,如果这个目录下的Case有任何错误都会使当前的测试失败,它就相当于初始化代码,你可以在这个目录下新建一个Test Case项目用于初始化测试,同时这个目录下的integration/测试Case是最一个简单的Demo示例。原创 2023-04-15 15:49:00 · 1581 阅读 · 0 评论 -
zephyr 信号量semaphores
可以有很多个线程同时等待一个相同的无效的信号量,当信号量变得有效时,最高优先级等待时间最长的线程将获取到信号量。理论上内核允许ISR中去获取一个信号量,但是不要在信号量无效时去等待,可以尝试获取,获取不到就返回。信号多用于同步,比如ISR和线程之间的同步,由ISR释放信号量,由线程等待信号量,这样ISR和线程就能同步执行。任意数量的信号量可以被定义,每个信号量通过他的地址被引用,所以只要你的内存够,那你就随便定义吧。一个是count,表示信号可以被获取(taken)的次数,当这个数是0,代表信号量无效。原创 2023-04-15 14:17:12 · 647 阅读 · 0 评论 -
Zephry DMA驱动使用教程
其次在开发过程中,即便你的DMA和CPU使用的是两个总线,那么也需要注意当DMA在对特定内存地址进行访问时,CPU不要对这个内存进行访问,否则会造成传输失败的情况,因为对于内存芯片来说,同一时间下一个内存单元只能被一个设备选取,当然你可以访问其它地址。source_burst_length uint32_t 多少字节为一块,如8字节为1块则每8字节为一个传输单位,分块传输,源块与目标块要一致。source_address uint64_t/uint32_t 传输块的起始源地址。原创 2023-04-13 10:20:37 · 526 阅读 · 0 评论 -
zephyr线程生命周期
ephyr中线程是使用CPU的最小单位,线程从创建后由zephyr内核进行调度,根据运行和等待资源的状况在几个状态中切换,直到线程终止退出生命周期。原创 2022-09-18 17:12:01 · 469 阅读 · 0 评论 -
zephyr 堆栈
在Zephyr中每个线程的堆栈大小在创建时就已经指定,运行过程中无法再做改变,线程运行的上下文是存放在线程的堆栈中,一旦堆栈被破坏意味着线程的执行上下文被破坏,这将导致线程执行出现不可预期的异常,Zephyr针对可能造成线程破坏的情况提供了保护,监控,预防手段。本文将介绍比较通用的一些堆栈保护技术,这些技术除了在Zephyr上出现外,其它OS也广泛的采用了这些技术。原创 2022-09-18 16:53:12 · 915 阅读 · 0 评论 -
zephyr idle thread
系统的thread有效工作时间是不能占满CPU工作时间的,在其等待的时候有一个idle thread占用CPU,Tickless idle就是将idle thread占用CPU的运行时间转为CPU idle,达到省电的目的。上图示例了一个跑了3个thread: Ta,Tb,Tc。这三个thread根据实际的应用情况调度,在t1,t2,t3这三个时间段这3个thread都不需要工作,在Normal的状态下,Idle thread将占用这3个时间段的CPU,让CPU空转。原创 2022-09-18 15:55:54 · 1184 阅读 · 0 评论 -
Zephyr调度算法
Zephyr维护了1个就绪列队和多个内核对象等待列队。所有就绪线程被放入就绪列队等待调度器来选择线程进入调度,等待信号量,互斥量等其它内核对象的线程,会分别放到对应内核对象的等待列队中,当等待的资源就绪时,将从对应的列队中选出线程使用资源。在Zephyr运行过程中,根据运行的情况任意一个列队中都可能存在多个线程,随时都会有线程会从列队中加入,取出。这些对列队的操作需要满足,Zephyr中提供三种算法用于管理列队,不同的工作环境可以通过配置Zephyr选择不同的算法管理不同的列队。原创 2022-09-18 15:22:21 · 918 阅读 · 0 评论 -
Zephyr 线程阻塞和超时机制分析
kernel 只有一个 ready_q,可被调度的 thread 都被放到 ready_q 中每个需要等待的内核对象都有一个 wait_q, 当 thread 等待该内核对象时,该 thread 会从 ready_q 中移除,放入到等待内核对象的 wait_q 中当内核对象有效时,会将 thread 从 wait_q 中移除又放回 ready_q。原创 2022-09-18 12:52:57 · 288 阅读 · 0 评论 -
zephyr k_poll
它们可以使用运行时初始化器 K_POLL_EVENT_INITIALIZER() 或 k_poll_event_init() 或静态初始化器 K_POLL_EVENT_STATIC_INITIALIZER() 进行初始化。例如,这意味着当 k_poll() 返回并且 poll 事件表明信号量可用时, k_poll() 的调用者必须调用 k_sem_take() 以获取信号量的所有权。当 k_poll() 在循环中调用时,事件状态必须由用户重置为 K_POLL_STATE_NOT_READY。原创 2022-09-14 09:17:52 · 527 阅读 · 0 评论 -
zephyr 单链表
单向链表分为两种,一种是普通的单向链表,一种是带 flag 的单向链表。原创 2022-09-13 22:43:14 · 345 阅读 · 0 评论 -
zephyr k_queue
*如果是采用alloc_append方式的节点,则使用CONTAINER_OF方式获取节点地址,从而获取数据*//*保留,用于queue中data_q链表的节点*/fifo_tx_data1->data = ... /*为data成员装载数据*/_wait_q_t wait_q;原创 2022-09-13 21:31:45 · 267 阅读 · 0 评论 -
Cortex-M3和Cortex-M4 Fault异常基础知识
硬Fault:如果上面的总线Fault、存储器管理Fault、用法Fault的处理程序不能被执行(例如禁能了总线Fault、存储器管理Fault、用法Fault异常或者在这些异常处理程序执行过程中又出现了Fault)则触发硬Fault。如果一个非硬Fault异常被禁能并且相关Fault发生,这时异常会升级为硬Fault。Fault状态寄存器组(SCB->CFSR和SCB->HFSR)和Fault地址寄存器组(SCB->MMAR和SCB->BFAR)包含Fault的详细信息以及异常发生时访问的内存地址。...原创 2022-08-28 09:25:37 · 2611 阅读 · 0 评论 -
I2C 总线设备
I2C 简介I2C(Inter Integrated Circuit)总线是 PHILIPS 公司开发的一种半双工、双向二线制同步串行总线。I2C 总线传输数据时只需两根信号线,一根是双向数据线 SDA(serial data),另一根是双向时钟线 SCL(serial clock)。SPI 总线有两根线分别用于主从设备之间接收数据和发送数据,而 I2C 总线只使用一根线进行数据收发。I2C 和 SPI 一样以主从的方式工作,不同于 SPI 一主多从的结构,它允许同时有多个主设备存在,每个连接到总线原创 2022-05-15 22:46:34 · 3010 阅读 · 0 评论 -
zephyr os SysFatalErrorHandler
/** * * @brief Kernel fatal error handler * * This routine is called when fatal error conditions are detected by software * and is responsible only for reporting the error. Once reported, it then * invokes the user provided routine _SysFatalErrorHan.原创 2022-03-23 20:53:27 · 743 阅读 · 0 评论 -
zephyr 工作队列
摘要 熟悉Linux的童鞋可能对工作队列比较熟悉,zephyr中的工作队列与Linux的工作队列功能类似,用于实现中断的底半部。也就是说中断ISR中比较耗时的操作,放到工作队列中去执行。zephyr中工作队列是基于线程的,简单来说,就是有一个线程一直在等待工作队列的api发来的工作项,当有工作项时(一个待执行的函数)就处理(把函数调用了),当有多个工作项时就按顺序处理,没有工作项时就休眠。1 工作队列线程 Workqueue Threads 工作队列是一个内核对象,用专用的线程以先...原创 2022-03-23 20:23:12 · 860 阅读 · 0 评论 -
Linux内核中链表的实现与应用
链表(循环双向链表)是Linux内核中最简单、最常用的一种数据结构。 1、链表的定义 struct list_head { struct list_head *next, *prev; } 这个不含数据域的链表,可以嵌入到任何数据结构中,例如可按如下方式定义含有数据域的链表: struct my_list { ...原创 2022-03-23 09:42:13 · 591 阅读 · 2 评论 -
zephyr---双向链表dlist
先来看看结点的数据结构:struct _dnode{ union { struct _dnode *head; /* 链表头指针 (sys_dlist_t) */ struct _dnode *next; /* 下一节点指针(sys_dnode_t) */ }; union { struct _dnode *tail; /* 链表尾指针 (sys_dlist_t) */ struct...原创 2022-03-22 15:09:51 · 544 阅读 · 0 评论 -
zephyr死机原因追踪
zephyr死机原因追踪_wanjietiam的博客-优快云博客原创 2022-01-23 14:16:05 · 885 阅读 · 0 评论 -
Zephyr OS内核上下文切换
本文基于nrf52832(arm cortex-m4)进行分析。上下文切换和芯片架构强相关,不同芯片架构的寄存器,堆栈方式,中断使用都不一样,因此本文仅仅对cortex-m系列有较大参考价值。启动第一个thread在Zephyr如何运行到main一文中已经有提到zephyr的main函数是在main thread中被调用的,这里再详细分析zephyr如何切到main thread执行的。编译配置项相关代码基于下面定义进行分析 1234567原创 2022-01-23 10:19:54 · 1210 阅读 · 0 评论 -
zephyr
Zephyr启动过程与中断响应_weixin_30597269的博客-优快云博客原创 2022-01-06 17:29:32 · 104 阅读 · 0 评论 -
zephyr之i2C 和SCCB设备驱动
本文通过分析I2C和SCCB协议内容,说明为何I2C可以用于驱动SCCB设备,并给出了Zephyr下的实现代码。本文所介绍的I2C和SCCB协议内容只是为了说明为何I2C可以驱动SCCB设备,这些内容只是其原本协议的一小部分,更多详细的内容请参考文后链接。I2C和SCCB由于SCCB在数据传输上几乎和I2C一致,大多数情况下大家都将SCCB当作I2C来使用,其实质上二者还是有一定区别的。I2CI2C是飞利浦推出的一种总线协议,最早是在使用在电视上的设备,后面被推广到其它设备。I2C总线由SDA原创 2021-11-05 16:50:24 · 982 阅读 · 0 评论 -
zephyr 消息队列
1 说明 消息队列是实现简单消息队列的内核对象,允许线程和ISR异步发送和接收固定大小的数据项。2 概念可以定义任何数量的消息队列。 每个消息队列都由其内存地址引用。消息队列具有以下关键属性:已发送但尚未收到的数据项的环形缓冲区。数据项大小,以字节为单位。可以在环形缓冲区中排队的最大数量的数据项。消息队列的环形缓冲区必须与N字节边界对齐,其中N是2的幂(即1,2,4,8,…)。为确保存储在环形缓冲区中的消息与此边界相似,数据项大小必须也是N的倍数。消息队列在被使用之...原创 2021-10-12 15:22:07 · 570 阅读 · 0 评论 -
Zephyr Tick Clock
在Zephyr Tick Clock简介一文中分析tick clock的工作原理提到每个tick中断的时候将会调用z_clock_announce,通知现在已经走了一个tick了,同时也提到了tick clock是sheep time和wait timeout的基础设施,本文将分析Zephyr的Timeout模块,说明Zephyr如何管理timeout对象,以及如果驱动timeout。Timeout本身会去驱动Zephyr内核的时间片,本文不对该部分进行分析。同时我们继续以tickless kernel原创 2021-06-08 13:50:54 · 631 阅读 · 0 评论 -
zephyr-双向链表
先来看看结点的数据结构:struct_dnode{union{struct_dnode*head;/*链表头指针(sys_dlist_t)*/struct_dnode*next;/*下一节点指针(sys_dnode_t)*/};union{struct_dnode*tail;/*链表尾指针(sys_dlist_t)*/struct...原创 2021-06-07 11:23:17 · 301 阅读 · 0 评论 -
Zephyr学习(一)线程和调度
前面说过zephyr支持静态和动态两种方式创建线程,这里分析动态创建的方式。应用程序通过调用k_thread_create()函数创建一个线程,实际上是调用_impl_k_thread_create()函数,定义在zephyr-zephyr-v1.13.0\kernel\thread.c:1 k_tid_t _impl_k_thread_create(struct k_thread *new_thread,2 k_thread_stack_t *stack,原创 2021-05-28 09:26:00 · 2324 阅读 · 0 评论 -
Zephyr OS 内核篇:系统启动 - 汇编阶段
不同架构的 CPU 在启动时会略有差别,我们统一以 cortex-m3 为例。茫茫数万行代码,从哪儿入手?通常,CPU 在上电后会发生一个复位异常,此时硬件内部会自动查找异常向量表,然后在该表中查找到复位向量,然后跳转到对应的函数中开始执行。如果时间充裕,建议阅读阅读《Cortex-M3 权威指南》一书,它里面对这一块讲解得比较清楚。向量表cortex-m3 的异常转载 2017-08-18 22:54:27 · 1373 阅读 · 0 评论 -
uCOS-II中的内存管理--C语言构建完整的微型动态内存管理机制
【@.1 指针与动态内存管理】在C语言中的指针若不经过初始化是无法进行操作的,在编译时甚至不会报错,但是一旦运行到这里时就会出现程序错误死机。所以对于指针的操作一定要首先初始化再赋值。考虑如下代码:void foo1(void){ unsigned char * pdata; ... *pdata = 0x0f;}当运行到pdata赋值时由转载 2017-07-06 11:15:23 · 464 阅读 · 0 评论 -
Zephyr 物联网操作系统环境搭建
Zephyr项目构建演示一、环境搭建1、系统环境系统环境Linux version 4.2.0 (root@localhost) (gcc version 5.2.0 (GCC) ) #9 SMP Fri Feb 5 19:34:29 CST 20162、sdk安装下载sdkwget https://nexus.zephyrproject.o转载 2017-04-26 13:55:50 · 2545 阅读 · 0 评论 -
Zephyr Kernel 设备驱动和设备模型(二)
#include #include #include #include "wdt_dw.h"#ifdef WDT_DW_INT_MASKstatic inline void _wdt_dw_int_unmask(void){ sys_write32(sys_read32(WDT_DW_INT_MASK) & INT_UNMASK_IA,原创 2017-04-26 14:22:07 · 1810 阅读 · 0 评论 -
Zephyr Kernel 设备驱动和设备模型(一)
介绍Zephyr 内核支持大量的设备驱动程序。应用程序板级配置的可用设备驱动集合随着所关联的硬件组件和设备驱动软件的变化而变化。Zephyr 的设备模型为配置驱动程序提供了一致的设备模型。设备模型负责初始化配置到系统中的所有驱动。每种类型的驱动程序(UAR,SPI,I2C)都有一个通用类型的API。在这个模型中,当驱动程序初始化时,驱动中会填充指向包含指向它的API 函数的结构的指原创 2017-04-26 14:13:18 · 3102 阅读 · 0 评论 -
Zephyr Kernel v1.7.0 - Mar 11, 2017 发布,实时操作系统
Zephyr 简介 Zephyr 是 Linux 基金会于 2016 年 2 月发布的物联网操作系统,主要面向资源受限的物联网设备。类似这样的 RTOS如 mbed OS, FreeRTOS, Contiki, µC/OS等。来自 Linux 基金会的实时操作系统 Zephyr 最新发布了 v1.7.0 内核。 We are pleased to ann原创 2017-04-26 13:51:21 · 1050 阅读 · 0 评论 -
Zephyr OS之内核调度
第2章 内核调度2.1 线程调度概念 zephyr内核是基于优先级抢占,时间片分配的实时操作系统。每当调度程序切换线程或当ISR打断当前线程运行时,内核首先保存当前线程的CPU寄存器值。当线程恢复运行时,这些寄存器值将被恢复。在操作系统术语里,称为切换上下文。2.1.1 当前线程 CPU当前正在运行的线程,称之为当前线程(curre转载 2017-04-24 22:17:46 · 1056 阅读 · 0 评论 -
IoT的那些操作系统
引子IoT(Internet of Things)一直是个市场没爆发,但炒作够火的概念。 最近看了Brillo(Goolge放出的OS for IoT),再结合手头做的项目,来聊聊打着IoT旗号的那些操作系统及其生态。可以让大家在对此类嵌入式系统软件平台选型时少些困惑。首先,不在这里描述IoT到底是啥,这概念太笼统。但凡事都讲套路,在我看来大部分的IoT操作系统都是顺着这个套路(应用场景)转载 2017-04-24 22:35:42 · 3214 阅读 · 0 评论 -
Zephyr OS之线程
摘要: Zephyr 是 Linux 基金会推出的一个适用于物联网的小型可伸缩的实时操作系统,支持多种处理器架构。Zephyr 是安全的、开源的、模块化的以及支持多种连接方式,将支持 Bluetooth, Bluetooth LE, WiFi, 802.15.4 以及 6Lowpan, CoAP, IPv4, IPv6, and NFC.。参考: https://www.zephyrproject原创 2017-04-24 22:16:29 · 874 阅读 · 0 评论 -
Zephyr OS 内核篇:系统启动 - C 准备阶段
在上一节的最后,代码已经跳转到 _PrepC():void _PrepC(void){ relocate_vector_table(); enable_floating_point(); _bss_zero(); _data_copy(); _Cstart(); CO转载 2017-08-18 22:56:34 · 1959 阅读 · 0 评论 -
Zephyr OS 驱动篇之设备初始化顺序
Zephyr OS 驱动篇之设备初始化顺序在前面的 Zephyr OS 驱动篇之设备驱动模型 中已讲解了 Zephyr OS 中的设备驱动模型。Zephyr OS 将设备分为 PRIMARY、SECONDARY、NANOKERNEL 等五个等级,并在系统启动的相应阶段初始化该等级内的所有设备。那么问题来了,每个等级内有很多设备,它们的初始化时有依赖关系吗,即它们需要按照某个顺序初始化吗?转载 2017-08-18 23:17:47 · 2396 阅读 · 0 评论 -
zephyr学习笔记---CC3200---跑马灯
CC3200 LaunchXL到货,先上图ARM M4内核并集成一块WIFI芯片,不过板上没啥东西,比CC2650DK和CC2650 SensorTag差太远。也不需要太复杂,能用基本的东西就行了。这块板该从哪个地方开始学?一头雾水,先从zephyr自带的例子开始吧,又搞了好长时间,终于把例程\samples\basic\blinky编译完成,并烧到了开发板转载 2017-08-07 15:14:38 · 1097 阅读 · 0 评论 -
GCC 常用编译选项
1. unix 设置编译选项只链接调用的函数1、GCC选项添加COMPILE_FLAGS += -ffunction-sections -fdata-sections2、LD选项添加LDFLAGS += -Wl,-gc-sections2. ARM代码和Thumb代码之间相互调用,归纳如下。 "-mthumb-int原创 2017-12-02 17:24:16 · 5270 阅读 · 0 评论 -
AliOS Things云端物联网操作系统
alios物联网操作系统下载https://github.com/search?utf8=%E2%9C%93&q=alios&type=AliOS Things AliOS家族旗下面向IoT领域的轻量级物联网嵌入式操作系统AliOS Things将致力于搭建云端一体化IoT基础设施,具备极致性能、极简开发、云端一体、丰富组件、安全防护等关键能力,并支持终端原创 2017-10-21 12:59:36 · 8946 阅读 · 0 评论 -
zephyr--堆内存池(heap memory pool)
堆内存池堆内存池(heap memory pool) 是一个预定义的内存池对象,它允许线程像使用 malloc() 那样从一段通用内存区动态地申请内存。概念堆内存池只能定义一个。与其它内存池不同的是,堆内存池不能通过内存地址对其引用。堆内存池的大小是可配置的,支持如下大小:256 字节,1024 字节,4096 字节和 16384 字节。线程可以调用函数 k_mallo原创 2017-09-02 13:04:06 · 1472 阅读 · 0 评论