OpenEdv-开源电子网

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

使用usmart 3.3时版本出现的bug

[复制链接]

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2016-3-9
在线时间
74 小时
发表于 2020-12-30 21:22:16 | 显示全部楼层 |阅读模式
1金钱
在运行usmart的时候,通过串口调试一个函数比如Ble_Send("gmtr",9),第一个参数是字符串(加上字符串末尾的'\0'为5个字符),而在usmart_get_fparam这个函数中处理数字参数(此例子中是数字9)时,调用*(uint32_t*)(usmart_dev.parm+usmart_get_parmpos(n))=res;  此处的usmart_get_parmpos(n)为5("gmtr\0"),所以usmart_dev.parm+usmart_get_parmpos(n)的值不是4字节对齐的,
对其进行uint32_t*强转会直接进入HardFault_Handler()硬件错误异常



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

使用道具 举报

9

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
640
金钱
640
注册时间
2018-8-9
在线时间
150 小时
发表于 2021-6-11 11:03:31 | 显示全部楼层
本帖最后由 maidilong 于 2021-6-15 21:13 编辑

我也遇到类似问题,你是怎解决的?
USMART(STM32F030).rar (361 KB, 下载次数: 9)
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-6-14 23:42:50 | 显示全部楼层
maidilong 发表于 2021-6-11 11:03
我也遇到类似问题,你是怎解决的?

把你的工程发上来看看
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
640
金钱
640
注册时间
2018-8-9
在线时间
150 小时
发表于 2021-6-15 21:12:11 | 显示全部楼层
正点原子 发表于 2021-6-14 23:42
把你的工程发上来看看

源码在附件,请大家看看
可以到我的悬赏贴看看具体描述

USMART(STM32F030).rar (361 KB, 下载次数: 9)
回复

使用道具 举报

9

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
640
金钱
640
注册时间
2018-8-9
在线时间
150 小时
发表于 2021-6-17 01:05:43 | 显示全部楼层
正点原子 发表于 2021-6-14 23:42
把你的工程发上来看看

原子哥,我遇到的问题和楼主的是一模一样的情况,通过串口调试一个函数比如Ble_Send("gmtr",9)每次单步调试到后面那个数字9都会硬件异常,每次在usmart_get_fparam这个函数中处理数字参数(此例子中是数字9)时,调用*(uint32_t*)(usmart_dev.parm+usmart_get_parmpos(n))=res;每次都是卡死,但有个奇怪的现象就是把函数改一下,把数字放前,字符中放在后面,如Ble_Send(9,"gmtr")就能正常,真的是好奇怪啊,请问一下我该怎样解决,存在4字节对齐的情况吗?很少用到这方面的知识,不知如何解决, 求大家帮忙解决。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-6-18 00:39:27 | 显示全部楼层
maidilong 发表于 2021-6-17 01:05
原子哥,我遇到的问题和楼主的是一模一样的情况,通过串口调试一个函数比如Ble_Send("gmtr",9)每次单步调 ...

我暂时没有030的板子,无法测试你这个工程,在STM32F1/F4/F7/H7上面,你有测试到这个bug么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
640
金钱
640
注册时间
2018-8-9
在线时间
150 小时
发表于 2021-6-18 19:59:09 | 显示全部楼层
本帖最后由 maidilong 于 2021-6-18 20:04 编辑
正点原子 发表于 2021-6-18 00:39
我暂时没有030的板子,无法测试你这个工程,在STM32F1/F4/F7/H7上面,你有测试到这个bug么?

