硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2883|回复: 13
收起左侧

[STM32H7] 记录诡异的uCOS版emWin工程带硬件JPEG问题

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-5-25 00:36:43 | 显示全部楼层 |阅读模式
测试uCOS版本:
const  U8 **ppData;
_Context.NumBytesInBuffer  = _Context.pfGetData(_Context.pVoid, (const U8 **)ppData, LoadPicSize, 0);

返回的*ppData竟然是个0,非常诡异,而裸机版本和RTX版本无此问题。



后来改为
U8 *ppData;
_Context.NumBytesInBuffer  = _Context.pfGetData(_Context.pVoid, (const U8 **)&ppData, LoadPicSize, 0);

返回ppData使用可以了。

回复

使用道具 举报

14

主题

109

回帖

151

积分

初级会员

积分
151
发表于 2019-5-25 09:00:27 | 显示全部楼层
const类型的数据不是只能读而不能修改吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2019-5-25 09:52:22 | 显示全部楼层
fswyt 发表于 2019-5-25 09:00
const类型的数据不是只能读而不能修改吗?

**ppData不能改,  *ppData, ppData能
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2019-5-25 10:24:24 | 显示全部楼层
这个的确是楼主你用错了,ppData本身就是个指针变量,传递给函数之后就是传值而已。而&ppData才是ppData的地址。
举例来说,ppData本身是个变量,假设它被分配在内存地址0x20080000。如果你把ppData传递给某函数,函数内得到的是0;如果你把&ppData传递给某函数,函数内得到0x20080000。你说哪个才是传址?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2019-5-25 10:41:54 | 显示全部楼层
公仆 发表于 2019-5-25 10:24
这个的确是楼主你用错了,ppData本身就是个指针变量,传递给函数之后就是传值而已。而&ppData才是ppData的 ...

我这里是这么用的,所以才出现了这种诡异问题
const uint8_t **ppData;

void GetData(const uint8_t **p)
{
        *p = (const uint8_t *)0x08000000;
}

然后调用:
GetData(ppData);
        
printf("----%x\r\n", *ppData);

无问题。

有可能是emWin封装的函数pfGetData处理问题。
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2019-5-25 11:12:18 | 显示全部楼层
本帖最后由 公仆 于 2019-5-25 11:14 编辑
eric2013 发表于 2019-5-25 10:41
我这里是这么用的,所以才出现了这种诡异问题
const uint8_t **ppData;

大哥,如果你的上面的代码这么用,不奔溃就阿弥陀佛了。我说你不相信,叫个大学老师来讨论一下你就知道了。
首先分析
const uint8_t **ppData;
定义了ppData变量没有初始化,这时ppData其实是0,因为被C启动代码初始化的。然后直接就调用GetData(ppData);你会发现GetData函数内看到的p是0;*p = (const uint8_t *)0x08000000;就是把0x08000000这个值写入内存地址0所在的变量。
而printf("----%x\r\n", *ppData);就是从0的内存地址读取32位数据。

回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2019-5-25 11:20:13 | 显示全部楼层
emwin对绘制图像的getdata回调有特殊要求,在用于jpeg,gif,bmp时,需要自己给定缓冲区,然后把缓冲区地址赋值给ppData指向的变量;而用于png时则无需这么做,因为emwin已经给定了内存。 2019-05-25_111722.png



回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2019-5-25 11:22:03 | 显示全部楼层
《c专家编程》 里有专门讲这个
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2019-5-25 11:27:25 | 显示全部楼层
楼主相信我,好好思考一下。你不要因为我积分少就怀疑我的技术水平。
其实别人提出这个疑惑,我是不愿回答的。楼主每天辛勤工作,废寝忘食,经常是凌晨发帖很刻苦。
可是作息不规律的人,大脑肯定会犯糊涂。我是好意讨论一下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2019-5-25 11:45:21 | 显示全部楼层
公仆 发表于 2019-5-25 11:12
大哥,如果你的上面的代码这么用,不奔溃就阿弥陀佛了。我说你不相信,叫个大学老师来讨论一下你就知道了 ...


的确是这样的,程序里面const uint8_t **ppData;是做的局部变量,ppData是个随机值,恰好裸机版本和RTX版都对了,就是原始图片地址。

回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2019-5-25 12:03:22 | 显示全部楼层
eric2013 发表于 2019-5-25 11:45
的确是这样的,程序里面const uint8_t **ppData;是做的局部变量,ppData是个随机值,恰好裸机版本 ...

还有下一层楼的关于emwin图像绘制函数中getdata回调函数的用法你也注意一下啊,png和另外几种图像的用法不一样,这个有文档说明的,再看看官方示例代码都是符合文档说法的。

评分

参与人数 1金币 +2 收起 理由
cz123123 + 2 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2019-5-25 12:29:04 | 显示全部楼层
公仆 发表于 2019-5-25 12:03
还有下一层楼的关于emwin图像绘制函数中getdata回调函数的用法你也注意一下啊,png和另外几种图像的用法 ...

谢谢,这个倒是没问题,这些都是emWin在调用。

硬件JPEG这里是重新做一个JPEG的绘制函数,然后调用的回调,调用时出现了这个诡异问题。
回复

使用道具 举报

14

主题

109

回帖

151

积分

初级会员

积分
151
发表于 2019-5-27 11:11:36 | 显示全部楼层
又学习了一些指针
回复

使用道具 举报

1

主题

25

回帖

28

积分

新手上路

积分
28
发表于 2019-5-27 12:46:21 | 显示全部楼层
看了2个多月指针了,这一上来就懵逼了。《C专家编程》哪一章讲这个呀?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 05:21 , Processed in 0.345559 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表