OpenEdv-开源电子网

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

【急求】FreeRTOS下定时器中断里printf函数运行一次就卡死的问题

[复制链接]

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2018-1-3
在线时间
15 小时
发表于 2018-2-2 10:37:56 | 显示全部楼层 |阅读模式
10金钱
程序功能描述:                      学习正点原子出的《STM32F407_FreeRTOS开发手册V1.1.pdf》中的第四章《中断配置和临界段》一节                      例程实现的功能如下图:
                                                       K1}WTJPYU]3K(_B_9KBA`NR.png

自己的改动描述:
                  首先, 在配套例程的基础上,我自己把相关MCU的配置从标准库换成了HA库L。
                  两个定时器TIM3与TIM5初始化配置都验证过没有问题!!!
                  单独运行测试都没有问题!!!printf函数单独测试,包 括在OS系统任务中测试输出都没问题!!!!!
                  FreeRTOSConfig.h文件是从原子的配套例程里面直接拖过来用的,在OS的设置上跟原子哥的例程应该是一样的!!!!

那么问题来了:
                 !!!!!在定时器中断服务函数中,printf函数只能执行一次输出然后系统就卡死了!!!!!
                 查阅了好多地方,都找不到较好的解释。本人刚学RTOS,求大神们帮帮我。


                 为什么在定时器中断中调用printf函数进行字符串的输出,程序输出一次之后会卡死呢?
                在线等

最佳答案

查看完整内容[请看2#楼]

问题已经找到,我的程序里面,少了void SysTick_Handler(void)这个服务函数。一开始我在 FreeRTOSConfig.h 文件中用 #define xPortSysTickHandler SysTick_Handler 宏定义进行了声明,但是不知道为什么在定时器中断服务函数中printf只能运行一次。把printf函数改为LED闪烁就没有问题。现在在delay的C文件中重新定义了void SysTick_Handler(void)这个函数,把FreeRTOSConfig.h 文件中的宏定义注释掉,运行就OK。至于原因还没有想明 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2018-1-3
在线时间
15 小时
 楼主| 发表于 2018-2-2 10:37:57 | 显示全部楼层
问题已经找到,我的程序里面,少了void SysTick_Handler(void)这个服务函数。一开始我在 FreeRTOSConfig.h 文件中用
#define xPortSysTickHandler SysTick_Handler 宏定义进行了声明,但是不知道为什么在定时器中断服务函数中printf只能运行一次。把printf函数改为LED闪烁就没有问题。现在在delay的C文件中重新定义了void SysTick_Handler(void)这个函数,把FreeRTOSConfig.h 文件中的宏定义注释掉,运行就OK。至于原因还没有想明白。
回复

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2018-1-3
在线时间
15 小时
 楼主| 发表于 2018-2-2 10:38:28 | 显示全部楼层
大神们帮帮我呀!!!跪谢
回复

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2018-1-3
在线时间
15 小时
 楼主| 发表于 2018-2-2 10:38:51 | 显示全部楼层
在线等呀!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-2-3 01:34:59 | 显示全部楼层
帮顶
回复

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2018-1-3
在线时间
15 小时
 楼主| 发表于 2018-2-3 11:01:34 | 显示全部楼层

谢谢原子哥,问题已经找到了,一会单独描述一下。
回复

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2018-1-3
在线时间
15 小时
 楼主| 发表于 2018-2-3 11:02:22 | 显示全部楼层
275891381 发表于 2018-2-2 10:57
估计重入了吧,中断内用还是加锁吧,要么中断内发个信号,任务内打印

谢谢,问题已经找到了,跟滴答定时器中断服务有关系。我会在楼下详细描述。谢谢您的回答。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2018-5-15
在线时间
4 小时
发表于 2018-6-1 09:07:06 | 显示全部楼层
您好,看了您的解决方案,确实如此。但不知其中缘由,您能详细说明一下原因吗?
回复

使用道具 举报

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-11-28
在线时间
208 小时
发表于 2018-7-17 11:42:07 | 显示全部楼层
yijuanzhi 发表于 2018-2-2 10:37
问题已经找到,我的程序里面,少了void SysTick_Handler(void)这个服务函数。一开始我在 FreeRTOSConfig.h  ...

大神啊,能详细解释一下原理吗?不懂。我也需要这个问题不知道怎么处理。
回复

使用道具 举报

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-11-28
在线时间
208 小时
发表于 2018-7-17 12:41:44 | 显示全部楼层
照你的方法做了还是解决不了。[mw_shl_code=c,true]
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
//        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
//    USART1->DR = (u8) ch;      
//        return ch;
        while(HAL_UART_GetState(&UART1_Handler) == HAL_UART_STATE_BUSY_TX){}
                HAL_UART_Transmit(&UART1_Handler, (uint8_t *)&ch, 1, 100);
                 return ch;
}[/mw_shl_code]

把这个改了过后就OK了!
回复

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
发表于 2020-9-4 17:12:50 | 显示全部楼层
yconnor 发表于 2018-7-17 12:41
照你的方法做了还是解决不了。[mw_shl_code=c,true]
//重定义fputc函数
int fputc(int ch, FILE *f)

你这个是正解
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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