OpenEdv-开源电子网

标题: 关于FreeRTOS卡在延时函数里的问题 [打印本页]

作者: fei140115    时间: 2022-8-8 23:53
标题: 关于FreeRTOS卡在延时函数里的问题
本帖最后由 fei140115 于 2022-8-8 23:55 编辑

程序在进入延时函数之前都正常运行,但是一进入延时函数就在图一红框处出不来。

图一

(, 下载次数: 0)
图二
(, 下载次数: 0)
图二箭头所指的地方就是有延时函数的函数,上面的代码里没有延时函数。

板子跑带有延时函数的FreeRTOS例程没有问题,但是跑我自己的代码就会死在图一红框处,有类似经历的朋友们分享分享经验,万分感谢!

附上问题工程


作者: huanan    时间: 2022-8-9 09:42
代码下载进去可以正常运行的吗?调试是会这样的
作者: fei140115    时间: 2022-8-9 09:50
huanan 发表于 2022-8-9 09:42
代码下载进去可以正常运行的吗?调试是会这样的

可以跑,但是跑起来和跑调试一样的,都是执行到有延时函数的地方执行不下去了
作者: LcwSwust    时间: 2022-8-9 10:48
要不试一下在延时函数的循环里面将tnow、told的值用串口发出来?看定时器是否在运行。
作者: wxTB99A9f0    时间: 2022-8-9 11:03
是不是systick定时器没有初始化
作者: adlu    时间: 2022-8-9 11:30
esp_8266_init() --> delay_ms(2000) --> delay_us((u32)(nms*1000)) --> delay_us((u32)(2000*1000))
(, 下载次数: 0)


根据当前的delay_init()的配置,SysTick的重载值是72000,也就是1ms时长。
现在调用的delay_ms(2000)-->delay_us((2000*1000))大大超过了重载值。我不确定跟这个有没有关系。

可以这样测试,看看还会不会卡死:
1.把esp_8266_init()调用的delay_ms(2000)改为delay_us(200),注意不是delay_ms(200)。
或者
2.把delay_init()中断SysTick->LOAD=reload;改为SysTick->LOAD=0xFFFFFFFF。


作者: fei140115    时间: 2022-8-10 09:52
wxTB99A9f0 发表于 2022-8-9 11:03
是不是systick定时器没有初始化

初始化了
作者: fei140115    时间: 2022-8-10 09:53
adlu 发表于 2022-8-9 11:30
esp_8266_init() --> delay_ms(2000) --> delay_us((u32)(nms*1000)) --> delay_us((u32)(2000*1000))


...

问题其实是出在了串口打印上,我把串口1改成串口3就行了,但是为什么用不了,我也不清楚,串口1的初始化都是按照例程上初始化的
作者: adlu    时间: 2022-8-10 16:05
fei140115 发表于 2022-8-10 09:53
问题其实是出在了串口打印上,我把串口1改成串口3就行了,但是为什么用不了,我也不清楚,串口1的初始化 ...

如果是这样,那么你在1楼的描述可能不准确。
描述是,进入delay_us()函数之后,卡死在红框处,出不来。这部分和串口并没有关系。
所以,我觉得还没有定位到原因




欢迎光临 OpenEdv-开源电子网 (http://www.openedv.com:80/) Powered by Discuz! X3.4