从kernel和其他opensource 扒出来的常见的宏

高通camera open代码流程(hal到kernel) 内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下... 阅读详情
http://www.xxlinux.com/linux/article/development/soft/20070816/9335.html

比如比较两个数的大小 : 一般我们都习惯了这样写:
#define MAX(a,b) (((a)>(b))?(a)b)) //实际上宏参数计算两次tyLLinux联盟
可是宏是有副作用的, 比如下面这个例子: MAX(a++,b) 又如何呢?
所以kernel里面的gcc扩展提供了很好的办法:tyLLinux联盟
 

#define MAX_CHECK(x,y)     / //宏参数仅仅计算一次tyLLinux联盟
tyLLinux联盟
({                /tyLLinux联盟
    typeof(x) __x = (x);    /tyLLinux联盟
    typeof(y) __y = (y);    /tyLLinux联盟
    (void) (&__x == &__y);    /tyLLinux联盟
    (__x>__y) ?__x:__y    ;/tyLLinux联盟
})注意上面的是语句表达式(就是 用() 括起来) , 当if(MAX_CHECK(10,20) ) 是没有副作用的。 typeof 是个宏, 取出变量的类型tyLLinux联盟

当然上面的宏 按照kernel里面的写法也可以写成这样:

#define MAX_CHECK2(x,y)     /tyLLinux联盟
do{                /tyLLinux联盟
    typeof(x) __x = (x);    /tyLLinux联盟
    typeof(y) __y = (y);    /tyLLinux联盟
    (void) (&__x == &__y);    /tyLLinux联盟
    (__x>__y) ?__x:__y    ;/tyLLinux联盟
}while(0)
//注意可没有;但是用法就不一样了,语句表达返回的是个值 , 但是 这点用 do {} while(0) 格式就不幸了。 tyLLinux联盟
tyLLinux联盟

比如 你可以这样 max = MAX_CHECK(a,b);tyLLinux联盟
但是这样就错了: max = MAX_CHECK2(a,b) ; 编译就出错了。 tyLLinux联盟
但是如果 一行里面直接写 MAX_CHECK2(a,b) 肯定就没有问题了。

---

下面是就是聪kernel里面扒出来的:

 

tyLLinux联盟
#define ARRAY_SIZE(X) ((sizeof((X)))/(sizeof((X)[0])))tyLLinux联盟
#define ALIGN(x,a)         (((x)+(a)-1) & (~((a)-1)))tyLLinux联盟
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))tyLLinux联盟
tyLLinux联盟
#define abs(x) ({                    /tyLLinux联盟
        int __x = (x);                /tyLLinux联盟
        (__x < 0) ? -__x : __x;        /tyLLinux联盟
    })tyLLinux联盟
    tyLLinux联盟
tyLLinux联盟
//太有用的宏了, 一定要掌握tyLLinux联盟
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)tyLLinux联盟

//也非常有用

/**tyLLinux联盟
 * container_of - cast a member of a structure out to the containing structuretyLLinux联盟
 * @ptr:    the pointer to the member.tyLLinux联盟
 * @type:    the type of the container struct this is embedded in.tyLLinux联盟
 * @member:    the name of the member within the struct.tyLLinux联盟
 *tyLLinux联盟
 */
tyLLinux联盟
#define container_of(ptr, type, member) ({            /tyLLinux联盟
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    /tyLLinux联盟
        (type *)( (char *)__mptr - offsetof(type,member) );})tyLLinux联盟
        tyLLinux联盟
        tyLLinux联盟
//#define container_of(ptr,type,member)tyLLinux联盟
tyLLinux联盟
//({                                                            /tyLLinux联盟
tyLLinux联盟
//    const typeof(((type *)0)->member) *__mptr = (ptr);    / //仅仅计算一次tyLLinux联盟
tyLLinux联盟
//    (type *)((char *)__mptr - offsetof(type,member)) ;        /tyLLinux联盟
tyLLinux联盟
//})tyLLinux联盟
tyLLinux联盟
    tyLLinux联盟
