硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1511|回复: 16
收起左侧

[RTOS] RTOS定时采集的问题

[复制链接]

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
发表于 2024-10-10 19:24:42 | 显示全部楼层 |阅读模式
就是我用RTOS 采集然后打印出来,想看一下这个采集数据的时间是不是可以精确定时采集。
就这一个任务。就是我看串口打印出来的时候应该是一秒都能打印了十次左右,我想知道是为啥呢?



void myTask1( void * arg)
{
        TickType_t previousWakeTime = xTaskGetTickCount();
                while(1)
                {
                        HAL_ADC_Start_DMA(&hadc3,g_adc3_dma_data2,ADC_DATA_LENGTH1);//ADC的dma开始采集
                        if( g_adc3_dma_complete_flag1 == 1 )//采集数据完成,采集完成后再发送 111
                                        {
                                                for(int i=0;i<ADC_DATA_LENGTH1;i++)
                                                {                               
                                                        printf("%d\r\n",g_adc3_dma_data2&0x0000ffff);
                                                }
                                        g_adc3_dma_complete_flag1 = 0;       
                                        memset(g_adc3_dma_data2,0,ADC_DATA_LENGTH1);//清除数据       
                                       
                                        }                       
                                }
                vTaskDelayUntil(&previousWakeTime,pdMS_TO_TICKS(2000));                       
       
}
这是RTOS的配置

#define configUSE_PREEMPTION                                        1
#define configTICK_RATE_HZ                                                ( 1000 )
#define configUSE_PORT_OPTIMISED_TASK_SELECTION        1
#define configUSE_QUEUE_SETS                                        1
#define configUSE_IDLE_HOOK                                                0
#define configUSE_TICK_HOOK                                                0
#define configCPU_CLOCK_HZ                                                SystemCoreClock
#define configMAX_PRIORITIES                                        ( 5 )
#define configMINIMAL_STACK_SIZE                                ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE                                        ( ( size_t ) ( 16 * 1024 ) )
#define configMAX_TASK_NAME_LEN                                        ( 10 )
#define configUSE_TRACE_FACILITY                                1
#define configUSE_16_BIT_TICKS                                        0
#define configIDLE_SHOULD_YIELD                                        1
#define configUSE_MUTEXES                                                1
#define configUSE_RECURSIVE_MUTEXES                                1
#define configUSE_COUNTING_SEMAPHORES                        1
#define configUSE_TICKLESS_IDLE                                        0
#define configCHECK_FOR_STACK_OVERFLOW          0
#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY             1

/* Run time stats gathering definitions. */
#define configGENERATE_RUN_TIME_STATS                        1
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
#define portGET_RUN_TIME_COUNTER_VALUE()                0



回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2024-10-11 05:20:39 | 显示全部楼层
你这是vTaskDelay写while loop外面了?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-11 09:05:14 | 显示全部楼层
1、你设置的这个Delay,设置的多久执行一次。
2、这个任务里面其它都注释掉,看下你的这个Delay,实际多久执行一次
回复

使用道具 举报

3

主题

432

回帖

441

积分

高级会员

积分
441
发表于 2024-10-11 15:42:05 | 显示全部楼层
本帖最后由 glory 于 2024-10-11 15:43 编辑

写RTOS程序,要换一种思维模式。你把RTOS看成一种服务:它根据事件优先级调度与该事件相关联的代码流程,当流程执行完毕可以再次等待下一个事件或者删除线程。
你只要在定时器中断或者其它硬件中断内,发送信号给这个事件就行。
上面的事件可以是任何RTOS内核对象,如信号量、互斥量、事件标志、邮箱、队列等等。应用中的所有功能都能设计为这样“基于事件”的模型。这样的RTOS系统扩展性,稳定性都很优秀。
像你这个应用,明显设计有问题。
回复

使用道具 举报

102

主题

576

回帖

897

积分

金牌会员

积分
897
QQ
发表于 2024-10-11 16:38:34 | 显示全部楼层
沙发说的是对的。你这个delay写在while外面了。
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
 楼主| 发表于 2024-10-12 08:27:14 | 显示全部楼层
会飞的猪_2020 发表于 2024-10-11 16:38
沙发说的是对的。你这个delay写在while外面了。

谢谢
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
 楼主| 发表于 2024-10-12 08:27:40 | 显示全部楼层
zexalistic 发表于 2024-10-11 05:20
你这是vTaskDelay写while loop外面了?

