您的位置:首页 > 其它

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

2013-05-04 20:13 218 查看
mingdu.zheng <at> gmail <dot> com

/article/8120082.html

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: