eCos内核API与内核实现的衔接

news/2024/7/7 20:22:25 标签: ecos, api

mingdu.zheng <at> gmail <dot> com
http://blog.csdn.net/zoomdy/article/details/8884815

 

eCos内核API是以C函数以及C结构体的形式提供的,eCos的内核是使用C++类实现的, kernel/.../src/common/kapi.cxx 将C++类实现衔接到C函数及C结构体,实现C和C++衔接的秘诀在于重构new操作符, new操作符重载的注释称之为 Magic new function,确实挺Magic的。

 

new操作符重载(kernel/.../src/common/kapi.cxx:82

inline void *operator new(size_t size, void *ptr)
{
    CYG_CHECK_DATA_PTR( ptr, "Bad pointer" );
    return ptr;
}

这个神奇函数的实现看起来一点都不神奇,仅仅是将它的第二个参数照搬返回。 new操作符的第一个函数总是被new对象的大小,这里的第二个参数 ptr 是重载附加的。 常规的new实现将会在这里调用malloc函数分配内存空间,然后返回malloc分配的内存空间指针。 仅仅观察这个神奇函数的本身并看不出它的神奇之处,再看看对它的引用吧,以比较简单的互斥量为例。

互斥量初始化函数(kernel/.../src/common/kapi.cxx:1050

externC void cyg_mutex_init(
    cyg_mutex_t        *mutex          /* Mutex to init                      */
) __THROW
{
    CYG_ASSERT_SIZES( cyg_mutex_t, Cyg_Mutex );

    Cyg_Mutex *m = new((void *)mutex) Cyg_Mutex;

    m=m;
}

应用程序在调用cyg_mutex_init前,首先定义一个全局的cyg_mutex_t的结构体,然后将该结构体的地址传递给cyg_mutex_init函数。 也就是说,mutex指针指向一块内存,该内存大小等于cyg_mutex_t结构体的大小。 观察cyg_mutex_init函数的第2行代码,这里的new操作符引用的是上面重载过的new操作符,new操作符的第1个参数总是size而且是自动传入的, 就像C++类成员函数的this参数一样,第2个参数,也就是代码中的第1个参数是指向cyg_mutex_t的指针,再回顾一下重载的new操作符代码, 你看出来了吗?新建的Cyg_Mutex类实例被存储在传入的cyg_mutex_t结构体实例的存储空间内,也就是说Cyg_Mutex实例和cyg_mutex_t实例是重叠的, 我怀疑我是否已经解释清楚,但是我只能解释到这里啦。然后再看这个函数的第1行代码,这行代码检查cyg_mutex_t类型和Cyg_Mutex类型的大小是否一致, 这是必须的,如果Cyg_Mutex类型所需的存储空间比cyg_mutex_t类型多显然会产生内存破坏,不仅大小要一致,连对应的成员变量排列次序都要求是一致的, 但是没有办法让编译器检查两个类型的成员变量排列次序。 可以查看Cyg_Mutex类定义(kernel/.../include/mutex.hxx:66)和cyg_mutex_t结构体定义 (kernel/.../include/kapidata.h:515)手动检查一下这两个类型的成员变量排列次序。

互斥量加锁函数(kernel/.../src/common/kapi.cxx:1066

externC cyg_bool_t cyg_mutex_lock( cyg_mutex_t *mutex ) __THROW
{
    return ((Cyg_Mutex *)mutex)->lock();
}

API传入的是cyg_mutex_t结构体指针,将这个指针转换成Cyg_Mutex类指针, 然后使用该Cyg_Mutex类指针引用Cyg_Mutex类成员函数实现具体的加锁。

 


http://www.niftyadmin.cn/n/1108692.html

相关文章

python注释码_python编码与代码注释

一、内容编码显然ASCII码无法将世界上的各种文字和符号全部表示&#xff0c;所以&#xff0c;就需要新出一种可以代表所有字符和符号的编码&#xff0c;即&#xff1a;UnicodeUnicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码…

学科实践活动感悟50字_学科实践活动感想

最近我们开展了学科实践活动。在这项活动中&#xff0c;我学会了许多新知识和新方法。比如&#xff0c;语文实践活动中&#xff0c;我知道了如何表达&#xff0c;如何选择素材等。在数学实践活动中&#xff0c;我明白了一道题不一定只有一种解法&#xff0c;可能有很多做法&…

eCos的HAL接口采用宏定义形式的优势

mingdu.zheng <at> gmail <dot> comhttp://blog.csdn.net/zoomdy/article/details/8884820 eCos的HAL接口为eCos其它组件提供访问硬件的统一接口&#xff0c;所有的HAL接口都是以宏定义的形式提供的&#xff0c; 采用宏定义的形式有如下优势&#xff1a; 1. 实现接…

nginx安装和遇到的问题

nginx安装步骤和遇到的问题 tar -xvf nginx-1.15.1.tar.gz cd nginx-1.15.1 ./configrue make make install 在configure中可能遇到的问题&#xff1a; (1) ./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by us…

关于同步、异步与阻塞、非阻塞的理解

1、前言 前一段时间出去面试&#xff0c;被问到同步、异步与阻塞、非阻塞的区别。我一时半会没有想出来&#xff0c;作为一个工作三年的人来说&#xff0c;实在很惭愧。我当时理解同步、异步属于两个进程中间的协作关系&#xff0c;例如使用浏览器访问一个网站&#xff0c;需要…

关于Linux系统中文件系统路径的理解(转)

关于Linux系统中文件系统路径的理解(转)[more]  1、Linux文件系统是从/开始的在Linux操作系统的文件管理中&#xff0c;命令行模式&#xff08;在控制台或终端下&#xff09;的文件或目录管理&#xff0c;要涉及路径这一概念&#xff0c;这是Linux命令行操作的最基础的基础。…

iptables nat表含义_详解ip rule,ip route,iptables 三者之间的关系

概述有朋友私信问了iptables和ip route都有路由转发的功能&#xff0c;这中间有什么区别呢&#xff1f;所以后来花了几天时间整理的这方面内容&#xff0c;仅供参考。路由策略 (使用 ip rule 命令操作路由策略数据库)1、ip rule 命令&#xff1a;Usage: ip rule [ list | add |…

java微服务pdf_Java微服务pdf

摘要适读人群 &#xff1a;本书适合想要了解微服务架构&#xff0c;以及想要深入了解如何有效地实施企业级微服务的Java开发人员。在本书中可以学到&#xff1a;■ 使用领域驱动设计方法来设计和实现微服务■ 使用Spring Security实现微服务的安全性■ 部署和测试微服务■ 检测…