tyLLinux联盟
tyLLinux联盟
/**tyLLinux联盟
 * list_entry - get the struct for this entrytyLLinux联盟
 * @ptr:    the &struct list_head pointer.tyLLinux联盟
 * @type:    the type of the struct this is embedded in.tyLLinux联盟
 * @member:    the name of the list_struct within the struct.tyLLinux联盟
 */
tyLLinux联盟
#define list_entry(ptr, type, member) /tyLLinux联盟
    container_of(ptr, type, member)tyLLinux联盟
tyLLinux联盟
//#define abs(x)    ((x) > 0)?(x):(-(x))tyLLinux联盟
tyLLinux联盟
tyLLinux联盟
/*tyLLinux联盟
 * ..and if you can't take the stricttyLLinux联盟
 * types, you can specify one yourself.tyLLinux联盟
 *tyLLinux联盟
 * Or not use min/max at all, of course.tyLLinux联盟
 */
tyLLinux联盟
#define MIN_T(type,x,y) /tyLLinux联盟
    ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })tyLLinux联盟
#define MAX_T(type,x,y) /tyLLinux联盟
    ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })tyLLinux联盟
tyLLinux联盟
#define MAX(x,y)    ( (x)>(y)?(x):(y) )tyLLinux联盟
#define MAX_CHECK(x,y)     /tyLLinux联盟
({                /tyLLinux联盟
    typeof(x) __x = (x);    /tyLLinux联盟
    typeof(y) __y = (y);    /tyLLinux联盟
    (void) (&__x == &__y);    /tyLLinux联盟
    (__x>__y) ?__x:__y    ;/tyLLinux联盟
})






({ /tyLLinux联盟

typeof(x) __x = (x); /tyLLinux联盟

typeof(y) __y = (y); /tyLLinux联盟

(void) (&__x == &__y); /tyLLinux联盟

(__x>__y) ?__x:__y ;/tyLLinux联盟

}) tyLLinux联盟

其中(void) (&__x == &__y);的目的是什么? tyLLinux联盟

tyLLinux联盟

检查两个变量的类型是否相同,如果不相同,编译的时候会有警告。tyLLinux联盟

比如 tyLLinux联盟

int a=8;tyLLinux联盟

flat b = 1.5 ; tyLLinux联盟
鸿蒙开源kernel学习记录(一) 前言 基于鸿蒙开源的code-1.0,学习 鸿蒙kernel代码初识 经常使用的是linux内核,直接看到鸿蒙的代码,没有找到详细的配置说明手册有点摸不清楚从哪入手。 编译环境搭建完成,尝试了编译成功后,决定按照自己的学习方法,先从kernel的编译配置入手,开始学习下鸿蒙的kernel。 在linux中kernel的配置一般使用了arch/arm/config中的配置文件进行配置。那么鸿蒙的kernel是从哪里找到的config呢? 进入鸿蒙的kernel/liteos_a,可以看到目录下有几个文件 Ma 阅读详情

相关推荐

Xiaomi_Kernel_OpenSource:小米手机内核开源

科 设备 Android版 基本标签 链接 仙女座 小米MIX 3 5G Android P LA.UM.7.1.r1-13000-sm8150.0 阿玛尼-jb-oss Redmi 1S Android JB LNX.LA.3.2-09720-8x26.0 Armani-kk-oss Redmi 1S,Redmi Note单卡 Android KK LNX.LA.3.5.2.2.2-00510-8x26.0 阿波罗q-oss Redmi K30S超 Android Q LA.UM.8.12.r1-10600-sm8250.0 秋海棠 Redmi Note 8 Pro Android P MTK 秋海棠 Redmi Note 8 Pro Android Q MTK 炸弹q-oss Redmi 10X,Redmi 10X Pro Android Q MT

【转】高通音频架构学习

音频由于其特殊的工作,使得它的结构特别的复杂,而且在自己的结构基础上还引入了ALSA架构,不过在android系统上所引入的并非完整的ALSA架构而是精简版的tinyalsa,但是就算精简版也是内容相当丰厚。除此,音频还拥有自己的单独的处理器ADSP以及独立的电源管理系统DAPM(便携式动态音频电源管理),使得音频在任何时候都是以最低功耗运行,降低了便携设备的功耗。在某些播放场景甚至不需要CPU的介入,比如接打电话的通过音频,如果手机处于休眠可以不需要唤醒CPU直接传递语音数据。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 2463

