硬汉嵌入式论坛

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

有关【bsp_InitDWT】函数使用出现的奇怪现象

[复制链接]

39

主题

1516

回帖

1638

积分

至尊会员

积分
1638
发表于 2018-6-8 00:00:46 | 显示全部楼层 |阅读模式
我使用FreeRTOS最简单的工程中,初始化中配置bsp_InitDWT(); 然后 全部初始化完成之后调用了延时函数bsp_DelayMS(20);,下载进去程序不执行,必须断一下电或者按键复位才可以执行。如果只初始化bsp_InitDWT();  而不调用bsp_DelayMS函数就不需要复位。请问这是什么问题?使用DWT做延时函数,需要注意些什么吗?
回复

使用道具 举报

39

主题

1516

回帖

1638

积分

至尊会员

积分
1638
 楼主| 发表于 2018-6-8 00:04:27 | 显示全部楼层
看图
AQ)Z754~CHFH)Y4CTTEYV@7.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2018-6-8 00:15:39 | 显示全部楼层
这个没事的,这是因为现在的下载器都有集成ITM功能,而这个DWT就是它的一部分。你的下载器不使用这个功能就没问题。
回复

使用道具 举报

39

主题

1516

回帖

1638

积分

至尊会员

积分
1638
 楼主| 发表于 2018-6-8 00:23:28 | 显示全部楼层
硬汉哥,就是说这个首次下载进去之后,429需要复位一下才执行是正常的吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2018-6-8 00:25:15 | 显示全部楼层
sanit 发表于 2018-6-8 00:23
硬汉哥,就是说这个首次下载进去之后,429需要复位一下才执行是正常的吗?

我回去给你发个截图,在调试配置里面有个TRACE,不要使能它
回复

使用道具 举报

39

主题

1516

回帖

1638

积分

至尊会员

积分
1638
 楼主| 发表于 2018-6-8 00:31:26 | 显示全部楼层
好的,太感谢了!有点强迫症
回复

使用道具 举报

39

主题

1516

回帖

1638

积分

至尊会员

积分
1638
 楼主| 发表于 2018-6-8 10:23:46 | 显示全部楼层
结贴:
对于这个问题,跟DWT没有关系。原因是:
      我再启动FreeRTOS之前调用了printf函数(发现调用一次两次没事,调用NAND_DispBadBlockInfo();函数,里面有大量循环打印,就会死机),而使用FreeRTOS之后,开关中断已经变成FreeRTOS自带函数实现,#define DISABLE_INT()    taskENTER_CRITICAL()      #define ENABLE_INT()     taskEXIT_CRITICAL()   ;现在这些打印我放在最高优先级任务打印一次,一切正常。我觉得应该是FreeRTOS没有启动之前,不可以使用这个函数进行开关中断。还请硬汉帮忙分析是不是这个原因呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2018-6-8 10:56:31 | 显示全部楼层
sanit 发表于 2018-6-8 10:23
结贴:
对于这个问题,跟DWT没有关系。原因是:
      我再启动FreeRTOS之前调用了printf函数(发现调用 ...



如果你的工程里面存在这种情况,的确是的。
回复

使用道具 举报

39

主题

1516

回帖

1638

积分

至尊会员

积分
1638
 楼主| 发表于 2018-6-8 11:50:42 | 显示全部楼层
深入理解一下:首先FreeRTOS中使用优先级分组设置为4,也就是说0-15抢占优先级,没有响应优先级。我串口设置抢占优先级是1,FreeRTOS中设置的开关中断 定义了受 FreeRTOS 管理的最高优先级中断 是1,也就是说开关中断针对1-15有效。
正好关闭中断的时候,把我串口抢占优先级1给关闭掉了。恰好printf函数使用FIFO发送的时候,有两个地方使用了开关中断。导致串口发送不出去,而FIFO缓冲区满了,一直等待缓冲区不满,所以代码现象就是死等。
那么你会问,关闭中断和开启中断不是成对使用的吗?经过测试发现,在FreeRTOS启动之前,调用它自带的开关中断函数,只能关闭,无法开启。连__set_PRIMASK(0) 强制开启全部中断都无能为力,有点奇怪。FreeRTOS启动之后,开关中断就没什么问题了。


1.jpg
2.jpg
3.jpg
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2018-9-18 14:53:40 | 显示全部楼层
sanit 发表于 2018-6-8 11:50
深入理解一下:首先FreeRTOS中使用优先级分组设置为4,也就是说0-15抢占优先级,没有响应优先级。我串口设 ...

研究的很深啦,学习了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 03:22 , Processed in 0.050080 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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