opsd999 发表于 2020-7-3 13:35:21

CUBEMX+freertos 串口快速发送和回复问题

我串口接收使用 HAL中断函数,每次接收一个字节,通过xQueueSendFromISR 存入创建好的队列中。 在FREERTOS 任务里 取出数据并做处理, 然后发现在10ms定时发送开始,出现了回复卡死的情况。之后移除freertos 直接在中断中做同样的处理,发现1ms 都不会出问题,想问问,这是什么问题。大家做这类项目,串口的处理方式都是怎么做的。

这是freertos中的情况,没多久就中断无反应,手动发送也无反应

这是裸机,直接串口中断中处理数据,1ms定时发送

eric2013 发表于 2020-7-3 17:12:38

改成1秒一次,接收任务优先级设置为最高,看看是否还有问题。方便排查是否是接收处理不及时导致消息队列已经满了。

opsd999 发表于 2020-7-4 09:41:54

eric2013 发表于 2020-7-3 17:12
改成1秒一次,接收任务优先级设置为最高,看看是否还有问题。方便排查是否是接收处理不及时导致消息队列已 ...

时间短不会有问题,我把 该任务的阻塞延时1ms改成了 任务切换taskYIELD 就好了,我说哪里怪怪的:dizzy:

opsd999 发表于 2020-7-4 15:49:33

eric2013 发表于 2020-7-3 17:12
改成1秒一次,接收任务优先级设置为最高,看看是否还有问题。方便排查是否是接收处理不及时导致消息队列已 ...

硬汉哥,我这个 内部AD三路dma采集有个问题,他dma存放的数据 经常会改变位置 这是怎么回事。
正常应该是 ADC_Value为 900多的 cpu温度采样,ADC_Value为3000左右,ADC_Value为4000左右
一开始还以为是和da的dma 冲突,关了DA的dma模式 还是这样。
adc的dma配置是 使能的扫描转换和 连续转换模式


void AD_Sampling_Function(void *argument)
{
        /*温度采集实验*/
        unsigned int adc_v;
        double adcx;
        double temp;
        /*三路dma采集实验*/
        uint32_t ADC_Value={0};

        for(;;)
        {

                HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Value,3);
                temp = (ADC_Value*3.3 /4096 -0.76)/0.0025+25;
                //temp = (adc_v*3.3 /4096 -0.76)/0.0025+25;
                printf("%d %d %d\n",ADC_Value,ADC_Value,ADC_Value);
//                printf("温度:%f,温度AD值:%d\n",temp,ADC_Value);
//                printf(" AD1 value = %1.3fV ,DA1(PA4)值:%d, AD2 value = %1.3fV,DA2(PA5)值:%d\r\n", ADC_Value*3.3f/4096,ADC_Value,ADC_Value*3.3f/4096,ADC_Value);
                HAL_ADC_Stop(&hadc1);

                osDelay(2);
        }
}

eric2013 发表于 2020-7-5 17:31:38

opsd999 发表于 2020-7-4 15:49
硬汉哥,我这个 内部AD三路dma采集有个问题,他dma存放的数据 经常会改变位置 这是怎么回事。
正常应该 ...

看看ADC初始化的时候,是不是将一些重要的结构体变量设置为局部变量了,而且没有对此局部变量做初始化。
页: [1]
查看完整版本: CUBEMX+freertos 串口快速发送和回复问题