Tom*_* L. 5 c embedded malloc struct
我目前正在开发一个嵌入式系统,我在电路板上有一个组件,它出现了两次.我想为组件提供一个.c和一个.h文件.
我有以下代码:
typedef struct {
uint32_t pin_reset;
uint32_t pin_drdy;
uint32_t pin_start;
volatile avr32_spi_t *spi_module;
uint8_t cs_id;
} ads1248_options_t;
Run Code Online (Sandbox Code Playgroud)
这些都是硬件设置.我创建了这个结构的两个实例(每个部分一个).
现在我需要在后台保留一组值.例如,我可以每秒从该设备读取值,并且我想保留最后100个值.我希望这些数据不能从我的组件的"外部"访问(仅通过我的组件中的特殊功能).
我不确定如何在这里继续.我真的需要将数组作为结构的一部分吗?我想到的是做以下事情:
int32_t *adc_values; // <-- Add this to struct
int32_t *adc_value_buffer = malloc(sizeof(int32_t) * 100); // <-- Call in initialize function, this will never be freed on purpose
Run Code Online (Sandbox Code Playgroud)
然而,我将能够从我的代码中的任何地方(也来自我的组件外部)访问我的int32_t指针,这是我不喜欢的.
这是唯一的方法吗?你知道更好的方法吗?
谢谢.
Lun*_*din 16
对于为微控制器编写硬件驱动程序的具体情况,请考虑这样做.
否则,请使用opaque/incomplete类型.你会惊讶地发现,很少有C程序员知道如何实际实现自定义类型的100%私有封装.这就是为什么关于C缺乏称为私有封装的OO特性的一些持久性神话.这个神话源于缺乏C知识,而不是其他任何东西.
这是怎么回事:
ads1248.h
typedef struct ads1248_options_t ads1248_options_t; // incomplete/opaque type
ads1248_options_t* ads1248_init (parameters); // a "constructor"
void ads1248_destroy (ads1248_options_t* ads); // a "destructor"
Run Code Online (Sandbox Code Playgroud)
ads1248.c
#include "ads1248.h"
struct ads1248_options_t {
uint32_t pin_reset;
uint32_t pin_drdy;
uint32_t pin_start;
volatile avr32_spi_t *spi_module;
uint8_t cs_id;
};
ads1248_options_t* ads1248_init (parameters)
{
ads1248_options_t* ads = malloc(sizeof(ads1248_options_t));
// do things with ads based on parameters
return ads;
}
void ads1248_destroy (ads1248_options_t* ads)
{
free(ads);
}
Run Code Online (Sandbox Code Playgroud)
main.c中
#include "ads1248.h"
int main()
{
ads1248_options_t* ads = ads1248_init(parameters);
...
ads1248_destroy(ads);
}
Run Code Online (Sandbox Code Playgroud)
现在main中的代码无法访问任何struct成员,所有成员都是100%私有的.它只能创建一个指向struct对象的指针,而不是它的实例.作品正是像在C++抽象基类,如果你是熟悉.唯一的区别是你必须手动调用init/destroy函数,而不是使用真正的构造函数/析构函数.