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

news/2024/7/7 20:22:57 标签: ecos, hal

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

 

eCos的HAL接口为eCos其它组件提供访问硬件的统一接口,所有的HAL接口都是以宏定义的形式提供的, 采用宏定义的形式有如下优势:

 

1. 实现接口的形式是多样化的

实现接口的形式是多样化的,可以根据需要选择内联C代码、调用C函数、内联汇编代码、调用汇编函数等多种实现形式, 如果硬件平台不支持该接口,那么可以将该接口定义为空白。

内联C代码的例子(hal/arm/arch/.../include/hal_arch.h:179

#define HAL_THREAD_INIT_CONTEXT( _sparg_, _thread_, _entry_, _id_ )         \
    CYG_MACRO_START                                                         \
    register CYG_WORD _sp_ = ((CYG_WORD)_sparg_) &~15;                      \
    register HAL_SavedRegisters *_regs_;                                    \
    int _i_;                                                                \
    _regs_ = (HAL_SavedRegisters *)((_sp_) - sizeof(HAL_SavedRegisters));   \
    for( _i_ = HAL_THREAD_CONTEXT_FIRST; _i_ <= HAL_THREAD_CONTEXT_LAST;    \
           _i_++ )                                                          \
        (_regs_)->d[_i_] = (_id_)|_i_;                                      \
    (_regs_)->d[00] = (CYG_WORD)(_thread_); /* R0 = arg1 = thread ptr */    \
    (_regs_)->sp = (CYG_WORD)(_sp_);        /* SP = top of stack      */    \
    (_regs_)->lr = (CYG_WORD)(_entry_);     /* LR = entry point       */    \
    (_regs_)->pc = (CYG_WORD)(_entry_);     /* PC = [initial] entry point */\
    (_regs_)->cpsr = (CPSR_THREAD_INITIAL); /* PSR = Interrupt enabled */   \
    _sparg_ = (CYG_ADDRESS)_regs_;                                          \
    CYG_MACRO_END

内联汇编代码的例子(hal/arm/arch/.../include/hal_intr.h:171

#define HAL_DISABLE_INTERRUPTS(_old_)           \
    asm volatile (                              \
        "mrs %0,cpsr;"                          \
        "orr r4,%0,%1;"                         \
        "msr cpsr,r4"                           \
        : "=r"(_old_)                           \
        : "i"(CPSR_INTR_MASK)                   \
        : "r4"                                  \
        );

调用C函数的例子(hal/arm/arch/.../include/hal_intr.h:410

#define HAL_INTERRUPT_MASK( _vector_ )                     \
    hal_interrupt_mask( _vector_ )

调用汇编函数的例子(hal/arm/arch/.../include/hal_arch.h:206

#define HAL_THREAD_SWITCH_CONTEXT(_fspptr_,_tspptr_)                    \
        hal_thread_switch_context((CYG_ADDRESS)_tspptr_,                \
                                  (CYG_ADDRESS)_fspptr_);

空白定义的例子(hal/arm/arch/.../include/hal_arch.h:417

#define CYGARC_HAL_SAVE_GP()

2. 可以进行重定义覆盖默认值

eCos将HAL分成3层,分别是架构层(Architecture)、变体层(Variant)、平台层(Platform), 大部分HAL接口是由架构层提供的,但是变体层或平台层可以根据自身的特性对平台层提供的HAL接口重定义。 这通过在架构层头文件include变体层和平台层头文件以及ifndef/define预处理指令实现。

变体层覆盖架构层的例子:

架构层头文件引用变体层头文件(hal/arm/arch/.../include/hal_arch.h:59

#ifdef CYGBLD_HAL_ARM_PLF_ARCH_H
#include <cyg/hal/plf_arch.h>
#endif

#ifdef CYGBLD_HAL_ARM_VAR_ARCH_H
#include <cyg/hal/var_arch.h>
#endif

架构层的默认实现(hal/arm/arch/.../include/hal_arch.h:375

#ifndef HAL_IDLE_THREAD_ACTION
#define HAL_IDLE_THREAD_ACTION(_count_) CYG_EMPTY_STATEMENT
#endif

变体层的实现(hal/arm/lpc24xx/.../include/var_arch.h:66

#ifndef HAL_IDLE_THREAD_ACTION
#define HAL_IDLE_THREAD_ACTION(_count_)                       \
CYG_MACRO_START                                               \
HAL_WRITE_UINT32(CYGARC_HAL_LPC24XX_REG_SCB_BASE +            \
                 CYGARC_HAL_LPC24XX_REG_PCON,                 \
                 CYGARC_HAL_LPC24XX_REG_PCON_IDL);            \
CYG_MACRO_END
#endif

 


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

相关文章

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实现微服务的安全性■ 部署和测试微服务■ 检测…

eCos中的externC和__THROW

mingdu.zheng <at> gmail <dot> comhttp://blog.csdn.net/zoomdy/article/details/8884825 1. externC eCos中使用C源文件组织的需要给C代码调用的函数均添加了externC或__externC。 例如&#xff1a;&#xff08;kernel/../src/intr/intr.cxx:333&#xff09; ex…

小黑需知 各种系统中密码文件的位置(转)

小黑需知 各种系统中密码文件的位置(转)[more]  相信很多的黑客朋友当进入一台远程电脑的时候最想得到的就是密码文件&#xff0c;然后自己破解一下就是这台电脑的系统管理员了&#xff0c;嘿嘿!可是密码文件在哪呢&#xff1f; AIX 3 /etc/security/passwd ! or /tcb/auth/f…

Linux命令高效操作(1)-快捷键

借公司大牛的技术分享ppt&#xff0c;组织几篇关于Linux命令高效操作的文章&#xff01;一篇非常注重实践的技术文&#xff0c;主要关于如何在linux下实现高效快速的命令行操作, 希望大家能从中真正体悟出命令行与图形化操作的效率差异! 关于命令行与图形化的话题&#xff0c;网…