谢谢
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
 楼主| 发表于 2024-10-12 08:30:01 | 显示全部楼层
glory 发表于 2024-10-11 15:42
写RTOS程序,要换一种思维模式。你把RTOS看成一种服务:它根据事件优先级调度与该事件相关联的代码流程,当 ...

嗯嗯 还得多下功夫
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
 楼主| 发表于 2024-10-12 08:31:41 | 显示全部楼层
eric2013 发表于 2024-10-11 09:05
1、你设置的这个Delay,设置的多久执行一次。
2、这个任务里面其它都注释掉,看下你的这个Delay,实际多久 ...

就是我现在有个问题,串口打印,波特率2000000,但是我Vtaskdelayuntil为10ms 1ms的时候打印出来都是1024个点,但是我增加到500ms的时候就打印一半了,请问是为什么?ADC的采样率我设置的最高8.3M
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-12 08:49:48 | 显示全部楼层
不吃鱼的猫大人 发表于 2024-10-12 08:31
就是我现在有个问题,串口打印,波特率2000000,但是我Vtaskdelayuntil为10ms 1ms的时候打印出来都是1024 ...

波特率2000000, 每秒是200KB/S(8bit数据,1个停止位,1个起始位),1ms就是200字节。然后打印1个点需要多少字节,%d是输出一次是多个字符。

然后根据你这个描述”1ms的时候打印出来都是1024个点,但是我增加到500ms的时候就打印一半了“
能对应上不,我没太看懂你这个描述。
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
 楼主| 发表于 2024-10-13 16:49:35 | 显示全部楼层
eric2013 发表于 2024-10-12 08:49
波特率2000000, 每秒是200KB/S(8bit数据,1个停止位,1个起始位),1ms就是200字节。然后打印1个点需要多 ...

就是我的数组是uint8_t[1024];然后我的任务就是采集+打印,当我设置vTaskDelayUntil(10)的时候,在串口助手发现数据都可以打印出来,但是当我改成vTaskDelayUntil(500)的时候,好像只打印了512个数据,我不知道这个是啥原因,按理说我这个时间间隔大了,不更应该全部打印出来吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-14 09:31:52 | 显示全部楼层
不吃鱼的猫大人 发表于 2024-10-13 16:49
就是我的数组是uint8_t[1024];然后我的任务就是采集+打印,当我设置vTaskDelayUntil(10)的时候,在串 ...

我这个测试了没,测试了告诉我下


1、你设置的这个Delay,设置的多久执行一次。
2、这个任务里面其它都注释掉,看下你的这个Delay,实际多久执行一次
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
 楼主| 发表于 2024-10-14 16:15:09 | 显示全部楼层
eric2013 发表于 2024-10-14 09:31
我这个测试了没,测试了告诉我下

我用仿真测试了一下,然后用串口打印模拟了一下2s,1s,500ms都是准确的,仿真全部注释掉以后的是第一张图
4.png 2s串口打印.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-15 09:23:27 | 显示全部楼层
不吃鱼的猫大人 发表于 2024-10-14 16:15
我用仿真测试了一下,然后用串口打印模拟了一下2s,1s,500ms都是准确的,仿真全部注释掉以后的是第一张 ...

你的时间基准设置的多少,是1ms不。

pMS_TO_TICKS,  100对应的时间是多少
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
 楼主| 发表于 2024-10-16 10:33:10 | 显示全部楼层
eric2013 发表于 2024-10-15 09:23
你的时间基准设置的多少,是1ms不。

pMS_TO_TICKS,  100对应的时间是多少

是1ms,pms_to_ticks(100)是100ms
回复

使用道具 举报

4

主题

126

回帖

138

积分

初级会员

积分
138
发表于 2024-10-16 12:05:13 | 显示全部楼层
不吃鱼的猫大人 发表于 2024-10-16 10:33
是1ms,pms_to_ticks(100)是100ms

你这个写法在RTOS下都不应该,通常 采集、处理、输出应该使用任务分离,而不是在一个大循环里面。
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
 楼主| 发表于 2024-10-16 12:09:23 | 显示全部楼层
turnip 发表于 2024-10-16 12:05
你这个写法在RTOS下都不应该,通常 采集、处理、输出应该使用任务分离,而不是在一个大循环里面。

嗯对,就是我本来是想着把采集和打印放在一起看看效果,因为处理的任务还没写好
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 18:25 , Processed in 0.050954 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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