今天又搞这了一天,用战舰V3(FLASH:512K RAM:128K)测试一样的代码没有问题,后来找一个资源小一的板子试试,STM32F103C8T6(FLASH:64K RAM:20K)也能正常,感觉F103系列的应该都没问题,再说M0系列的,原来用STM32F030F4P6(FLASH:16K RAM:4K)有问题,改国产的HK32F030F4P6(FLASH:16K RAM:10K)也有问题,再换STM32F051R8T6(FLASH:64K RAM:8K也有问题,感觉F0系列的全有这个问题,我对比了源码M3和M0的默认堆和栈都是一样的Stack_Size  0x00000400    Heap_Size  0x00000200,我试着把M0的堆和栈都加大,Stack_Size  0x00000800   Heap_Size  0x00000400,结果M0的单片机还是有问题,所以应该跟堆栈没有关系,那到底是什么问题呢,百思不得其解,一样的代码,难道是M3与M0不一样的内核所致?知识有限还在找原因中。
使用过程中:
void OLED_Clear(void);//清屏void OLED_Full(void);//全屏显示
void OLED_DrawPoint(u8 x,u8 y,u8 t);//画点
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode);//画线
void OLED_DrawRectangle(u8 x1, u8 y1, u8 x2, u8 y2);//画框柜形
void OLED_DrawEllipse(u16 x0, u16 y0, u16 rx, u16 ry);//画椭圆
这些在M3和M0的芯片上使用都是正常的,就是那些参数有字符串函数在M0的会有问题

例如:OLED_ShowString(10,30,"love",12);
M0单片机每次调都字符串后面的那个参数12到*(u32*)(usmart_dev.parm+usmart_get_parmpos(n))=res;就会进入硬件中断
777777.png
如果函数把字符串放最后那个参数就能正常,例如:OLED_ShowString(10,30,12,"love");




回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-6-19 00:14:55 | 显示全部楼层
maidilong 发表于 2021-6-18 19:59
今天又搞这了一天,用战舰V3(FLASH:512K RAM:128K)测试一样的代码没有问题,后来找一个资源小一的板子试 ...

跟踪进去到最底层看看,392行,直接跟踪进去
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
640
金钱
640
注册时间
2018-8-9
在线时间
150 小时
发表于 2021-6-23 16:54:35 | 显示全部楼层
本帖最后由 maidilong 于 2021-6-23 21:22 编辑
正点原子 发表于 2021-6-19 00:14
跟踪进去到最底层看看,392行,直接跟踪进去

跟进去看也没有错误,发现单步调试的数据和M3的是一样的,但是M3的单片机完全没问题,就是M0的单步调试有问题,就是M0每次调试完*(u32*)(usmart_dev.parm+usmart_get_parmpos(n))=res;就会进入硬件中断,真搞不懂是什么原因?难道就因为内核不一样的问题?太奇怪了~反正就是参数里字符串一定要放在最后那个参数,不能放在前面使用。
晚上又小试了一下,把  *(u32*)(usmart_dev.parm+usmart_get_parmpos(n))=res;中的(u32*)去掉,再把其它一些地方因为u32报错的地方改改就可以运行了,不进入硬件中断了,但是字符串中的执行那就识别不出字符串了,数字是能识别的,大体看了一下,数组里以前存在放数据是u32,即4字节存一个数字的,现在变成了u8一个字节存一个数据了,所以执行函数void usmart_exe(void)里显示字符串就不对了,所以明天有空再改改看。目前估计问题就是出在这些数据转换里
回复

使用道具 举报

9

主题

56

帖子

0

精华

高级会员

Rank: 4

积分
640
金钱
640
注册时间
2018-8-9
在线时间
150 小时
发表于 2021-6-24 15:43:06 | 显示全部楼层
目前问题已经解决,就是从这个 *(u32*)(usmart_dev.parm+usmart_get_parmpos(n))=res;中的(u32*)去掉下手,再改改报错的地方就差不了,仿真一下就能找到答案,具体的解决我就不放出来了,自己仿真看看,找问题和解决问题能学到很多东西,同时也谢谢原子大神的帮助。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-6-25 01:23:49 | 显示全部楼层
maidilong 发表于 2021-6-24 15:43
目前问题已经解决,就是从这个 *(u32*)(usmart_dev.parm+usmart_get_parmpos(n))=res;中的(u32*)去掉下手, ...

可以分享下解决办法吗?我可以改一下代码以便其他朋友使用
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 14:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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