【发布时间】:2021-03-18 20:24:24
【问题描述】:
我有这样的结构:
typedef struct ws2811_channel_t
{
int gpionum; //< GPIO Pin with PWM alternate function, 0 if unused
int invert; //< Invert output signal
int count; //< Number of LEDs, 0 if channel is unused
int strip_type; //< Strip color layout -- one of WS2811_STRIP_xxx constants
ws2811_led_t *leds; //< LED buffers, allocated by driver based on count
uint8_t brightness; //< Brightness value between 0 and 255
uint8_t wshift; //< White shift value
uint8_t rshift; //< Red shift value
uint8_t gshift; //< Green shift value
uint8_t bshift; //< Blue shift value
uint8_t *gamma; //< Gamma correction table
} ws2811_channel_t;
typedef struct ws2811_t
{
uint64_t render_wait_time; //< time in µs before the next render can run
struct ws2811_device *device; //< Private data for driver use
const rpi_hw_t *rpi_hw; //< RPI Hardware Information
uint32_t freq; //< Required output frequency
int dmanum; //< DMA number _not_ already in use
ws2811_channel_t channel[RPI_PWM_CHANNELS];
} ws2811_t;
还有我的工作示例:
ws2811_channel_t channel = {
.gpionum = LED_PIN,
.invert = LED_INVERT,
.count = LED_COUNT,
.strip_type = WS2811_STRIP_RGB,
.brightness = LED_BRIGHTNESS,
};
ws2811_t test = {
.freq = LED_FREQ_HZ,
.dmanum = LED_DMA,
channel,
};
LOG_INFO("LEDController: Init - " << ws2811_get_return_t_str(ws2811_init(&test)));
for (int i = 0; i < LED_COUNT; i++)
{
test.channel[0].leds[i] = (0 << 16) | (0 << 8) | 0;
}
ws2811_render(&test);
我想在课堂上正确分配私有财产,所以当我这样声明时:
ws2811_channel_t channel;
channel.gpionum = LED_PIN;
channel.invert = LED_INVERT;
channel.count = LED_COUNT;
channel.strip_type = WS2811_STRIP_RGB;
channel.brightness = LED_BRIGHTNESS;
ws2811_t test;
test.freq = LED_FREQ_HZ;
test.dmanum = LED_DMA;
test.channel[0] = channel;
LOG_INFO("LEDController: Init - " << ws2811_get_return_t_str(ws2811_init(&test)));
for (int i = 0; i < LED_COUNT; i++)
{
test.channel[0].leds[i] = (0 << 16) | (0 << 8) | 0;
}
ws2811_render(&test);
ws2811_render(&test); 挂起并冻结,在某些时候我得到了指向该方法的错误。
我假设这是因为它以某种方式有错误的分配。但为什么呢?
渲染的定义是
ws2811_return_t ws2811_render(ws2811_t *ws2811)
从这里:https://github.com/jgarff/rpi_ws281x/blob/master/ws2811.c#L1138
我做错了什么?
【问题讨论】:
-
ws2811_render(&test);错误可能是 &。另外,您现在有支持新的 c++20ws2811_channel_t channel = { .gpionum = LED_PIN,的 c++ 编译器吗? https://en.cppreference.com/w/cpp/language/aggregate_initialization#Designated_initializers -
请添加
ws2811_render的定义。 -
@drescherjm C 支持该语法。 OP 可能正在使用支持它作为扩展的 C++ 编译器。
-
但是你没有在第二个代码中将它们归零,我可以看到。您认为这是在哪里进行的?
-
在您的第二个示例中,尝试
ws2811_channel_t channel{};和ws2811_t test{};- 例如添加{}。
标签: c++ struct variable-assignment