STM32F103C8T6键盘DIY全攻略:从电路设计到固件烧录(附避坑指南)

本文详细介绍了基于STM32F103C8T6微控制器的DIY键盘制作全流程,涵盖硬件电路设计、按键矩阵实现、USB HID通信及固件烧录等关键步骤。特别针对常见问题提供避坑指南,帮助开发者高效完成从电路设计到功能实现的完整过程,打造个性化瀚文键盘。

soda5的博客 770

Hyper DBZ贝吉塔设计解析:从角色叙事到战斗系统的深度映射

在游戏开发领域,角色设计与战斗系统的融合是提升玩家沉浸感的关键。其核心原理在于将角色的背景故事、性格特质转化为可操作的战斗机制,实现叙事与玩法的统一。这种设计方法的技术价值在于,它超越了单纯的功能性平衡,通过资源管理、技能性能与角色人格的深度绑定,创造出更具辨识度和情感共鸣的游戏体验。在格斗游戏、动作角色扮演等应用场景中,这种叙事驱动设计能够显著增强角色的独特性和玩家的代入感。以独立游戏 Hyper DBZ 中的贝吉塔为例,其战斗风格精准映射了角色骄傲、激进、渴望证明的核心矛盾,技能如 **Final Fl

weixin_34082789的博客 391

【机器学习】图神经网络(NRI)模型原理和运动轨迹预测代码实现

NRI模型利用VAE和GNN从观测数据中学习系统动态和交互图,展现出在无监督学习、图结构建模、多步预测和连续松弛方面的强大能力。未来工作可探索动态图结构学习、应用于更复杂系统、提高模型泛化能力和计算效率,以及与其他模型的结合。NRI作为新兴的图神经网络方法,在理解和预测相互作用系统方面潜力巨大,有望在各领域发挥重要作用。

MUKAMO的博客 2777

手把手教你用C语言实现GNSS卫星方位角计算(附RTKLIB风格代码解析)

本文详细介绍了如何使用C语言实现GNSS卫星方位角计算,包括从地固坐标系到站心坐标系的转换链条。通过RTKLIB风格的代码解析,展示了XYZ到ENU坐标转换的核心原理和C语言实现框架,帮助开发者掌握卫星方位角和高度角的计算技巧,适用于GNSS观测数据质量分析和精密定位算法开发。

weixin_30699915的博客 364

【Kernel】开源下载和安装教程

【Kernel】开源下载和安装教程 【免费下载链接】Kernel java开发核心包,封装了大量常用的核心方法和工具类,使用这套包能够快速开发java项目 项目地址: https://gitcode.com/coderboot/K...

gitblog_01401的博客 677

目标检测之Mask R-CNN(Pytorch):小白动手实现项目

目标检测之Mask R-CNN:小白动手实现项目Pytorch引言Mask R-CNN原理简述代码、注释及详细解释 引言 首先声明本项目的运行环境。操作系统为Windows,编写环境为Anaconda3 + Jupyter Notebook。Pytorch版本为 torch 1.7.1+cu110 、torchvision版本为 0.8.2+cu110,cuda版本为cu100,显卡为Nvidia 2060。 我是目标检测领域的小白,刚刚完成了Pytorch的相关入门学习任务,所以我认为学习本篇博客的基础

dzc_go的博客 1万+

开源项目 ophub/kernel 常见问题解决方案

开源项目 ophub/kernel 常见问题解决方案 项目基础介绍 ophub/kernel 是一个开源项目,主要用于为 Armbian 和 OpenWrt 系统提供内核支持。该项目包含了多个内核版本,适用于不同的硬件平台,如 amlogic-s9xxx-armbian、amlogic-s9xxx-openwrt、flippy-openwrt-actions 和 unifreq/openwrt_p...

gitblog_09181的博客 1162

LiveReload:释放你的F5,实时预览HTML效果

一、liveReload插件开发背景Web前端开发人员在写页面时,如果修改了HTML or CSS,要想看效果通常的做法就是保存代码就得 Alt+Tab,切换到浏览器(当然,我知道很多开发人员是双屏操作不一定需要切换到浏览器),但是一定要F5刷新才能看自己刚写的代码有没有效果,没有效果就再切换到编辑器下修改,然后再切换到浏览器F5刷新看效果,还没有效果,就再继续修改,如此反复。时间久了,前端自动化...

