硬汉嵌入式论坛

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

[emWin] 请教,EMWIN程序运行被定时器中断打断导致数据出错

[复制链接]

5

主题

26

回帖

41

积分

新手上路

积分
41
发表于 2018-12-6 23:32:57 | 显示全部楼层 |阅读模式
EMWIN能否被中断打断?
EMWIN程序运行被定时器中断打断导致数据出错

whil循环里面EMWIN程序每100ms运行一次并且刷新,定时器每1ms进入中断处理ADC的数据。当两者分开运行是都是正常的,但是整合到一起就出现问题了。

中断内的计算公式,正常来说结果一定相同且数据相等

QQ截图20181206232737.png


EMWIN程序没运行时进入中断计算的数据
QQ截图20181206232437.png

EMWIN程序运行时进入中断计算的数据
QQ截图20181206232450.png

如果在运行EMWIN程序前关闭总中断,EMWIN运行结束再打开总中断,则不会出现异常数据。
在数据出现异常的时候EMWIN是正常运行的,有刷新,且刷新符合设定。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2018-12-7 02:03:52 | 显示全部楼层
可以这样对比测试下,emWin本身不是支持定时器吗,你在本身支持的定时器里面每1ms执行1次你中断里面的操作,看看是否正常。


回复

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-12-7 07:00:47 | 显示全部楼层
eric2013 发表于 2018-12-7 02:03
可以这样对比测试下,emWin本身不是支持定时器吗,你在本身支持的定时器里面每1ms执行1次你中断里面的操作 ...

又做了一个对比测试,在while循环里面改成100ms调用LCD底层的打点函数,和画色块函数。
发现调用打点函数,进入中断处理数据,数据正常。
但是调用画色块之后,进入中断,数据不正常了,且定时器定的时间也不准了。(色块正常显示在屏幕上)

着实让人费解
除了下面2行程序可能会导致这个问题,其他的想不到了
#define TFT_write_cmd(cmd)                        *((volatile u16*)((u32)0x60000000)) = (cmd)        //地址u32,数据,u16
#define TFT_write_dat(data)                        *((volatile u16*)((u32)0x60020000)) = (data)

使用NE1,A16
回复

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-12-7 07:07:01 | 显示全部楼层
本帖最后由 黄毅7789 于 2018-12-7 07:08 编辑

更正,大量调用打点函数就能复现EMWIN出错的现象,之前是调用100次打点函数,改为10000次就出现了和EMWIN相同的现象。
但是,调用打点函数,定时器的时间是准的,调用画色块连定时器就不准了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2018-12-7 09:58:51 | 显示全部楼层
黄毅7789 发表于 2018-12-7 07:07
更正,大量调用打点函数就能复现EMWIN出错的现象,之前是调用100次打点函数,改为10000次就出现了和EMWIN相 ...

有个问题,你的1ms执行1次的中断,你测试下你的中断服务程序代码实际多长时间才执行完毕1次,在中断里面加个IO翻转测试下。
回复

使用道具 举报

337

主题

2045

回帖

3061

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3061
发表于 2018-12-7 15:29:41 | 显示全部楼层
本帖最后由 caicaptain2 于 2018-12-7 15:32 编辑

不应该有问题的。 我的一个程序中,定时器是1us中断一次,进行一次计算和IO口控制,而且此中断等级最高,可以打断任何任务。 emwin同时运行。 还有乱七八糟的几个任务在跑。都没有问题。

看你贴出来的代码,使用了双精度浮点计算,和print函数。最好测一下它们的耗时,看是否有冲突。
回复

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-12-9 16:48:09 | 显示全部楼层
本帖最后由 黄毅7789 于 2018-12-9 17:33 编辑
eric2013 发表于 2018-12-7 09:58
有个问题,你的1ms执行1次的中断,你测试下你的中断服务程序代码实际多长时间才执行完毕1次,在中断里面 ...

