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

tom*_*gic 7 c embedded

我正在尝试为多个嵌入式平台维护带有示例的代码库.我需要支持一些函数参数的"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
Run Code Online (Sandbox Code Playgroud)

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

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

Cli*_*ord 2

飞思卡尔处理器的使用与标准类型限定符(例如 )更加一致const,这种放置导致它引用指针而不是所指向的数据。也就是说,由于“远数据”而不是“远指针”是没有意义的,您可能会认为这并不重要,但更大的一致性可能会导致更简单的编译器解析器。

你可以使用一些杂乱的东西,例如:

#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
Run Code Online (Sandbox Code Playgroud)

那么你的声明将如下所示:

DECLARE_FARPTR( somestruct_t, foo ) ;
Run Code Online (Sandbox Code Playgroud)

或者在带有指针参数的函数原型中:

void fn( DECLARE_FARPTR( somestruct_t, foo )  ) ;
Run Code Online (Sandbox Code Playgroud)

或返回远指针的函数:

DECLARE_FARPTR( somestruct_t, fn( void ) ) ;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它很快就会变得难以阅读,并且通常最好避免使用类似声明性函数的宏。