使用STM32H743XIH6,使用RTOS加libjpeg,cubemx配置的工程,libjpeg一直会报JERR_BAD_HUFF_TABLE错误。将libjpeg移出rtos环境,即仍然运行rtos,但解码工作不放在rtos任务里,放在中断里,就可以正常运行。
初步判断是rtos里面的libjpeg进行运算的时候出了问题,有没有大神给个方向指点一下应该给rtos配置什么选项。
libjpeg应该是没有使用浮点数计算的,所以应该不是rtos浮点计算的原因。
附上解码函数代码,是在运行到 jpeg_start_decompress(&cinfo); 出的问题,更具体的是在jdhuff.c的第437行
[C] 纯文本查看 复制代码 void decode_jpeg_to_rgb(uint8_t *jpeg_data, uint32_t jpeg_size, uint8_t *rgb_buffer)
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
// 初始化 JPEG 解压缩结构体
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
// 设置内存源
jpeg_mem_src(&cinfo, jpeg_data, jpeg_size);
// 读取 JPEG 头部信息
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
// 设置 RGB 输出缓冲区
int row_stride = cinfo.output_width * cinfo.output_components; // 每行字节数
// uint8_t *row_buffer = (uint8_t *)pvPortMalloc(row_stride);
uint8_t *row_buffer = (uint8_t *)malloc(row_stride);
// 逐行读取解码后的图像数据
for (int y = 0; y < cinfo.output_height; y++)
{
jpeg_read_scanlines(&cinfo, &row_buffer, 1);
for (int x = 0; x < cinfo.output_width; x++)
{
uint8_t r = row_buffer[x * cinfo.output_components + 0];
uint8_t g = row_buffer[x * cinfo.output_components + 1];
uint8_t b = row_buffer[x * cinfo.output_components + 2];
uint16_t value = rgb888_to_rgb565(r, g, b);
rgb_buffer[2 * y * cinfo.output_width + x * 2] = (value & 0xff);
rgb_buffer[2 * y * cinfo.output_width + x * 2 + 1] = ((value & 0xff00) >> 8);
}
}
// 清理资源
// vPortFree(row_buffer);
free(row_buffer);
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
}
|