OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4179|回复: 9

为什么多次用调用EMWIN给的库函数,UCOSIII就会HardFault

[复制链接]

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-5-25
在线时间
45 小时
发表于 2020-2-19 21:25:00 | 显示全部楼层 |阅读模式
100金钱
我在屏幕上创建了一个多文本,用来接收串口数据hItem_edit1temp=MULTIEDIT_CreateEx(6,54,177,120,hZhujiemain,WM_CF_SHOW,MULTIEDIT_CF_AUTOSCROLLBAR_V|MULTIEDIT_CF_INSERT,ID_MULTIEDIT_0,4096,"");

程序的思路:
1.当串口接收到数据,就使标识符置1
2.系统任务里的程序判断到标识符,就执行一句话
MULTIEDIT_AddKey(hItem_edit1temp,GUI_KEY_ENTER);
3.接着OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_PERIODIC,&err);//延时10ms
跳出任务。
4.不会立马进入HardFault。
5.因为我怀疑是MULTIEDIT_AddKey()造成,所以我就把MULTIEDIT_AddKey(hItem_edit1temp,GUI_KEY_ENTER);注释掉,再次做了一遍。
6.结果无论多久都不会进入HardFault,
7.所以我认为是MULTIEDIT_AddKey(),造成的,找了网上挺多资料的也没有办法。
各位大哥谁好的解决方法,麻烦能指教一下吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-2-19 23:19:54 | 显示全部楼层
回复

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2020-2-20 07:51:47 | 显示全部楼层
emwin有多任务调用与单任务调用,是不是在多任务下调用emwin接口,又没有实现相关底层实现。
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-5-25
在线时间
45 小时
 楼主| 发表于 2020-2-20 09:51:07 | 显示全部楼层
我把正点原子的外部SRAM的初始函数FSMC_SRAM_Init中的
1.FSMC_ReadWriteTimingStructure.FSMC_DataSetupTime = 0x18;   将0x09改为0x18
2.这是原先的注释-------//数据保持时间,9个HCLK,6*9=54ns
3.将时间改一下后就没有问题,然后我就再加了一句MULTIEDIT_AddText(hItem_edit1temp,temp);
4.发现如果字符串temp的如果小的话就没有问题。问题还是指向EmWin的函数,自我觉得应该是硬件某些地方不适应EmWin造成的,这只是我自己的看法,不知道对不对。

回复

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2020-2-20 11:15:22 | 显示全部楼层
科技论1 发表于 2020-2-20 09:51
我把正点原子的外部SRAM的初始函数FSMC_SRAM_Init中的
1.FSMC_ReadWriteTimingStructure.FSMC_DataSetupTi ...

MULTIEDIT_AddKey(hItem_edit1,temp,GUI_KEY_ENTER);
直接写死某一个字符串,不用串口的数据,试下什么效果。
https://github.com/WZTENG
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-5-25
在线时间
45 小时
 楼主| 发表于 2020-2-20 14:13:34 | 显示全部楼层
本帖最后由 科技论1 于 2020-2-20 14:20 编辑
WZTENG 发表于 2020-2-20 07:51
emwin有多任务调用与单任务调用,是不是在多任务下调用emwin接口,又没有实现相关底层实现。

1.是有在两个任务里调用到emwin的函数,我emwin的移植是直接用原子的,底层实现是具体指?能贴一下程序吗。
2. 直接写死也是一样的,短的字符串可以,长的就不可以了。3.所以我直接用for循环
char temp[2]={0,'\0'};
for(int i=0;i<ac_lenStr;i++)
{
    temp[0]=acTextStr;
    MULTIEDIT_AddText(hItem_edit1temp,temp);
    delay_ms(5);
}

这样反而可以。
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-5-25
在线时间
45 小时
 楼主| 发表于 2020-2-20 14:54:08 | 显示全部楼层
科技论1 发表于 2020-2-20 14:13
1.是有在两个任务里调用到emwin的函数,我emwin的移植是直接用原子的,底层实现是具体指?能贴一下程序吗 ...

1.每隔20次就删除窗口,重新创建窗口,这样做是为了避免接收区的数据太多,可以所以不可能是内存的问题。
回复

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2020-2-20 15:07:32 | 显示全部楼层
科技论1 发表于 2020-2-20 14:13
1.是有在两个任务里调用到emwin的函数,我emwin的移植是直接用原子的,底层实现是具体指?能贴一下程序吗 ...

什么叫短的可以?长的不可以?
emWin文档中该方法的说明是增加字符,(MULTIEDIT 控件的用户输入中将增加指定字符。如果已达到最大字符数,则不会添加其他字符。)
https://github.com/WZTENG
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-5-25
在线时间
45 小时
 楼主| 发表于 2020-2-20 15:26:51 | 显示全部楼层
本帖最后由 科技论1 于 2020-2-20 15:30 编辑
WZTENG 发表于 2020-2-20 15:07
什么叫短的可以?长的不可以?
emWin文档中该方法的说明是增加字符,(MULTIEDIT 控件的用户输入中将增加 ...

1.就是指多次使用MULTIEDIT_AddText(hItem_edit1temp,StrLen);
如果StrLen所指向的字符数组里的字符比较多,比如就这样的数组strlen[20]={‘a’,'b','c','.....,'\0'},就会容易进入异常;在同样的环境下strlen[3]={'a','c','\0'}就不会进入异常。
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-5-25
在线时间
45 小时
 楼主| 发表于 2020-2-20 15:33:36 | 显示全部楼层
本帖最后由 科技论1 于 2020-2-20 15:35 编辑
科技论1 发表于 2020-2-20 15:26
1.就是指多次使用MULTIEDIT_AddText(hItem_edit1temp,StrLen);
如果StrLen所指向的字符数组里的字符比较 ...
  1. ////串口数据接收更新任务

复制代码
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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