Char_n的博客 2506

Vue2 - 最新实现接入使用天地图及卫星视图切换功能,在国家天地图上自由切换地图显示类型(卫星视图/地形视图/卫星混合/地形混合/普通视图)vue天地图切换视图显示改成卫星风格,切换地图图层完整代码

vue2,nuxt2,天地图,视图,卫星,地图类型切换,vue天地图,改成卫星视角,在线地图切换,来回切换卫星图,天地图如何实现来回切换卫星图,地形图,卫星视图,vue中使用天地图自定义样式切换地图图层,切换报错,加载出错,卫星图太卡,地图图层更换,vue安装集成天地图详细示例源码,切换地图的样式,在天地图中如何将地图的类型随意更换,提供多种视图模式用户自由点击更换,VUE引入天地图卫星版,详细教程示例源码代码,天地图切换卫星用什么api,卫星视角API方法,vue2卫星天地图,能改地图的显示方式,图层类型

🏆 前端领域优质创作者 4140

开源项目的运行

开源项目运行开源社区开源产品开源协议reference 开源社区 Kernel 内核世界的中心位置,kernel.org是他们的广场。 Sourceforge 全球最大开源软件开发平台和仓库,网站建立的宗旨,就是为开源软件提供一个存储、协作和发布的平台。 SourceForge.net,又称SF.net,由VA Software提供主机,并运行SourceForge软件。 大量开源项目在此落户(截至2009年2月,超过23万的软件项目已经登记使用超过200万注册用户的服务,使SourceForge.net

巴基船长 323

【STM32实物】基于STM32的扫地机器人/小车控制系统设计

扫地机器人系统采用分层结构设计,主要包括底层硬件控制层、中间数据处理层和上层用户交互层。底层硬件控制层负责对各个硬件模块进行控制和数据采集,中间数据处理层负责对采集到的数据进行处理和解算,上层用户交互层负责与用户进行交互并显示系统状态信息。

嵌入式阿齐Archie 1万+

Jupyter MicroPython Kernel 常见问题解决方案

Jupyter MicroPython Kernel 常见问题解决方案 Jupyter MicroPython Kernel 是一个开源项目,它允许用户通过 Jupyter 笔记本与运行 MicroPython 的 ESP8266 或 ESP32 设备进行交互。该项目主要使用 Python 编程语言开发。 新手常见问题及解决方案 问题一:如何安装 Jupyter MicroPython Kerne...

gitblog_00836的博客 504

STM32堆栈溢出问题及解决方法

堆栈是用于存储函数调用和局部变量的内存区域,它是一种先进后出的数据结构。如果函数嵌套层级过深或者局部变量占用的内存空间过大,堆栈的大小可能不足以容纳这些信息,从而导致堆栈溢出。在一些特殊情况下,可以使用堆内存替代堆栈,以避免堆栈溢出问题。在STM32的工程中,可以通过修改链接脚本文件(.ld文件)中的堆栈大小参数来增加堆栈空间。通常,堆栈大小设置为RAM的一小部分,但需要根据具体应用的需求进行调整。堆栈溢出是嵌入式系统开发中常见的问题之一,特别是在使用STM32微控制器时。3.3 使用堆内存替代堆栈。

ZwcCsharp的博客 2593

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

关于如何加入linux kernel开源社区,进行kernel开发

转载两篇关于如何加入linux kernel开源社区,进行kernel开发的文章,希望别人能够看到,共同加入,也希望在kernel这条路上,自己即使遇到再大的挫折,也要坚持走下去... http://www.cppblog.com/flyonok/archive/2011/04/15/144316.html http://tonybai.com/2012/03/27/how-to-part

lucien的博客 5729

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SciJava-Jupyter-Kernel 开源项目安装和使用指南

SciJava-Jupyter-Kernel 开源项目安装和使用指南 目录结构及介绍 当你克隆或下载 scijava-jupyter-kernel 仓库至本地,其根目录下的主要文件夹和文件将包括: src/: 包含项目的主要Java源码。 main/java: 主要Java类存放于此。 main/resources: 存放各种资源文件,比如配置文件。 test/: 包含用于单元测试的所...

gitblog_00667的博客 745

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

探索开源项目 kernel:技术的基石与无限可能

在开源的广袤世界中,有一颗璀璨的明星——kernel(https://gitee.com/openeuler/kernel),它宛如一座技术的宝藏,蕴含着无数的智慧与创新,为众多开发者所瞩目和敬仰。

m0_73629042的博客 1445

Zen-Kernel 开源项目教程

Zen-Kernel 开源项目教程 1. 项目介绍 Zen-Kernel 是一个基于 Linux 内核的开源项目,旨在提供优化和增强的内核版本。它主要关注性能提升、系统稳定性和新特性的集成。Zen-Kernel 通常包含一系列的补丁和修改,以提高用户体验和系统效率。 2. 项目快速启动 环境准备 在开始编译 Zen-Kernel 之前,确保你的系统已经安装了以下依赖: GCC (建议版本 9 或...

gitblog_00332的博客 892

ReDroid Kernel Modules 常见问题解决方案

ReDroid Kernel Modules 常见问题解决方案 一、项目基础介绍 ReDroid Kernel Modules 是一个开源项目,旨在提供运行 ReDroid 实例所需的内核模块。ReDroid 是一个基于 Android 的轻量级虚拟化技术,该项目包含的内核模块支持多种 Linux 发行版,如 Ubuntu 16.04 及以上版本、AmazonLinux 2、Alibaba Clo...

gitblog_00898的博客 1171

Semantic Kernel开发常见问题与解决方案

以上问题覆盖了Semantic Kernel开发的核心挑战。实际开发中,建议参考官方文档获取最新指南。遇到新问题时,先在社区(如GitHub Issues)搜索解决方案。开发时,保持代码模块化,逐步测试每个组件,能显著减少错误。如果需要更多具体示例,可以提供上下文,我会进一步优化!

2501_93878243的博客 1962

微软语义内核(Semantic Kernel)开源项目常见问题解决方案

微软的语义内核(Semantic Kernel)是一个开源SDK,它可以将大型语言模型(LLM)如OpenAI、Azure OpenAI和Hugging Face等与传统的编程语言如C#、Python和Java进行集成。以下是关于该项目的介绍及新手在使用时可能遇到的常见问题解决方案。 ## 项目基础介绍 - **项目名称**:语义内核(Semantic Kernel) - **项目仓库**:[...

gitblog_00125的博客 844

Semantic Kernel:微软开源的AI编排框架架构解析

Semantic Kernel 的架构以Kernel为中心,通过Skills、Planners和Memory实现高效AI编排。它降低了AI应用开发门槛,适合开发者构建模块化、可维护的智能系统。建议参考官方GitHub仓库(https://github.com/microsoft/semantic-kernel )获取最新文档和示例。如需深入某部分(如Planner算法),可进一步讨论!

2501_93878637的博客 1029

一些知名的开源社区

本人一直在学习编程、算法领域的知识,但是经常会遇到一种情况:理论学会了,但编程却无从下手(怎么破~) 无奈之下,本人就在网上找开放源代码社区,从那上面下载源代码,进行学习。这里做下总结: 国内社区 1、Linux中国 Linux中国是广大的Linux爱好者自发建立的以讨论Linux技术,推动Linux及开源软件在中国的发展为目标的技术型社区网站。 Linux中国的...

angengguo7895的博客 2271

SmartPack-Kernel-Manager 常见问题解决方案

SmartPack-Kernel-Manager 是一个开源项目,旨在为用户提供一个强大的工具来管理他们的内核。该项目是基于 Kernel Adiutor 开发的,由 Willi Ye(aka Grarak)开发。SmartPack-Kernel-Manager 提供了许多高级功能,如内核管理、脚本管理、CPU 输入增强、动态 Stune 增强等。该项目主要使用 Java 和 Kotlin 进行开

gitblog_00389的博客 984
上一篇: Linux 进程管理详解
下一篇: socket函数手册
nevercgoodbye
博客等级 码龄18年 6粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值