处理多个嵌入式平台的代码库中的FAR指针

前端之家收集整理的这篇文章主要介绍了处理多个嵌入式平台的代码库中的FAR指针前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试为多个嵌入式平台维护带有示例的代码库.我需要支持一些函数参数的“far”(非16位)指针的概念.

我认为我有一个很好的解决方案,在某些平台上将宏FAR定义为__far,在32位指针(嵌入式Linux,Win32等)的平台上没有任何内容.使用该宏,我可以轻松地将指针定义为somestruct_t FAR * foo.

但后来我开始使用飞思卡尔处理器,他们的编译器要求FAR介于星号和变量名之间. (somestruct_t * __far foo).

我想出来处理这种情况的最佳解决方案是将宏FARPTR定义为__far *,* __far或者只是*,具体取决于平台.这允许somestruct_t FARPTR foo.

那里有更清洁的解决方案吗?特别是,我不喜欢读取该代码的人看不到*.我还担心在涉及函数声明时会遇到问题.从Freescale编译器帮助中获取此语法的负载

int __far *f();          // __far function returning a pointer to int
int * __far f();         // Function returning a __far pointer to int
int __near * __far f();  // __near function returning a __far pointer to int

最后一个杀了我 – 返回类型内的限定符表示近函数?!我最近了解到添加__near不足以实际将函数编译到近内存 – 我需要将它包装在pragma中.

那么,有没有人看到比我的FARPTR宏观想法更好的解决方案?

解决方法

freescale处理器的使用与标准类型限定符(例如const)更加一致,该放置使得它引用指针而不是指向的数据.也就是说,因为“远数据”而不是“远指针”将毫无意义,你会认为它无关紧要,但更大的一致性可能会使编译器解析器变得更简单.

你可以使用像kludgey这样的东西:

#if defined __SOME_ARCHITECTURE__

    #define DECLARE_FARPTR( type,identifier ) type __far * identifier

#if defined __SOME_OTHER_ARRCHITECTURE__

    #define DECLARE_FARPTR( type,identifier ) type * __far identifier

#else

    #define DECLARE_FARPTR( type,identifier )

#endif

然后你的声明看起来像:

DECLARE_FARPTR( somestruct_t,foo ) ;

或者在函数原型中获取指针参数:

void fn( DECLARE_FARPTR( somestruct_t,foo )  ) ;

或者返回远指针的函数

DECLARE_FARPTR( somestruct_t,fn( void ) ) ;

正如您所看到的那样,它很快就会变得难以阅读,并且声明性的函数式宏通常是最好避免的.

猜你在找的C&C++相关文章