[应用相关]

关于STM32F407 任务执行时间的问题

[复制链接]
1998|16
手机看帖
扫描二维码
随时随地手机跟帖
877049204|  楼主 | 2018-5-27 19:00 | 显示全部楼层 |阅读模式
有两个任务需要同时运行(裸机):
1、DAC产生100ms(10Hz)的扫描信号,实时性很强,目前放在主函数里延时100us,1000个点产生。
2、ADC采集,串口输出8个通道的数据,定时器TIM3中断采集输出,定时时间是500ms。
目前的问题是:在定时器中断函数里,串口输出数据的时候,占用了一段时间使扫描信号变形失真。
解决思路:1、扫描信号在TIM2中断函数里产生(定时时间100us),优先级大于TIM3中断;
2、串口传输数据通过DMA,减少传输时间
请假各位前辈们哪一种方法可行?
877049204|  楼主 | 2018-5-27 19:02 | 显示全部楼层
周末论坛人少,给自己顶一个,不要沉

使用特权

评论回复
xixi2017| | 2018-5-27 19:43 | 显示全部楼层
不要在中断里面干活。

使用特权

评论回复
评论
877049204 2018-5-28 08:39 回复TA
也想设个标志位,放在主函数中处理,但是个人觉得串口传输的话还是占用时间影响实时性强的任务1。我再实验一下看看效果,谢谢指导 
huzi2099| | 2018-5-27 21:06 | 显示全部楼层
你这个很简单的问题,“ADC采集,串口输出8个通道的数据,定时器TIM3中断采集输出,定时时间是500ms”
500ms是间隔,每次输出只能输出上一次转换好的数据,而不是当前数据,想清楚这点就行了

使用特权

评论回复
评论
huzi2099 2018-5-28 09:25 回复TA
@877049204 :多字节发送一般用中断处理就够了,如果传输速率高发送数据量很大才考虑dma,用dma来减少mcu的等待时间. 
877049204 2018-5-28 08:38 回复TA
是这样的,这点我理解,但是串口传输的话占用时间,用哪种方式比较好。谢谢指导 
zhuomuniao110| | 2018-5-27 23:13 | 显示全部楼层
2比较好。

使用特权

评论回复
评论
877049204 2018-5-28 08:40 回复TA
我都试一试比较下 
tkyl01| | 2018-5-28 09:00 | 显示全部楼层
费时的放在while(1) 中,其他的实时性要求高费时短的可以用定时中断完成

使用特权

评论回复
评论
877049204 2018-5-28 11:17 回复TA
谢谢指导! 
877049204|  楼主 | 2018-5-29 22:11 | 显示全部楼层
本帖最后由 877049204 于 2018-5-29 22:43 编辑

1、首先采用的是思路1中的方法:
采用定时器TIM4定时100us,优先级大于TIM3,可以解决这个问题。
在这里介绍一下中断优先级的相关知识,用到哪里学到哪里嘛。
以下内容转自网络各处,根据自己的理解而来,侵删,仅作参考。
CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32F4并没有使用CM4内核的全部东西,而是只用了它的一部分。STM32F40xx/STM32F41xx总共有92个中断,包括10个内核中断和82个可屏蔽中断,具有
16级可编程的中断优先级,而我们常用的就是这82个可屏蔽中断。
明确两个优先级的概念——抢占式优先级和响应优先级,举个例子
中断向量  抢占优先级  响应优先级
A                  0                  0
B                  1                   0
C                  1                   1
若内核正在执行 C 的中断服务函数,则它能被抢占优先级更高的中断 A 打断,由于 B 和 C 的抢占优先级相同,所以 C 不能被 B 打断。但如果 B 和 C 中断是同时到达的,内核就会首先响应响应优先级别更高的 B 中断。
对TIM3和TIM4两个定时器来说,希望TIM4的实时性强于TIM3,所以我们需要TIM4的抢占优先级更大,数字越小优先级越大。
设置中断优先级的步骤有:
第一步:设置优先级分组,使用库函数

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2 
关于分组,一共有四组:
#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                            4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                            3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                            2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                            1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                            0 bits for subpriority */
在这里
用第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第二步:设置优先级,TIM3抢占优先级2低于TIM4抢占优先级1
        NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //¶¨Ê±Æ÷3ÖжÏ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //ÇÀÕ¼ÓÅÏȼ¶2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //×ÓÓÅÏȼ¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       

        NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn; //¶¨Ê±Æ÷3ÖжÏ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //ÇÀÕ¼ÓÅÏȼ¶1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //×ÓÓÅÏȼ¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);




使用特权

评论回复
ayb_ice| | 2018-5-30 10:53 | 显示全部楼层
DAC用DMA控制,完全不占用CPU时间

使用特权

评论回复
评论
ayb_ice 2018-6-1 13:04 回复TA
@877049204 :周期性的信号更好,DMA可以自动循环,都説了,完全可以不占用CPU时间 
877049204 2018-6-1 11:08 回复TA
前辈说的对,但是想让DAC产生周期性的扫描信号,类似三角波,也需要周期性的从数组取数,这一部分占用CPU时间。 
CaLipton| | 2018-5-30 21:00 | 显示全部楼层
发送数据量大才考虑dma

使用特权

评论回复
评论
877049204 2018-6-1 11:08 回复TA
嗯嗯,确实是这样,谢谢指导 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

158

主题

1836

帖子

20

粉丝