快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
ADSP-BF561
uclinux-2008r1.5-rc3 (smp patch)
欢迎转载,但请保留作者信息
内核中大量使用container_of这个宏,用以进行数据结构的向上转换,比如这样一段代码:
static int platform_match(struct device * dev, struct device_driver * drv)
{
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
return (strncmp(pdev->name, drv->name, BUS_ID_SIZE) == 0);
}
在这里struct platform_device定义为:
struct platform_device {
const char * name;
u32 id;
struct device dev;
u32 num_resources;
struct resource * resource;
};
注意,在这个结构体里面包含了一个叫device的结构体,可以将struct platform_device称为父结构体,将struct device称为子结构体。
在上述函数中,传递进来的dev指针将指向platform_device这个父结构体中的dev成员,而contianer_of这个宏的作用则在于通过这个结构体成员的指针获得其父结构体的指针,在这里就是platform_device这一结构体的指针。
要达到这一目的很容易,只要将这个成员的指针减去此成员在整个结构体内的偏移量自然就可以了。看看container_of的定义:
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
这个宏定义的第一行构建一个叫__mptr的临时变量,实际上并不是必须的,它的作用只是强制编译器对数据类型进行检查。第二行里面的__mptr实际就是子结构体成员的指针。
偏移量的计算由offsetof宏完成:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
这种方法到处都在用,没什么新奇的。
分享到:
相关推荐
本文将基于“arm.rar_arm uclinux_arm 视频教程_realview uclinux_uclinux_视频 arm”这一资源,对其中涉及的ARM架构、UCLinux操作系统以及相关的视频教程进行详尽的解析。 首先,我们来探讨ARM处理器。ARM...
### uCLinux内核的Console_v0.1 #### 数据结构 在uCLinux内核中,与控制台(console)相关的数据结构可以分为两类:一类是通用定义,与具体的硬件无关;另一类则与特定的体系结构相关。这些结构体共同构成了控制台...
uClinux_dist是一款专为嵌入式系统设计的操作系统发行版,它基于uClinux内核,特别适用于资源受限的硬件平台。 #### 1. 关于本手册 - **目的**: 介绍uClinux_dist的基本概念、构建过程以及常见问题解决方法。 - **...
这是我在STM32上移植UCLINUX的重要的参考文件
《基于ARM7TDMI的uClinux移植》 在嵌入式系统开发中,uClinux是一个广泛使用的实时操作系统,尤其适用于没有MMU(Memory Management Unit)的微处理器,如ARM7TDMI。本教程将深入探讨如何将uClinux操作系统移植到...
这个压缩包"MiniGUI-STR_uClinux.rar_minigui 2440_minigui uclinux_s3c2410_uC"显然包含了MiniGUI在uCLinux上的移植源码,适用于S3C2410处理器。 S3C2410是Samsung公司推出的一款基于ARM920T内核的微处理器,广泛...
《UCLinux内核编译傻瓜教程》是一份专为初学者设计的教程,旨在帮助用户轻松掌握UCLinux内核的编译过程。UCLinux是一种特殊的Linux发行版,它被设计用于嵌入式系统,特别是那些资源有限、没有MMU(Memory Management...
uCLinux是一个轻量级的Linux内核,它被设计用于没有MMU(内存管理单元)的微处理器,使得它能在嵌入式设备上运行。以下是对"交叉编译uCLinux内核"这一主题的详细说明: 1. **交叉编译的概念**: 交叉编译是指在一...
在学习和实践过程中,可以参考"uClinux_led驱动"这个示例项目。该项目中的代码会详细展示如何在uClinux环境下进行设备驱动的编写,包括头文件的包含、函数的调用、结构体的定义等,是理解uClinux驱动编程的绝佳素材...
文章中提到的"www.pudn.com.txt"可能是资料来源的引用,而"uClinux_CAN_Driver"可能是源代码文件或文档。为了进一步学习和实践,你可以下载这些文件,参考其中的代码和文档,按照上述步骤理解和开发CAN驱动。 总结...
### uclinux内核中断处理_v0.1 #### 1.1 中断配置 ##### 1.1.1 中断入口设置 在uclinux内核中,针对ADSP-BF561 CPU的中断处理是通过特定的配置来实现的。这部分配置主要发生在内核初始化阶段,具体来说是在`setup...
标题中的"pppd.zip_linux ppp_uclinux_uclinux ppp_uclinux pppd_www.100.ppp."提到了几个关键元素,包括`pppd`、`linux`、`uclinux`以及`www.100.ppp`。这暗示了我们讨论的是一个关于Linux操作系统,特别是uClinux...
### uclinux内核中断处理_v0.3 #### 数据结构 **1.1 irq_desc** `irq_desc` 结构体是 uclinux 内核为每个中断定义的数据结构,用于描述中断特性及其处理方式。它与硬件无关,提供了一种抽象的方式来管理不同类型...
### uclinux内核中断处理_v0.2 #### 数据结构 在uclinux内核中,为了管理和处理中断事件,定义了几种重要的数据结构,包括`irq_desc`、`irq_chip`以及`ivg_table`等。 ##### irq_desc `irq_desc`是用于描述每个...
在这个阶段,可以加载文件系统,或者从各种介质(如NAND Flash、Nor Flash、SD卡等)加载uClinux内核。 uClinux是为没有MMU的嵌入式系统设计的Linux版本,它对内存管理进行了优化,适应了没有硬件分页机制的环境。...
### uClinux内核编程深度解析 #### uClinux内核概述 uClinux,作为Linux 2.0核心的一个分支,特别设计用于无MMU(Memory Management Unit,内存管理单元)的微控制器环境。它继承了Linux的大多数特性,使得在资源...
### uclinux内核的console_v0.2 #### 数据结构 在uClinux内核中,与console相关的数据结构可以被分为两类:通用定义和特定于架构的定义。通用定义独立于具体硬件,主要用于定义一类硬件的通用参数和接口。而特定于...
本文主要分析了ucLinux内核在ARM7TDMI架构上的移植过程,主要包括以下几个关键步骤: 1. **Bootloader及内核解压**: Bootloader是系统启动的第一部分程序,负责加载内核到内存中。对于ucLinux,内核通常以压缩...
通过这些工具,开发者可以构建出高效、精简的内核和应用程序,适应低功耗、小体积的硬件需求。 在使用arm-uclinux-tools时,首先需要在主机系统上进行环境配置,这通常包括安装交叉编译所需的库和依赖,设置环境...