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

标签 c embedded coding-style

<分区>

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

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

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

从我在网上看到的情况来看(我可能是错的),似乎大多数只使用普通 C 或汇编程序编程的程序员,至少在 uC/Embedded 社区中,都限制使用任何更普通的东西程序化编程。

例如,我们可以使用回调函数、包含函数指针的结构和类似的东西(它不需要动态分配,只需将指针传递给结构),在普通 C 中获得大部分 OOP 好处和解耦,但我们会想看看是否已经有一些行之有效的方法。

你知道这样的资源吗,或者有类似的建议除了“你为什么不切换到 C++ 或其他编程语言”?

[编辑]

非常感谢所有的回答,我还没有时间检查它们。 平台是 16 位(XC166 或类似)uC,裸硬件(无 RTOS)。

最佳答案

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

#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

公共(public) API 被记录以供使用,并且在编译时隐藏实现。使用这些包装器也不应该强加任何开销(尽管它可能取决于您的编译器)。不过,其中涉及很多纯机械打字。

关于c - 嵌入式系统编程的松耦合模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2000464/

相关文章:

c - 如何使用 C 中的 offsetof() 和指针在结构中填充数组

java - 不需要的通用参数

python - 编码风格 - 将括号保持在同一行或新行上?

c - ioctl 和执行时间

c - 嵌入式设备与远程服务器通信的协议(protocol)架构

java - Java编码风格的资源?

c - 在c中设置基数

c - 字符指针遇到问题

c - C99 是否保证数组是连续的?

c - STM32嵌入式内存溢出/泄漏检测