QQ截图20181209163530.png
经过多次对比测试,发现以下现象
1、波特率是4.5M,pritf是放在中断里面的,发送时间是12us
2、结构体仅初始化时对其进行一次赋值,假设EMWIN由于内存设置不当导致越界改变了结构体内的数值,那么为什么EMWIN结束后数值会恢复正常?或者导致改变了发送缓冲区数据,那么为什么'\t'却没有改变?
3、如果设置坐标函数不加static,那么调用TFT_clear(),时也会使数据变成0,注意程序已经注释了全部和EMWIN的函数
QQ截图20181209164402.png
再次对比测试:把DSP库,EMWIN,全部删干净,但是在whil()大循环里面,每隔100ms运行1000次打点函数,也会出现数据变成0的现象,只有如上图,把TFT_set_xy()加上static之后才会正常。

接下来我把除屏幕相关外的文件全部删除进行对比测试。


最后容我吐槽一句,已经被这个问题折磨一个星期了,幸好这不是公司项目而是自己练手的东西,要不然等着上天台吧

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2018-12-10 00:59:35 | 显示全部楼层
黄毅7789 发表于 2018-12-9 16:48
经过多次对比测试,发现以下现象
1、波特率是4.5M,pritf是放在中断里面的,发送时间是12us
2、结构 ...

一般这种神奇的问题,原因往往比较简单,比数组溢出,内存溢出等。
回复

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-12-10 23:04:06 | 显示全部楼层
eric2013 发表于 2018-12-10 00:59
一般这种神奇的问题,原因往往比较简单,比数组溢出,内存溢出等。

像这种神奇的问题有什么方法能找出来,今天又搞了3小时,还是毫无进展,也许是当局者迷吧。
回复

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-12-11 13:11:43 | 显示全部楼层
eric2013 发表于 2018-12-10 00:59
一般这种神奇的问题,原因往往比较简单,比数组溢出,内存溢出等。

还有一个可能是因为,栈不够导致的,但是我把Stack_Size      EQU     0x00007800,30K还是不行。

但是如果把串口发送程序放到大循环里面则打印信息正常。

如何看栈使用了多少?
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
发表于 2018-12-11 14:23:44 | 显示全部楼层
黄毅7789 发表于 2018-12-11 13:11
还有一个可能是因为,栈不够导致的,但是我把Stack_Size      EQU     0x00007800,30K还是不行。

但 ...

换一种方式,不要在中断里面使用打印,你保存为全局数组,循环刷新这个数组,用调试的方式查看这个数组内存的数据试试
回复

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-12-12 22:19:46 | 显示全部楼层
eric2013 发表于 2018-12-10 00:59
一般这种神奇的问题,原因往往比较简单,比数组溢出,内存溢出等。

现在发现只要在中断里面调用printf数据就会出错,假设EMWIN程序里面有和printf相同的底层函数,当EMWIN真正用这个底层的时候,中断了,再中断里面又调用这个函数,请问会出问题吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2018-12-14 02:56:10 | 显示全部楼层
黄毅7789 发表于 2018-12-12 22:19
现在发现只要在中断里面调用printf数据就会出错,假设EMWIN程序里面有和printf相同的底层函数,当EMWIN真 ...

printf不好使的话,那就直接调用串口的寄存器发送,这样看看是否有问题。
回复

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-12-16 19:01:41 | 显示全部楼层
eric2013 发表于 2018-12-14 02:56
printf不好使的话,那就直接调用串口的寄存器发送,这样看看是否有问题。

使用寄存器发送是正常的。
经过逐步排查,发现只要中断里面有sprintf,vsprintf,就会出现一些非常奇怪的问题,不仅限于EMWIN。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2018-12-17 09:12:15 | 显示全部楼层
本帖最后由 廷润 于 2018-12-17 09:15 编辑

我也来参与未知的疑问:
1.之前前辈教我的,不要在中断里面做太长时间的动作。这个很多前辈都有强调。
2.emWin更新屏幕的内容越多,越忙、越耗时、耗资源。我的平台是来回切换界面,刚好碰上硬件I2C读写数据,很容易死机。

我自己调整资源、调配刷新数据和硬件I2C读写时间点规避。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-9 04:12 , Processed in 0.206484 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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