eCos的HAL接口采用宏定义形式的优势
2013-05-04 20:13
218 查看
mingdu.zheng <at> gmail <dot> com
/article/8120082.html
eCos的HAL接口为eCos其它组件提供访问硬件的统一接口,所有的HAL接口都是以宏定义的形式提供的, 采用宏定义的形式有如下优势:
实现接口的形式是多样化的,可以根据需要选择内联C代码、调用C函数、内联汇编代码、调用汇编函数等多种实现形式, 如果硬件平台不支持该接口,那么可以将该接口定义为空白。
内联C代码的例子(
内联汇编代码的例子(
调用C函数的例子(
调用汇编函数的例子(
空白定义的例子(
eCos将HAL分成3层,分别是架构层(Architecture)、变体层(Variant)、平台层(Platform), 大部分HAL接口是由架构层提供的,但是变体层或平台层可以根据自身的特性对平台层提供的HAL接口重定义。 这通过在架构层头文件include变体层和平台层头文件以及ifndef/define预处理指令实现。
变体层覆盖架构层的例子:
架构层头文件引用变体层头文件(
架构层的默认实现(
变体层的实现(
/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
相关文章推荐
- eCos的HAL接口采用宏定义形式的优势
- 收藏《CnForums和已有系统的整合方案》《通过IViewObject接口,取浏览器的图象,实现SNAP 》《SNAP的另类实现,采用iFRAME,内嵌框架的形式.》等
- 3月22日,TestFrame采用接口形式产生匿名对象,每日20行。
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- Android中HAL如何向上层提供接口总结
- 以form表单的形式传递参数给rest接口
- 支付宝即时到帐接口的python实现,示例采用django框架
- .NET的资源并不限于.resx文件,你可以采用任意存储形式[下篇]
- 转:宏定义的极致发挥---让你的普通C++类轻松支持IDispatch自动化接口(二)
- 关于android HAL接口的一片比较好的文章
- 以流的形式开发下载附件接口
- mybatis(接口形式开发配置)
- 宏定义为什么要使用do{……}while(0)形式
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- IOS 采用https 协议访问接口
- 采用eprint处理web打印之优势
- Restful形式接口文档生成之Swagger与SpringMVC整合手记
- 重装系统时,遇到的“windows 无法安装到这个磁盘.选中的磁盘采用GPT分区形式”解决办法
- mybatis 接口形式访问
- Restful形式接口文档生成之Swagger与SpringMVC整合手记