OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 1988|回复: 9

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

[复制链接]

  离线 

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2018-1-3
在线时间
9 小时
发表于 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。至于原因还没有想明 ...
回复

使用道具 举报

  离线 

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2018-1-3
在线时间
9 小时
 楼主| 发表于 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

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

使用道具 举报

  离线 

7

主题

26

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  在线 

512

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

  离线 

7

主题

26

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2018-1-3
在线时间
9 小时
 楼主| 发表于 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 | 显示全部楼层
您好,看了您的解决方案,确实如此。但不知其中缘由,您能详细说明一下原因吗?
回复

使用道具 举报

  离线 

9

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

使用道具 举报

  离线 

9

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
金钱
398
注册时间
2015-11-28
在线时间
88 小时
发表于 2018-7-17 12:41:44 | 显示全部楼层
照你的方法做了还是解决不了。
[C] 纯文本查看 复制代码
//重定义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;
}


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

使用道具 举报

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

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-24 01:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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