还未设置个性签名
成为VIP会员 享9项特权: 开通会员

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

关于llist.h文件中的链表宏讲解

一口Linux 来源:一口Linux 作者:一口Linux 2022-07-01 11:58 次阅读

水积春塘晚,阴交夏木繁 ——唐·白居易

链表宏linux内核鸿蒙内核rtos和一些开源代码中用的非常多。链表宏是双向链表的经典实现方式,总代码不超过50行,相当精炼。在一些开源框架中,它的数据结构,就是以链表宏为基础进行搭建(如shttpd,一个开源的轻量级、嵌入式服务器框架)。本篇文章将对llist.h文件中的链表宏进行逐个讲解。

1 源码(llist.h)

llist.h文件的全部源码如下:

#ifndefLLIST_HEADER_INCLUDED
#defineLLIST_HEADER_INCLUDED

/*
*Linkedlistmacros.
*/
structllhead{
structllhead*prev;
structllhead*next;
};

#defineLL_INIT(N)((N)->next=(N)->prev=(N))

#defineLL_HEAD(H)structllheadH={&H,&H}

#defineLL_ENTRY(P,T,N)((T*)((char*)(P)-offsetof(T,N)))

#defineLL_ADD(H,N)
do{
((H)->next)->prev=(N);
(N)->next=((H)->next);
(N)->prev=(H);
(H)->next=(N);
}while(0)

#defineLL_TAIL(H,N)
do{
((H)->prev)->next=(N);
(N)->prev=((H)->prev);
(N)->next=(H);
(H)->prev=(N);
}while(0)

#defineLL_DEL(N)
do{
((N)->next)->prev=((N)->prev);
((N)->prev)->next=((N)->next);
LL_INIT(N);
}while(0)

#defineLL_EMPTY(N)((N)->next==(N))

#defineLL_FOREACH(H,N)for(N=(H)->next;N!=(H);N=(N)->next)

#defineLL_FOREACH_SAFE(H,N,T)
for(N=(H)->next,T=(N)->next;N!=(H);
N=(T),T=(N)->next)

#endif/*LLIST_HEADER_INCLUDED*/

2 注解

在llist.h中,所用到的链表是双向链表,其节点结构定义如下。在此节点结构中,其只包含了两个指针域,一个指向直接前驱,一个指向直接后继,没有定义数据域。

structllhead{
structllhead*prev;
structllhead*next;
};

2.1 LL_INIT(N)

宏LL_INIT的定义如下,其作用是将所传入指针N的两个指针域(N)->next和(N)->prev都指向N。目的是完成单个节点的初始化工作,如下图示意了该过程。a65a4bbc-f8f1-11ec-ba43-dac502259ad0.png

#defineLL_INIT(N)((N)->next=(N)->prev=(N))

2.2 LL_HEAD(H)

宏LL_HEAD的定义如下,直接将宏LL_HEAD展开,其意图很明显是定义一个新链表H(H表示为传入宏的参数名),并且将H的两个指针域,都初始化为H地址本身,如下图示意了该过程。a660f502-f8f1-11ec-ba43-dac502259ad0.png

#defineLL_HEAD(H)structllheadH={&H,&H}

2.3 LL_ENTRY(P,T,N)

宏LL_ENTRY的定义如下,其依赖于宏offsetof。下面先对宏offsetof进行详细描述,其功能描述为:

C语言的offsetof()宏,是定义在stddef.h。用于求出一个struct或union数据类型的给定成员的size_t类型的字节偏移值(相对于struct或union数据类型的开头)。offsetof()宏有两个参数,分别是结构名与结构内的成员名。——维基百科

#defineLL_ENTRY(P,T,N)((T*)((char*)(P)-offsetof(T,N)))

#defineoffsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBER)

为了更好的理解宏offsetof,下面按照宏的定义来进行拆解说明。

((TYPE *)0):取整数零并将其强转换为指向TYPE的指针。

((TYPE *)0)->MEMBER):引用指向结构成员MEMBER。

&((TYPE *)0)->MEMBER):取出MEMBER的地址。

((size_t) &((TYPE *)0)->MEMBER):将结果转换为适当的数据类型。

由于该结构体是以0地址开头,所以最后该宏返回的结果就是该成员相对于结构体开头的偏移量。有了对宏offsetof的理解,再来看宏LL_ENTRY就比较好理解了。宏LL_ENTRY的功能是,根据结构体变量(T)中的域成员变量(N)的指针(P)来获取指向整个结构体变量的指针,下面来做拆解说明:

offsetof(T, N):计算成员N相对于其结构体T开头的偏移量。

((char *)(P):将指针P强转为字符指针类型,保证其做+/-运算时是以字节为单位。

(char *)(P) - offsetof(T, N)):P为成员N的指针,减去偏移量,指针到了结构体开头位置。

((T *)((char *)(P)- offsetof(T, N))):将指针强转,得到了整个结构体指针。

宏LL_ENTRY的作用和linux中的宏container_of作用基本一样,该宏定义如下:

#definecontainer_of(ptr,type,member)({
consttypeof(((type*)0)->member)*__mptr=(ptr);
(type*)((char*)__mptr-offsetof(type,member));})

2.4 LL_ADD(H, N)

宏LL_ADD的定义如下,其作用是向双向链表H的头部添加节点N。根据LL_ADD定义的语句顺序,对照着图片分析,会更加清晰。如下图,上面这张图片展示了添加节点N之前的结构,下图展示了添加节点N之后的结构。a66c3764-f8f1-11ec-ba43-dac502259ad0.pnga67d99fa-f8f1-11ec-ba43-dac502259ad0.png

#defineLL_ADD(H,N)
do{
((H)->next)->prev=(N);
(N)->next=((H)->next);
(N)->prev=(H);
(H)->next=(N);
}while(0)

2.5 LL_TAIL(H, N)

宏LL_TAIL的定义如下,其作用是将节点N添加到双向链表H的尾部。宏LL_TAIL的定义如下,其作用是向双向链表H的头部添加节点N。根据LL_TAIL定义的语句顺序,对照着图片分析,会更加清晰。如下图,上面这张图片展示了添加节点N之前的结构,下图展示了添加节点N之后的结构,可以和LL_ADD的结果进行对照。

#defineLL_TAIL(H,N)
do{
((H)->prev)->next=(N);
(N)->prev=((H)->prev);
(N)->next=(H);
(H)->prev=(N);
}while(0)

2.6 LL_DEL(N)

宏LL_DEL的定义如下,其作用是将节点N从双向链表中删除,并且节点N回到初始状态(其指针仅指向自身,不再指向其它地方)。

#defineLL_DEL(N)
do{
((N)->next)->prev=((N)->prev);
((N)->prev)->next=((N)->next);
LL_INIT(N);
}while(0)

2.7 LL_EMPTY(N)

宏LL_EMPTY的定义如下,其作用是判断链表N是否为空链表,返回布尔值false/true。如果节点的直接后继next指向其自身,就认为其为空节点。

#defineLL_EMPTY(N)((N)->next==(N))

2.8 LL_FOREACH(H,N)

宏LL_FOREACH的定义如下,其作用是在双向链表H中,循环遍历出节点。

#defineLL_FOREACH(H,N)for(N=(H)->next;N!=(H);N=(N)->next)

2.9 LL_FOREACH_SAFE(H,N,T)

宏LL_FOREACH_SAFE的定义如下,其作用是在双向链表H中,循环遍历出节点N,因为其有提前存储N的下一个节点T。即使N节点被清理掉,也不影响其下一个节点的遍历,所以该宏一般用来做循环清除双向链表中节点的操作,而宏LL_FOREACH仅用来遍历双向链表。

#defineLL_FOREACH_SAFE(H,N,T)
for(N=(H)->next,T=(N)->next;N!=(H);
N=(T),T=(N)->next)

