嵌入式系统编程的松耦合模式

Gro*_*roo 19 c embedded coding-style

我在哪里可以找到一些关于在C中编写可扩展,模块化,松散耦合代码的良好,经过验证的指南或示例(如果可能)?

我们的问题的背景是我们正在为具有有限计算和内存资源的低成本微控制器维护大型纯C,遗留代码项目.由于系统必须非常可靠并且存储器相当有限,因此第一个约束之一是根本不使用动态存储器分配.所有结构都是静态映射的.

因此,我们正在寻找使这些代码更易于维护和更加模块化的方法.我们对编码标准不感兴趣,而是设计建议.我们有良好的编码约定(命名,组织代码,SVN),所以这不是问题.

从我在网上看到的(我可能是错的)来看,似乎大多数只在普通C或汇编程序中编程的程序员,至少在uC/Embedded社区中,都禁止使用任何更简单的程序编程.

例如,我们可以使用回调函数,包含函数指针和类似东西的结构(它不需要动态分配,只需要传递指向结构的指针)来获得大部分OOP优势并在纯C中解耦,但我们希望看到如果已经有一些经过验证的方法.

您是否知道这些资源,或者除了 "为什么不切换到C++或其他编程语言" 之外还有类似的建议?

[编辑]

非常感谢所有答案,我还没来得及检查它们.平台是16位(XC166或类似)uC,裸hw(无RTOS).

Aid*_*lly 3

我们的情况类似。为了解决这些问题,我们实现了一个构建系统,该系统支持所需接口的多种实现(所使用的实现是编译目标的函数),并避免使用可移植包装器中未包含的 API 功能。包装器定义位于 .h 文件中,该文件#include是特定于实现的头文件。以下模型演示了我们如何处理信号量接口:

#ifndef __SCHEDULER_H
#define __SCHEDULER_H

/*! \addtogroup semaphore Routines for working with semaphores.
 * @{
 */

/* impl/impl_scheduler.h gets copied into place before any file using
 * this interface gets compiled. */
#include "impl/impl_scheduler.h"

/* semaphore operation return values */
typedef enum _semaphoreErr_e
{
    SEMAPHORE_OK = impl_SEMAPHORE_OK,
    SEMAPHORE_TIMEOUT = impl_SEMAPHORE_TIMEOUT
} semaphoreErr_e;

/*! public data type - clients always use the semaphore_t type. */
typedef impl_semaphore_t semaphore_t;

/*! create a semaphore. */
inline semaphore_t *semaphoreCreate(int InitialValue) {
  return impl_semaphoreCreate(InitialValue);
}
/*! block on a semaphore. */
inline semaphoreErr_e semaphorePend(semaphore_t *Sem, int Timeout) {
  return impl_semaphorePend(Sem, Timeout);
}
/*! Allow another client to take a semaphore. */
inline void semaphorePost(semaphore_t *Sem) {
  impl_semaphorePost(Sem);
}

/*! @} */

#endif
Run Code Online (Sandbox Code Playgroud)

公共 API 已记录使用情况,并且实现在编译时是隐藏的。使用这些包装器也不应该产生任何开销(尽管可能会产生任何开销,具体取决于您的编译器)。不过,其中涉及很多纯粹的机械打字。