嵌入式软件开发中,统一的基础设施到底有多关键?这样的设施又能为企业与项目带来哪些实际益处?下面,我们将共同进行一番深入分析。
统一基础设施的背景
小公司起步阶段开发较为随意,工程师可以自主选择所需的软硬件平台和工具。但随着研发实力的增强,对软件基础设施实施规范和限制变得不可或缺。从成本管控和管理的角度出发,统一软件基础设施不仅有助于降低成本和提高效率,还有利于科学化管理的实施,其优势显而易见。许多正在成长的小型科技公司,在之前各自为政的情况下,统一之后效率显著提高。
基础数据类型与宏的统一
#include
typedef unsigned int eos_u32_t;
typedef signed int eos_s32_t;
typedef unsigned short eos_u16_t;
typedef signed short eos_s16_t;
typedef unsigned char eos_u8_t;
typedef signed char eos_s8_t;
typedef bool eos_bool_t;
#define EOS_NULL ((void *)0)
#define EOS_U32_MAX (0xffffffffU)
#define EOS_U32_MIN (0U)
#define EOS_U16_MAX (0xffffU)
#define EOS_U16_MIN (0U)
#define EOS_U8_MAX (0xffU)
#define EOS_U8_MIN (0U)
为了实现软件基础设施的统一,必须明确指定统一的基础数据类型和宏。这样做可以消除不同硬件平台及编译器之间的差异。这种不依赖于硬件和编译器的数据结构,在编写代码时被频繁使用,并在多个模块间进行共享。若不进行统一,各个模块对同一数据类型的定义将出现不一致,从而导致数据转换上的问题。以嵌入式项目为例,统一之后,数据的传递将更加顺畅。
/* Compiler Related Definitions */
#if defined(__ARMCC_VERSION) /* ARM Compiler */
#define eos_section(x) __attribute__((section(x)))
#define eos_used __attribute__((used))
#define eos_align(n) __attribute__((aligned(n)))
#define eos_weak __attribute__((weak))
#define eos_inline static __inline
#elif defined (__GNUC__) /* GNU GCC Compiler */
#define eos_section(x) __attribute__((section(x)))
#define eos_used __attribute__((used))
#define eos_align(n) __attribute__((aligned(n)))
#define eos_weak __attribute__((weak))
#define eos_inline static __inline
#elif defined (__IAR_SYSTEMS_ICC__) /* for IAR Compiler */
#define eos_section(x) @ x
#define eos_used __root
#define eos_align(n) PRAGMA(data_alignment=n)
#define eos_weak __weak
#define eos_inline static inline
#else
#error "The current compiler is not supported. "
#endif
产品线与基础设施的挑战
产品线多样化,若采用非主流芯片或芯片厂商提供的操作系统,构建统一的软件基础将面临挑战。以某些专用设备为例,它们依赖的芯片使得通用基础设施的搭建变得复杂。至于那些资源有限的芯片,构建严格的嵌入式软件架构同样不易,这一点我们将在后续的《小资源芯片软件开发平台》一文中详述。
typedef struct eos_date
{
eos_u32_t year : 16;
eos_u32_t month : 8;
eos_u32_t day : 8;
} eos_date_t;
typedef struct eos_time
{
eos_u32_t hour : 8;
eos_u32_t minute : 8;
eos_u32_t second : 6;
eos_u32_t ms : 10;
} eos_time_t;
typedef struct eos_imu_data
{
float acc[3];
float gyr[3];
float mag[3];
} eos_imu_data_t;
中间件纳入基础设施
中间件因其稳定性,可被视作软件基础设施的一部分。在产品开发过程中,它有助于提升软件的复用率。例如,家庭服务机器人会采用状态机和行为树框架来处理复杂的应用层逻辑,而简单产品则无需这些框架。随着中间件数量的增加,产品开发的效率和品质也将得到显著提高。
static void *task_handler = NULL;
static void task_func_module_one(void *parameter);
void module_one_init(void)
{
/* Newly creating a task to run the module. */
#if (EOS_RTOS_NAME == EOS_RTOS_NAME_FREERTOS)
xTaskCreate(task_func_module_one,
"TaskModule", 2048, NULL, 2,
(TaskHandle_t *)&task_handler);
#elif (EOS_RTOS_NAME == EOS_RTOS_NAME_RTTHREAD)
task_handler = rt_thread_create("led1", task_func_module_one, NULL,
2048, 2, 20);
#else
eos_assert(false);
#endif
eos_assert(task_handler != NULL);
}
/* The task function of the module one. */
static void task_func_module_one(void *parameter)
{
(void)parameter;
/* Initialization. */
while (1)
{
/* Add the task function. */
}
}
软件与硬件的紧密联系
嵌入式软件与硬件关系密切,众多软件所需的基础设施依赖硬件支持。以FatFS为例,作为文件系统解决方案,其相应的硬件驱动程序和推荐硬件设计会被固定下来,便于后续项目的重复利用。对于诸如文件系统、网络等复杂的软件基础设施,采用固定的硬件设计可以减少调试和测试所需的时间。硬件工程师会优先确保这些关键设施的资源分配。
项目启动的初步选择
嵌入式软件的基础设施至关重要,而各个项目和产品的具体内容各异。在项目启动阶段,我们通常会先确定诸如实时操作系统、通信协议栈、文件系统等关键组件。这些决定将直接影响项目的进展和产品功能的实现。若能恰当选择软件基础设施,将为项目的顺利推进和成功奠定稳固的基础。
在项目实施过程中,我们在软件基础设施的挑选上遇到了不少难题。若您觉得这篇文章对您有所帮助,请记得给予点赞并转发。