3 使用案例

有人可能会有疑惑,这个双向链表定义如此简单,只有前驱和后继两个指针,甚至连数据域都没有,那实际该如何使用呢?这个可能就是这组双向链表宏的精妙之处。其在使用过程中并不需要数据域,而是通过指针将结构体串联成双向链表,并且通过该指针借助 LL_ENTRY宏 能还原出该结构体指针,从而达到操作具体结构体的目的。

如下例子虽然不是完整能跑的程序,但是足够说明双向链表宏的关键用法。程序源码如下,现对照代码,描述双向链表宏的大致使用步骤:

定义一个结构体,结构体中必须包含struct llheadlink;双向链表节点,这是后续能通过遍历双向链表节点,还原出该结构体指针的关键;

通过LL_HEAD(listeners);,创建一个双向链表的头为listeners;

在具体逻辑中,肯定有地方通过LL_TAIL(&listeners, &l->link);或者LL_ADD(H, N),向双向链表的头listeners添加节点;

在需要操作1.所定义的结构体时,通过LL_FOREACH(&listeners, lp)遍历出节点指针;

这是最精华的一步,通过4.遍历出来的节点,传入宏LL_ENTRY(lp, struct listener, link);中,还原出节点所在的结构体指针,根据逻辑的需要对结构体进行具体相应的操作;

通过宏LL_FOREACH_SAFE来遍历双向链表,LL_DEL来删除遍历出来的节点,达到清空链表的作用。

structllhead{
structllhead*prev;
structllhead*next;
};

structlistener{
structllheadlink;
structshttpd_ctx*ctx;/*Contextthatsocketbelongs*/
intsock;/*Listeningsocket*/
intis_ssl;/*ShouldbeSSL-ed*/
};

staticLL_HEAD(listeners);/*Listoflisteningsockets*/

structlistener*l;
LL_TAIL(&listeners,&l->link);

structllhead*lp;
LL_FOREACH(&listeners,lp){
l=LL_ENTRY(lp,structlistener,link);
FD_SET(l->sock,&read_set);
if(l->sock>max_fd)
max_fd=l->sock;
DBG(("FD_SET(%d)(listening)",l->sock));
}

structllhead*lp,*tmp;
LL_FOREACH_SAFE(&listeners,lp,tmp){
l=LL_ENTRY(lp,structlistener,link);
(void)closesocket(l->sock);
LL_DEL(&l->link);
free(l);
}

4 总结

LL_ENTRY(P,T,N)宏是这一组宏的核心,其在具体使用中的功能可以概括为,通过传入链表节点P,还原出节点所在结构体的指针,进而能对结构体进行相应操作

这一组双向链表宏其实形成的是一个循环双向链表;

这些宏最初是极客写出的,后来在Linux内核中被推广使用。

原文标题:嵌入式开发中100%会用的几个宏,建议收藏

文章出处:【微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静
  • 嵌入式
    +关注

    关注

    3675

    文章

    14922

    浏览量

    260788
  • 服务器
    +关注

    关注

    10

    文章

    4538

    浏览量

    76730
  • 开源框架
    +关注

    关注

    0

    文章

    26

    浏览量

    9014
  • 开源代码
    +关注

    关注

    0

    文章

    12

    浏览量

    2215
