有什么想法为什么初始化 `WebPAnimDecoderNew` 会导致 PlatformIO 上传失败吗?

问题描述 投票:0回答:1

一些背景

我正在尝试使用

libwebp
解码动画图像并将其显示在由 Adafruit MatrixPortal 驱动的 RGB LED 矩阵上。我的开发环境如下:

  • 运行 Ventura 13.4.1 的 Mac M2
  • PlatformIO 项目配置为
    board=adafruit_matrix_portal_m4
  • Adafruit Protomatter 库包含在
    lib_deps
  • libwebp
    作为子模块包含在
    lib
    目录中
  • 用于测试的硬编码 WebP 存储在
    lib/assets

lib 结构是根据 tidbyt/hdk 固件建模的,并且直接从那里提取 webp 资源。

什么在起作用

我已经能够成功编译和上传我的

main.cpp
并在我的LED矩阵上显示基本文本图形,所以我对我的整体架构感觉非常好。

什么不起作用

当我添加单行以使用

libwebp
WebPAnimDecoderNew
初始化解码器时,上传失败约 50%,并显示消息
SAM-BA operation failed
。以下是我的工作
main.cpp
,问题行已注释掉。

#include <Arduino.h>
#include <Adafruit_Protomatter.h>
#include <webp/demux.h>
#include <assets.h>

uint8_t rgbCount = 1;
uint8_t rgbPins[] = {7, 8, 9, 10, 11, 12};
uint8_t addrCount = 4;
uint8_t addrPins[] = {17, 18, 19, 20};
uint8_t clockPin = 14;
uint8_t latchPin = 15;
uint8_t oePin = 16;

uint8_t bitDepth = 6; // 5;

Adafruit_Protomatter matrix(
    128, bitDepth, rgbCount, rgbPins, addrCount, addrPins, clockPin, latchPin, oePin, false);

WebPData webPData;

void setup()
{
  Serial.begin(9600);
  delay(2000);

  ProtomatterStatus status = matrix.begin();
  Serial.print("Protomatter begin() status: ");
  Serial.println((int)status);
  if (status != PROTOMATTER_OK)
  {
    for (;;)
      ;
  }
}

void loop()
{
  Serial.print("Refresh FPS = ~");
  Serial.println(matrix.getFrameCount());

  drawTestGraphic();
  drawWebP();

  delay(1000);
}

void drawTestGraphic()
{
  for (int x = 0; x < matrix.width(); x++)
  {
    uint8_t level = x * 256 / matrix.width();
    matrix.drawPixel(x, matrix.height() - 4, matrix.color565(level, 0, 0));
    matrix.drawPixel(x, matrix.height() - 3, matrix.color565(0, level, 0));
    matrix.drawPixel(x, matrix.height() - 2, matrix.color565(0, 0, level));
    matrix.drawPixel(x, matrix.height() - 1, matrix.color565(level, level, level));
  }

  matrix.show();
}

void drawWebP()
{
  WebPDataClear(&webPData);

  webPData.size = ASSET_NOAPPS_WEBP_LEN;
  webPData.bytes = (uint8_t *)malloc(ASSET_NOAPPS_WEBP_LEN);

  memcpy((void *)webPData.bytes, ASSET_NOAPPS_WEBP, ASSET_NOAPPS_WEBP_LEN);

  // Where I want to start decoding...
  // WebPAnimDecoder *decoder = WebPAnimDecoderNew(&webPData, NULL);

  free((void *)webPData.bytes);
}

有人曾经经历过这种情况吗

libwebp
?对于具体是什么原因导致该行出现此问题,有什么建议吗?

esp32 webp firmware adafruit platformio
1个回答
0
投票

正如@TimRoberts所指出的,这是由于MatrixPortal M4的内存有限。令人困惑的是,M4 同时具有 ATSAMD51J19 Cortex M4 处理器和 ESP32 WiFi 协处理器。即使有协处理器,固件可访问的 RAM 也仅限于 kb。

我关注的大多数项目都使用 ESP32-S3,它具有更多的内存 (8MB)。

巧合的是,Adafruit 刚刚发布了使用 ESP32S3 的 Matrixportal S3。我将尝试将此项目迁移到其中之一或 Raspberry Pi。

© www.soinside.com 2019 - 2024. All rights reserved.