收藏 人收藏

    评论

    相关推荐

    深度对比Python并发方案适用场景和优缺点

    并发和并行的区别先不提,最后会借着例子更好的解释,另外稍后也会提到 concurrent.futur....
    发表于 08-07 16:36 16次 阅读
    深度对比Python并发方案适用场景和优缺点

    讲一讲选择公共DNS需要关注的事情

    无论我们是 PPPoE 拨号上网,还是 DHCP 连接光猫上网,互联网服务提供商(ISP)都会下发两....
    的头像 马哥Linux运维 发表于 08-07 09:40 158次 阅读

    未知服务器-无法使项目在线托管

    在向导的Zip File Options页面,找到Managed Projects位置,从这里你可以....
    的头像 Altium 发表于 08-05 15:12 56次 阅读

    程序员不知不觉中如何搞垮一个项目?

    第五,接口调用过期时间调大一些,再加上一个 100 次的失败重试的循环,不用缓存,尽量让巨量的访问请....
    的头像 city_prolove 发表于 08-05 14:45 59次 阅读

    ARM服务器构架&开源软件系统分享

    ...
    发表于 08-05 14:18 992次 阅读

    cURL的使用方法

    curl 是常用的开源命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 U....
    的头像 一口Linux 发表于 08-05 11:54 130次 阅读

    微软VS Code Server 体验版使用方法

    根据微软介绍,通过Visual Studio Code Server,用户能够将服务器安装在本地或云....
    的头像 city_prolove 发表于 08-05 11:21 88次 阅读

    服务器硬件与RAID磁盘阵列详解

    把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能....
    的头像 city_prolove 发表于 08-05 10:41 111次 阅读

    关于i.MX6ULL配置GPIO

    正如学习C语言时写的第一段代码都是“HelloWorld!”,接触一款新的处理器时往往是从点亮一个LED开始;而点亮一个LED,...
    发表于 08-05 10:37 1082次 阅读

    没有accept,能建立TCP连接吗?

    服务端代码,对socket执行bind方法可以绑定监听端口,然后执行listen方法后,就会进入监听....
    的头像 city_prolove 发表于 08-05 10:37 105次 阅读

    快进到GaN数据中心

    “硅芯片”一直是数据革命的支柱——实际上是推动者——无论是在 CPU、GPU、内存、网络等的数据处理....
    的头像 五斤麻辣油 发表于 08-05 08:04 51次 阅读
    快进到GaN数据中心

    Infineon-Amber合作实现硅架构中的电力数字控制

    英飞凌科技和 Amber 宣布了一项合作,将见证 Amber 在硅架构中的电力数字控制技术的商业化。
    发表于 08-04 16:38 13次 阅读
    Infineon-Amber合作实现硅架构中的电力数字控制

    基于Eclipse paho-mqtt源码包的MQTT客户端设计(上)

    MQTT 软件包介绍 Paho MQTT 是 Eclipse 实现的 MQTT 协议的客户端,本软件包是在 Eclipse paho-mqtt 源码包的基...
    发表于 08-04 16:28 2347次 阅读

    下一代低功耗嵌入式设计

    如今,低功耗嵌入式系统的创新与电池创新直接相关,这创造了许多有趣的系统和应用。Maxim Integ....
    发表于 08-04 15:37 25次 阅读
    下一代低功耗嵌入式设计

    试用体验 | 飞凌嵌入式OK3568-C开发板测评

    OK3568-C开发板是飞凌嵌入式新推出的嵌入式开发板,采用核心板+底板的分体式设计,基于 Rockchip RK3568 处理器设计,该处...
    发表于 08-04 14:21 4157次 阅读

    《中国综合算力指数》等四大白皮书在首届算力大会上重磅发出

    算力大会 | 中国算力白皮书 东数西算 | 中国存力白皮书 中国运力白皮书 | 中国综合算力指数 近....
    的头像 GPU视觉识别 发表于 08-04 12:01 274次 阅读
    《中国综合算力指数》等四大白皮书在首届算力大会上重磅发出

    GPS卫星同步时钟对时方法及应用

    GPS对时装置由GPS接收器和扩展部分构成,GPS接收器负责接收来自卫星上的信号,并能自动补偿信号在....
    的头像 syn029 发表于 08-04 11:13 124次 阅读

    基于超宽带传感器和惯性测量单元融合的定位算法

    基于自组织的分布式网络管理模型如图1所示,主要由3部分组成:网管服务器、分布式网络代理(Distri....
    的头像 MEMS 发表于 08-04 11:05 123次 阅读

    虹科物联网数据采集与监控方案在石油罐区的应用

    2022年7月,为期3天的2022年中国国际石油石化技术装备展览会在深圳国际会展中心圆满落下帷幕。本....
    发表于 08-04 10:56 60次 阅读

    移动嵌入式解决方案电池

    在几乎由于 COVID-19 而发生的嵌入式世界上,VARTA 推出了下一代 CoinPower A....
    的头像 yqdedli 发表于 08-04 09:37 79次 阅读
    移动嵌入式解决方案电池

    数据中心技术转变给连接带来的影响

    数据中心的体量仍在不断增加,对于云存储需求也在不断增加,其中有一个组件必须保持稳定,就是电力连接。数....
    发表于 08-04 09:24 52次 阅读

    小编科普几种查看网络带宽的方法

    有些时候我们的网络缓慢并不是由远程服务器或路由器所引起的,有可能是因为系统中的某些进程占用了太多可用....
    的头像 冬至配饺子 发表于 08-03 17:57 434次 阅读
    小编科普几种查看网络带宽的方法

    为什么NVMe/TCP是数据中心的更优选择

    自从NVMe作为高性能固态硬盘(SSD)的最新协议出现以来,已经改变了存储行业。
    发表于 08-03 16:25 36次 阅读

    新手必备:STM32指导教程+标准例程大全

    资料内容包括正点原子的STM32开发板资料合集,STM32开发板入门教程(含17个实例),正在学习正点原子的STM32开发板,这...
    发表于 08-03 15:33 5485次 阅读

    S7-1200 MODBUS TCP通信多请求处理的方法介绍

    方法一:如果 TCP 连接充裕,可以建立多个不同的连接发送请求,即每个请求使用一个独立的连接,调用独....
    的头像 机器人及PLC自动化应用 发表于 08-03 11:23 73次 阅读

    MODBUS TCP通信功能的使用概述

    Modbus TCP是标准的网络通信协议,通过CPU上PN接口进行TCP/IP通信,不需要额外的通信....
    的头像 机器人及PLC自动化应用 发表于 08-03 11:16 102次 阅读

    如何访问1500S OPC UA服务器系列

    第1步:登录1515SP PC2 Windows系统,进入“控制面板->网络和 Internet -....
    的头像 机器人及PLC自动化应用 发表于 08-03 11:13 75次 阅读

    云从科技人机协同操作系统与华为Atlas 800推理服务器完成兼容性测试

    近日,基于昇腾AI,云从科技的人机协同操作系统(CWOS)完成与华为Atlas 800推理服务器的兼....
    的头像 华为计算 发表于 08-03 09:52 197次 阅读

    碳化硅嵌入式漏极 MOSFET 助力“登月火星”任务

    晶圆键合是一种广泛用于开发和成功生产微机械传感器和执行器 (MEMS) 的工艺。由于它能够通过多个晶....
    发表于 08-03 09:38 34次 阅读
    碳化硅嵌入式漏极 MOSFET 助力“登月火星”任务

    求助,CH579工作在DHCP模式时socket重连怎样操作才比较标准?

    CH579工作在DHCP模式,通过MQTT连接外界服务器,网络存在各种异常情况导致MQTT掉线,CH579如何重连比较可靠呢?...
    发表于 08-03 09:28 60次 阅读

    CXL将如何改变数据中心

    但是,作为解决这个问题的几个竞争标准之一,OpenCAPI 从未在业界引起轰动。作为一个诞生于IBM....
    的头像 city_prolove 发表于 08-03 09:22 75次 阅读

    需要标准来热覆盖窗户

    墙壁的俯视图如下图 所示。窗户(深蓝色)通过金属板(红色)连接到木框架(棕色)。热盖组件(绿色)压在....
    的头像 京五环以外 发表于 08-03 08:04 41次 阅读
    需要标准来热覆盖窗户

    逐一介绍Linux各个系统的特点以及应用场景

    Buildroot Buildroot 是 Linux 平台上一个构建嵌入式 Linux 系统的框架。 它可以和编译 Linux 内核一样,通过 menuconfig...
    发表于 08-02 16:42 1914次 阅读

    在Linux/U-Boot里为QSPI Flash使用UBIFS

    UBIFS是更强壮的FLash文件系统。很多嵌入式系统都使用了UBIFS。Xilinx PetaLi....
    发表于 08-02 15:51 15次 阅读

    创新技术推动快速部署新型 5G 产品

    5G 产业潜力巨大,但行业如何才能克服成本、功耗与性能等相关挑战,确保 5G 在第二次浪潮中大获成功....
    的头像 树没了派 发表于 08-02 15:31 204次 阅读
    创新技术推动快速部署新型 5G 产品

    “添加”少许FPGA :Arduino和Raspberry Pi新玩法

    Arduino和Raspberry Pi开发板是颠覆嵌入式系统开发方式的登峰造极之作。从前,嵌入式系....
    发表于 08-02 15:26 64次 阅读
    “添加”少许FPGA :Arduino和Raspberry Pi新玩法

    一种在线修改Xilinx FPGA嵌入式RAM比特流的方法

    今天给大家推荐今年FCCM2021上的一篇文章,介绍了一种可以在线Xilinx FPGA内部RAM内....
    发表于 08-02 15:15 124次 阅读
    一种在线修改Xilinx FPGA嵌入式RAM比特流的方法

    上海控安SmartRocket系列:嵌入式软件智能化测试工具

    SmartRocket TestGrid嵌入式软件智能化测试工具支持国军标、MISRA 等静态分析、....
    的头像 上海控安 发表于 08-02 14:53 81次 阅读

    2022年全球mcu厂商排名情况分析

    用于嵌入式控制和计算功能的单芯片微控制器无处不在,并继续被设计到更多系统中。MCU的大部分新增长是由....
    的头像 单片机开发宇凡微 发表于 08-02 14:46 177次 阅读

    基于分类目标的预训练卷积神经网络

    随着社交媒体和物联网(IoT)等数字技术以及5G等速度更快的无线通信技术的普及,数据创建速度不断提高....
    的头像 新机器视觉 发表于 08-02 11:44 105次 阅读

    如何选择(集成)嵌入式热敏打印机

    各种自助终端机在集成嵌入式热敏打印机时候应该考虑和关注哪些因素和技术点
    的头像 donnwe 发表于 08-02 11:07 101次 阅读
    如何选择(集成)嵌入式热敏打印机

    iWave的Zynq UltraScale+ MPSoC SOM支持万兆以太网功能

    以太网技术继续向更高、更优的性能和功能水平不断迈进。万兆以太网 (GbE) 有望满足苛刻的市场需求,....
    的头像 王涛 发表于 08-02 08:03 53次 阅读
    iWave的Zynq UltraScale+ MPSoC SOM支持万兆以太网功能

    使用SOM的方法和理由

    SOM (System-on-Module) 在随时可投入生产的单块印刷电路板 (PCB) 上提供嵌....
    的头像 fdjslkjd 发表于 08-02 08:03 50次 阅读

    一种用于快速原型开发的嵌入式系统架构

    本文重点介绍分立式微控制器 (MCU) 和分立式现场可编程门阵列 (FPGA) 的组合,展示了这种架....
    发表于 08-02 08:03 57次 阅读
    一种用于快速原型开发的嵌入式系统架构

    构建BittWare的数据包解析器

    BittWare的SmartNIC Shell和BittWare的Loopback Example的....
    的头像 刘强 发表于 08-02 08:03 43次 阅读
    构建BittWare的数据包解析器

    借助加速图形数据库提高患者疗效

    医疗服务提供商收集的数据量正在不断增长,并正在颠覆当前的数据分析方法。与此同时,跨表格和业务实体联网....
    的头像 莫大康 发表于 08-02 08:03 46次 阅读
    借助加速图形数据库提高患者疗效

    八一精神铸就行家品质,睿控的十年“长征路”

    军旗飘扬,军歌嘹亮。 今年是建军95周年,95年来,人民军队历经硝烟战火,一路披荆斩棘,在巨大牺牲中....
    的头像 话说科技 发表于 08-01 14:32 103次 阅读
    八一精神铸就行家品质,睿控的十年“长征路”

    嵌入式驱动程序设计的五个设计思路

    设计模式是一个用来处理那些在软件中会重复出现的问题的解决方案。开发人员可以选择浪费宝贵的时间和预算从....
    发表于 08-01 11:41 60次 阅读

    图像传感器如何直接影响嵌入式视觉系统

    新的成像应用正在蓬勃发展,从工业4.0中的协作机器人,到无人机消防或用于农业,再到生物特征面部识别,....
    的头像 新机器视觉 发表于 08-01 10:44 119次 阅读

    RabbitMQ的多种交换机类型

    Virtual Host :虚拟主机。相当于MySQL的DataBase,一个Broker上可以存在....
    的头像 马哥Linux运维 发表于 08-01 10:37 127次 阅读

    解读嵌入式USB2 (eUSB2)标准

    嵌入式USB2 (eUSB2) 规格是对USB 2.0规格的补充,前者通过支持USB 2.0接口在1....
    发表于 08-01 10:07 17次 阅读

    如何编写有利于编译器优化的代码

    本篇文章将以国际知名编译器厂商IAR Systems的编译器为例,来解答开发人员在实际工作中常常遇到....
    发表于 08-01 09:43 48次 阅读
    如何编写有利于编译器优化的代码

    如何设计出更高能效的充电桩和服务器应用

    太阳能、电动汽车充电桩、储能、不间断电源(UPS)等能源基础设施,工业控制、人机接口、机器视觉等自动....
    的头像 费加罗 发表于 08-01 08:09 56次 阅读

    【RT-Thread学习笔记】如何抓取终端的网络报文

    【RT-Thread学习笔记】如何抓取终端的网络报文?
    的头像 嵌入式物联网开发 发表于 07-30 13:57 358次 阅读
    【RT-Thread学习笔记】如何抓取终端的网络报文

    【RT-Thread学习笔记】bash和dash-shell

    ​ 最近在工作中遇到一个很奇葩的问题,就是一个嵌入式的SDK编译,它里面执行shell命令的时候,使....
    的头像 嵌入式物联网开发 发表于 07-30 13:49 322次 阅读
    【RT-Thread学习笔记】bash和dash-shell

    【RT-Thread学习笔记】RISC-V汇编基础三大块知识

    【RT-Thread学习笔记】RISC-V汇编基础的三大块知识
    的头像 嵌入式物联网开发 发表于 07-30 11:01 717次 阅读
    【RT-Thread学习笔记】RISC-V汇编基础三大块知识

    【RT-Thread学习笔记】ARM汇编基础的三大块知识

    【RT-Thread学习笔记】ARM汇编基础的三大块知识
    的头像 嵌入式物联网开发 发表于 07-30 10:59 656次 阅读
    【RT-Thread学习笔记】ARM汇编基础的三大块知识

    基于RT-Thread+RA6M4的Lora网关设计方案分享

    1、基于RT-Thread+RA6M4的Lora网关设计 本项目使用RA6M4和Lora模组Ra-01组成简易Lora网关。网关将接收子设备发送的...
    发表于 07-29 14:39 1355次 阅读

    在有root用户和无root用户情况下如何完成jdk的安装

    前言 在Linux系统中,如果需要使用诸如zookeeper等中间件之前,都需要先行在Linux系统中安装jdk。 1、获取jdk安装包 jdk安装...
    发表于 07-28 15:25 1368次 阅读

    每日推荐 | 嵌入式STM32原创征文作品集,DIY自己的DCDC转换器

    大家好,以下为电子发烧友推荐每日好帖,欢迎留言点评讨论~ 1、【社区之星】钱智恒:热爱与坚持,永远是成就自我的不变真理 推...
    发表于 07-28 10:29 5092次 阅读